使用Java中的itext库为合并的pdf创建索引文件(TOC)

我正在使用iText 来创建 。我需要在本文档的开头创建一个

(不是书签),并带有指向每个源PDF的第一页的可单击链接。

Document PDFJoinInJava = new Document();

PdfCopy PDFCombiner = new PdfCopy(PDFJoinInJava, outputStream);

PdfCopy.PageStamp stamp;

PDFJoinInJava.open();

PdfReader ReadInputPDF;

List<InputStream> pdfs = streamOfPDFFiles;

List<PdfReader> readers = new ArrayList<PdfReader>();

int totalPages = 0;

Iterator<InputStream> iteratorPDFs = pdfs.iterator();

for (; iteratorPDFs.hasNext(); pdfCounter++) {

InputStream pdf = iteratorPDFs.next();

PdfReader pdfReader = new PdfReader(pdf);

readers.add(pdfReader);

totalPages += pdfReader.getNumberOfPages();

pdf.close();

}

int number_of_pages;

int currentPageNumber = 0;

int pageOfCurrentReaderPDF = 0;

Iterator<PdfReader> iteratorPDFReader = readers.iterator();

PdfImportedPage page;

// Loop through the PDF files and add to the output.

int count = 1;

while (iteratorPDFReader.hasNext()) {

PdfReader pdfReader = iteratorPDFReader.next();

count++;

number_of_pages = pdfReader.getNumberOfPages();

// Create a new page in the target for each source page.

for (int pageNum = 0; pageNum < number_of_pages;) {

currentPageNumber++;

pageOfCurrentReaderPDF++;

page = PDFCombiner.getImportedPage(pdfReader, ++pageNum);

ColumnText.showTextAligned(stamp.getUnderContent(),

Element.ALIGN_RIGHT, new Phrase(String

.format("%d", currentPageNumber),new Font(FontFamily.TIMES_ROMAN,3)),

50, 50, 0);

stamp.alterContents();

PDFCombiner.addPage(page);

}

}

PDFJoinInJava.close();

回答:

您在要求一些琐碎的事情,但事实并非如此。请看一下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);

在我的示例中,我假设TOC可以放在单个页面上。y如果值小于底部边距,则必须跟踪该值并创建一个新页面。

如果希望将TOC作为第一页,则需要在第二步中对页面进行重新排序。这在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();

以上是 使用Java中的itext库为合并的pdf创建索引文件(TOC) 的全部内容, 来源链接: utcz.com/qa/407542.html

回到顶部