gpt4 book ai didi

java - iTextPDF : Superimpose static template to all pages of a PDF

转载 作者:行者123 更新时间:2023-12-02 02:23:31 26 4
gpt4 key购买 nike

我有一个包含 12 页内容的 PDF。我有另一个 PDF(只有 1 页),它是图形模板。

PDF(内容和模板)均为A4 尺寸,水平方向

对于 PDF 内容的每一页,我需要应用相同的模板作为背景

这是我迄今为止编写的代码(我的代码 started from here ),但我无法检索模板页面并将其应用到每个页面。

public static void main(String[] args) throws IOException, DocumentException {
// PDF with contents (12 pages)
File pdfContent = new File("content.pdf");

// PDF with template (1 page only)
File pdfTemplate = new File("template.pdf");

// Where to save the output file
File output = new File("pdf_output.pdf");
if (output.exists()) {
output.delete();
}

// Opening reader on content PDF and creating stamper
PdfReader contentReader = new PdfReader(new FileInputStream(pdfContent));
PdfStamper stamper = new PdfStamper(contentReader, new FileOutputStream(output));

// Looping through pages
for (int i = 1; i <= contentReader.getNumberOfPages(); i++) {
// Retrieve content page where to apply template
PdfContentByte contentPage = stamper.getUnderContent(i);

// Opening template pdf
PdfReader templateReader = new PdfReader(new FileInputStream(pdfTemplate));

// Retrieve first page of template pdf (will be applied to content)
PdfImportedPage templatePage = stamper.getImportedPage(templateReader, 1);

// Apply template to PDF content
contentPage.addTemplate(templatePage, 0, 0);

// Closing reader
templateReader.close();
}

stamper.getWriter().freeReader(contentReader);
contentReader.close();

// FIXME calling it throws java.lang.IllegalStateException: Already closed
// stamper.close();
}

此代码有效,结束时没有任何错误,但生成的 PDF 已损坏且无法显示。

PdfStamper 是获得我正在寻找的结果的正确方法吗?

如何正确使用该库才能获得结果?

<小时/>

根据@mkl回复进行编辑

// Opening reader on content PDF and creating stamper
PdfReader contentReader = new PdfReader(new FileInputStream(pdfContent));
PdfStamper stamper = new PdfStamper(contentReader, new FileOutputStream(output));

// Opening template pdf
PdfReader templateReader = new PdfReader(new FileInputStream(pdfTemplate));
PdfImportedPage templatePage = stamper.getImportedPage(templateReader, 1);
templateReader.close();

// Looping through pages
for (int i = 1; i <= contentReader.getNumberOfPages(); i++) {
// Retrieve content page where to apply template
PdfContentByte contentPage = stamper.getUnderContent(i);

// Apply template to PDF content
contentPage.addTemplate(templatePage, 0, 0);
}

stamper.close();
contentReader.close();

在此编辑中,我在末尾使用 stamper.close() 阅读了一次 PDF 模板。调用 stamper.close() 时出现此异常

Exception in thread "main" java.lang.IllegalStateException: Already closed
at com.itextpdf.text.io.ArrayRandomAccessSource.get(ArrayRandomAccessSource.java:64)
at com.itextpdf.text.io.IndependentRandomAccessSource.get(IndependentRandomAccessSource.java:77)
at com.itextpdf.text.pdf.RandomAccessFileOrArray.read(RandomAccessFileOrArray.java:225)
at com.itextpdf.text.pdf.RandomAccessFileOrArray.readFully(RandomAccessFileOrArray.java:247)
at com.itextpdf.text.pdf.RandomAccessFileOrArray.readFully(RandomAccessFileOrArray.java:241)
at com.itextpdf.text.pdf.PdfReader.getStreamBytesRaw(PdfReader.java:2665)
at com.itextpdf.text.pdf.PdfReader.getStreamBytes(PdfReader.java:2631)
at com.itextpdf.text.pdf.PdfReader.getPageContent(PdfReader.java:2385)
at com.itextpdf.text.pdf.PdfReaderInstance.getFormXObject(PdfReaderInstance.java:125)
at com.itextpdf.text.pdf.PdfImportedPage.getFormXObject(PdfImportedPage.java:136)
at com.itextpdf.text.pdf.PdfReaderInstance.writeAllPages(PdfReaderInstance.java:172)
at com.itextpdf.text.pdf.PdfWriter.addSharedObjectsToBody(PdfWriter.java:1368)
at com.itextpdf.text.pdf.PdfStamperImp.close(PdfStamperImp.java:280)
at com.itextpdf.text.pdf.PdfStamper.close(PdfStamper.java:230)

最佳答案

不要这样做

stamper.getWriter().freeReader(contentReader);
contentReader.close();

这将关闭压模所基于的阅读器以及压模在关闭时所需的信息。

但是

stamper.close();

在此期间,压模器最终确定 PDF 文档,并向其添加对象交叉引用信息。

此后您可以而且应该关闭阅读器

contentReader.close();

也就是说,您应该仅导入模板页面一次,然后重复使用 PdfImportedPage templatePage

<小时/>

编辑问题后:

请在关闭压模之前关闭模板 pdf 阅读器。 IE。移动线

templateReader.close();

之后

stamper.close();

关于java - iTextPDF : Superimpose static template to all pages of a PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48125507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com