【发布时间】:2018-01-06 08:14:40
【问题描述】:
我有一个包含 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 e。
调用 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)
【问题讨论】: