【发布时间】:2015-04-22 22:01:16
【问题描述】:
我需要在 PDF 中创建目录。它可以是 1 页或多页,具体取决于 PDF 中的页数。我了解到可以使用PdfStamper、PdfAction、PdfAnnotaion 来实现。
我目前正在合并多个文档,并为 JAVA 中的所有文档创建书签和目录。我已经摆脱了书签,但卡在了多页目录中。
另外,请解释这行代码 - link = new PdfAnnotation(copy, 36, ct.getYLine(), 559, y, action);... 我的理解是您传递的是单击链接(,36,ct.getYLine(),559,y,)后它将在页面上的矩形..因此我面临一个问题,即单击链接,如果页面大小与 US Letter Portrait 不同。
这里是sn-p-
int tocPages = 1;
Document tocDocument = new Document();
String tocFilename ="toc-filename";
Phrase tocPhrase =
new Phrase("Table of Contents", new Font(Font.FontFamily.HELVETICA, 20, Font.BOLD, BaseColor.BLACK));
PdfWriter writer = PdfWriter.getInstance(tocDocument, new FileOutputStream(tocFilename));
tocDocument.open();
tocDocument.add(new Paragraph(tocPhrase));
PdfReader reader = new PdfReader(tocFilename);
page = copy.getImportedPage(reader, tocPages);
stamp = copy.createPageStamp(page);
float y = 770;
ColumnText ct = new ColumnText(stamp.getOverContent());
ct.setSimpleColumn(36, 36, 559, y);
for (Map.Entry<Integer, String> entry : toc.entrySet()) {
if (y <= 20) {
copy.addPage(page);
copy.newPage(); //(tried with writer.newPage() and tocDocument.newPage(), not working )
page = copy.getImportedPage(reader, ++tocPages);
}
p = new Paragraph(entry.getValue());
p.add(new Chunk(new DottedLineSeparator()));
p.add(String.valueOf(entry.getKey() + 1));
ct.addElement(p);
ct.go();
action = PdfAction.gotoLocalPage("p" + entry.getKey(), false);
link = new PdfAnnotation(copy, 36, ct.getYLine(), 559, y, action);
stamp.addAnnotation(link);
y = ct.getYLine();
}
ct.go();
stamp.alterContents();
copy.addPage(page);
tocDocument.close();
reader.close();
com.itextpdf.text.exceptions.InvalidPdfException:未找到 PDF 标头签名。 在 com.itextpdf.text.pdf.PRTokeniser.getHeaderOffset(PRTokeniser.java:227) 在 com.itextpdf.text.pdf.PdfReader.getOffsetTokeniser(PdfReader.java:442) 在 com.itextpdf.text.pdf.PdfReader.(PdfReader.java:176) 在 com.itextpdf.text.pdf.PdfReader.(PdfReader.java:219) 在 com.itextpdf.text.pdf.PdfReader.(PdfReader.java:207) 在 com.itextpdf.text.pdf.PdfReader.(PdfReader.java:197)
行异常 - PdfReader reader = new PdfReader(tocFilename);
【问题讨论】:
-
有一个例子回答了重复的问题Create Index File(TOC) for merged pdf using itext library in java。您还应该解释更多有关该过程的信息。您是否也需要创建一个大纲树(又名书签)。您参考
PdfStamper,但不清楚如果您从头开始创建文档,为什么需要它。如果您想要一个准确的答案,请说明。 -
让我重复一遍:如果您希望得到这个问题的答案,请说明您已经在做什么:您是从头开始创建文档吗?您是否尝试为现有文档创建目录(如果有,是否有书签)?你在合并文件吗?你是用 Java 还是 C# 编写代码?
-
请将您的评论表述为一个真实的问题,提供足够的上下文,以便人们知道您的问题是关于什么的。
-
你的问题不是独立的。我已经为其他人提供了必要的上下文来理解我的回答中的问题。
标签: itext