我有一个包含12页内容的PDF。我有另一个PDF(只有1页),这是图形模板。
PDF(内容和模板)都是
A4尺寸,水平方向
.
对于内容PDF的每个页面,我需要应用相同的模板作为背景
这是我迄今为止编写的代码(我的代码
started from here
),但我无法检索模板页面并将其应用于每个页面。
public static void main(String[] args) throws IOException, DocumentException {
File pdfContent = new File("content.pdf");
File pdfTemplate = new File("template.pdf");
File output = new File("pdf_output.pdf");
if (output.exists()) {
output.delete();
}
PdfReader contentReader = new PdfReader(new FileInputStream(pdfContent));
PdfStamper stamper = new PdfStamper(contentReader, new FileOutputStream(output));
for (int i = 1; i <= contentReader.getNumberOfPages(); i++) {
PdfContentByte contentPage = stamper.getUnderContent(i);
PdfReader templateReader = new PdfReader(new FileInputStream(pdfTemplate));
PdfImportedPage templatePage = stamper.getImportedPage(templateReader, 1);
contentPage.addTemplate(templatePage, 0, 0);
templateReader.close();
}
stamper.getWriter().freeReader(contentReader);
contentReader.close();
}
此代码正常工作,结束时没有任何错误,但生成的PDF已损坏,无法显示。
PdfStamper是获得我想要的结果的正确方法吗?
如何正确使用该库以获得结果?
根据@mkl回复编辑
PdfReader contentReader = new PdfReader(new FileInputStream(pdfContent));
PdfStamper stamper = new PdfStamper(contentReader, new FileOutputStream(output));
PdfReader templateReader = new PdfReader(new FileInputStream(pdfTemplate));
PdfImportedPage templatePage = stamper.getImportedPage(templateReader, 1);
templateReader.close();
for (int i = 1; i <= contentReader.getNumberOfPages(); i++) {
PdfContentByte contentPage = stamper.getUnderContent(i);
contentPage.addTemplate(templatePage, 0, 0);
}
stamper.close();
contentReader.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)