如我对Extract pdf page and insert into existing pdf的回答所述,使用PdfStamper只是满足您要求的一种方法.如果您需要处理单个PDF文档,并且我可以像以前的回答所示,可以从另一个PDF添加单个页面,则PdfStamper可能是您的最佳选择.
但是,您现在指出必须串联多个PDF文件.在这种情况下,使用PdfStamper并不是最佳选择.您应该考虑切换到PdfCopy:
假设您具有以下文件.
String[] paths = new String[]{
"resources/to_be_inserted_1.pdf",
"resources/to_be_inserted_2.pdf",
"resources/to_be_inserted_3.pdf"
};
您需要在路径为“ resources / main_document.pdf”的现有PDF的开头插入每个文档的第一页(并且只有第一页),然后您可以执行以下操作:
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(dest));
document.open();
PdfReader reader;
for (String path : paths) {
reader = new PdfReader(path);
copy.addPage(copy.getImportedPage(reader, 1));
reader.close();
}
reader = new PdfReader("resources/main_document.pdf");
copy.addDocument(reader);
reader.close();
document.close();
如您所见,addPage()方法添加单个页面,而addDocument()方法添加文档的所有页面.
更新
似乎您不想插入新页面,但是想要叠加页面:您想在现有内容之上或之下添加页面.
在那种情况下,您确实需要PdfStamper,但是您犯了两个关键错误.
>关闭回路中的压模.压模关闭后,便关闭了:您无法向其添加任何其他内容.您需要将stamper.close()移到循环外.
>您可以在循环内关闭阅读器,但模子尚未释放阅读器.您应该先释放读者.
public static final String SRC = "resources/pdfs/primes.pdf";
public static final String[] EXTRA =
{"resources/pdfs/hello.pdf", "resources/pdfs/base_url.pdf", "resources/pdfs/state.pdf"};
public static final String DEST = "results/stamper/primes_superimpose.pdf";
PdfReader reader = new PdfReader(SRC);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(DEST));
PdfContentByte canvas = stamper.getUnderContent(1);
PdfReader r;
PdfImportedPage page;
for (String path : EXTRA) {
r = new PdfReader(path);
page = stamper.getImportedPage(r, 1);
canvas.addTemplate(page, 0, 0);
stamper.getWriter().freeReader(r);
r.close();
}
stamper.close();
在这种情况下,我总是将导入的页面添加到主文档的页面1中.如果要将导入的页面添加到其他页面,则需要在循环内部创建canvas对象.
更多推荐
java pdf stamper_java-在for循环中使用PdfStamper的最佳方法
发布评论