你要求的东西本来应该是微不足道的,但事实并非如此。请看一下与目录合并 http://itextpdf.com/sandbox/merge/MergeWithToc例子。您将看到合并 PDF 的代码是正确的,但在我的示例中,我添加了一项额外功能:
chunk = new Chunk(String.format("Page %d", pageNo));
if (i == 1)
chunk.setLocalDestination("p" + pageNo);
ColumnText.showTextAligned(stamp.getUnderContent(),
Element.ALIGN_RIGHT, new Phrase(chunk), 559, 810, 0);
对于每个第一页,我定义一个指定目的地作为当地目的地。我们用p
后面加上页码作为其名称。
我们将在一个额外的页面中使用这些命名的目的地,该页面将用作目录:
PdfReader reader = new PdfReader(SRC3);
page = copy.getImportedPage(reader, 1);
stamp = copy.createPageStamp(page);
Paragraph p;
PdfAction action;
PdfAnnotation link;
float y = 770;
ColumnText ct = new ColumnText(stamp.getOverContent());
ct.setSimpleColumn(36, 36, 559, y);
for (Map.Entry<Integer, String> entry : toc.entrySet()) {
p = new Paragraph(entry.getValue());
p.add(new Chunk(new DottedLineSeparator()));
p.add(String.valueOf(entry.getKey()));
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);
在我的示例中,我假设目录适合单个页面。你必须跟踪y
值,如果其值低于下边距,则创建一个新页面。
如果您希望目录成为第一页,则需要重新排序页面。这显示在与Toc2合并 http://itextpdf.com/sandbox/merge/MergeWithToc2例子:
reader = new PdfReader(baos.toByteArray());
n = reader.getNumberOfPages();
reader.selectPages(String.format("%d, 1-%d", n, n-1));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename));
stamper.close();