Java itext 5.5.7包含页眉和页脚的带标签PDF的阅读顺序不正确
在itext 5.5.7中,我发现包含页眉和页脚的带标签PDF的阅读顺序不正确 包含页眉和页脚的标记PDF具有以下结构: 文件 页面内容 标题 页脚 然后用同样的顺序读 不正确:标记顺序应为页眉/页面内容/页脚 资料来源:Java itext 5.5.7包含页眉和页脚的带标签PDF的阅读顺序不正确,java,pdf-generation,itext,Java,Pdf Generation,Itext,在itext 5.5.7中,我发现包含页眉和页脚的带标签PDF的阅读顺序不正确 包含页眉和页脚的标记PDF具有以下结构: 文件 页面内容 标题 页脚 然后用同样的顺序读 不正确:标记顺序应为页眉/页面内容/页脚 资料来源: package pdf; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import java.io.FileNotFoundException; import java.i
package pdf;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.List;
import java.util.ArrayList;
import java.util.Random;
public class ReportPdf {
private Random random = new Random();
private Font font = new Font(Font.FontFamily.COURIER, 11);
public static void main(String[] args) {
ReportPdf report = new ReportPdf();
try {
String fileName = "report.pdf";
report.generatePdf(fileName);
} catch (FileNotFoundException e) {
System.err.println(e);
} catch (DocumentException e) {
System.err.println(e);
}
}
private void generatePdf(String fileName) throws DocumentException, FileNotFoundException {
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
writer.setPdfVersion(PdfWriter.VERSION_1_7);
writer.setViewerPreferences(PdfWriter.DisplayDocTitle);
writer.setTagged();
writer.createXmpMetadata();
document.setMargins(10, 10, 60, 10);
document.open();
final PdfPageHeader header = new PdfPageHeader(writer, 10) {
public PdfPTable createTable(int pageNumber, Image total) {
PdfPTable table = new PdfPTable(3);
table.setTotalWidth(500);
table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
table.addCell(new Phrase("Header"));
table.addCell(new Phrase(String.format("Page %d of ", pageNumber)));
PdfPCell pageTotal = new PdfPCell(total);
pageTotal.setBorder(Rectangle.NO_BORDER);
table.addCell(pageTotal);
return table;
}
};
writer.setPageEvent(header);
document.add(createContent());
document.close();
}
private PdfPTable createContent() {
PdfPTable table = new PdfPTable(4);
table.setHeaderRows(1);
table.setWidthPercentage(100f);
for (int i = 1; i <= 4; i++) {
table.addCell(new PdfPCell(new Phrase("#" + i)));
}
for (int i = 0; i < 200; i++) {
fillRow(table);
}
return table;
}
private void fillRow(PdfPTable table) {
for (int j = 0; j < 3; j++) {
Phrase phrase = new Phrase(String.valueOf(random.nextInt()), font);
PdfPCell cell = new PdfPCell(phrase);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setVerticalAlignment(Element.ALIGN_CENTER);
table.addCell(cell);
}
}
public abstract class PdfPageHeader extends PdfPageEventHelper {
private final float marginTop;
private List<PdfTemplate> templates = new ArrayList<PdfTemplate>();
public PdfPageHeader(final PdfWriter writer, final float marginTop) {
this.marginTop = marginTop;
}
public void onEndPage(final PdfWriter writer, final Document document) {
Rectangle rect = document.getPageSize();
PdfTemplate template = writer.getDirectContent().createTemplate(20, 16);
Image total = null;
try {
total = Image.getInstance(template);
} catch (BadElementException e) {
e.printStackTrace();
}
total.setAccessibleAttribute(PdfName.ALT, new PdfString("Total"));
templates.add(template);
PdfPTable table = createTable(writer.getPageNumber(), total);
if (table != null) {
PdfPTableHeader header = new PdfPTableHeader();
PdfPTableBody tbody = table.getBody();
PdfContentByte canvas = writer.getDirectContent();
PdfContentByte[] canvases = new PdfContentByte[]{canvas,
canvas.getDuplicate(), canvas.getDuplicate(),
canvas.getDuplicate()};
canvases[PdfPTable.TEXTCANVAS].openMCBlock(table);
canvases[PdfPTable.TEXTCANVAS].openMCBlock(header);
canvases[PdfPTable.TEXTCANVAS].closeMCBlock(header);
canvases[PdfPTable.TEXTCANVAS].openMCBlock(tbody);
table.writeSelectedRows(0, -1, document.leftMargin(),
rect.getTop(marginTop), writer.getDirectContent());
canvases[PdfPTable.TEXTCANVAS].closeMCBlock(tbody);
canvases[PdfPTable.TEXTCANVAS].closeMCBlock(table);
}
}
public void onCloseDocument(final PdfWriter writer, final Document document) {
Font font = new Font(Font.FontFamily.COURIER, 15);
Phrase phrase = new Phrase(String.valueOf(writer.getPageNumber() - 1), font);
for (PdfTemplate template : templates) {
ColumnText.showTextAligned(template, Element.ALIGN_LEFT, phrase, 2, 2, 0);
}
}
public abstract PdfPTable createTable(final int pageNumber, final Image total);
}
}
package-pdf;
导入com.itextpdf.text.*;
导入com.itextpdf.text.pdf.*;
导入java.io.FileNotFoundException;
导入java.io.FileOutputStream;
导入java.util.List;
导入java.util.ArrayList;
导入java.util.Random;
公共课堂报告PDF{
私有随机=新随机();
私有字体Font=新字体(Font.FontFamily.COURIER,11);
公共静态void main(字符串[]args){
ReportPdf report=新的ReportPdf();
试一试{
String fileName=“report.pdf”;
report.generatePdf(文件名);
}catch(filenotfounde异常){
系统错误println(e);
}捕获(文档异常){
系统错误println(e);
}
}
私有void generatePdf(字符串文件名)引发DocumentException、FileNotFoundException{
文件=新文件(页面大小为A4);
PdfWriter writer=PdfWriter.getInstance(文档,新文件输出流(文件名));
writer.setPdfVersion(PdfWriter.VERSION_1_7);
writer.setViewerPreferences(PdfWriter.DisplayDocTitle);
writer.settaged();
writer.createXmpMetadata();
文件。设置页边距(10,10,60,10);
document.open();
最终PdfPageHeader=新的PdfPageHeader(writer,10){
公共PdfPTable createTable(整数页码,图像总数){
PdfPTable=新的PdfPTable(3);
表2.setTotalWidth(500);
table.getDefaultCell().setBorder(矩形,无边框);
表.addCell(新短语(“标题”);
table.addCell(新短语(String.format(“第%d页,共页”),页码));
PdfPCell pageTotal=新的PdfPCell(总计);
pageTotal.SetBeOrder(矩形,无边框);
表.addCell(总页数);
返回表;
}
};
writer.setPageEvent(标题);
document.add(createContent());
document.close();
}
私有PdfPTable createContent(){
PdfPTable=新的PdfPTable(4);
表2.setHeaderRows(1);
表1.设置宽度百分比(100f);
对于(int i=1;i