如何在FlyingSaucer生成PDF后追加合并另一个PDF文件?
使用FlyingSaucer合并HTML生成的PDF与现有PDF
你已实现用FlyingSaucer将HTML转换为PDF的功能,现在需要把另一个已存在的PDF文件作为独立页面追加到生成的PDF末尾。
现有代码
org.xhtmlrenderer.pdf.ITextRenderer render = new org.xhtmlrenderer.pdf.ITextRenderer(); render.setDocumentFromString("<!--?xml version='1.0' encoding='utf-8'?--><html><body>Some text</body></html>"); render.layout(); ByteArrayOutputStream out = new ByteArrayOutputStream(); render.createPDF(out);
尝试的代码(存在疑问)
final File outputFile = File.createTempFile("FlyingSaucer.PDFRenderToMultiplePages", ".pdf"); try (OutputStream os = newOutputStream(outputFile.toPath())) { ITextRenderer renderer = new ITextRenderer(); // 创建包含HTML内容的PDF页面 renderer.setDocumentFromString(htmlStr); renderer.layout(); renderer.createPDF(os, false); // 此处疑问:如何读取并追加现有PDF文件 renderer.setDocument...? // how to read and add the PDF file here renderer.layout(); renderer.writeNextDocument(); } // 完成PDF生成 renderer.finishPDF();
解决方案
FlyingSaucer基于iText构建,可直接借助iText的API读取现有PDF并逐页追加到目标PDF中,具体实现如下:
完整代码示例
import com.lowagie.text.Document; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfImportedPage; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfWriter; import org.xhtmlrenderer.pdf.ITextRenderer; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class PdfMergeExample { public static void main(String[] args) throws Exception { String htmlStr = "<!--?xml version='1.0' encoding='utf-8'?--><html><body>Some text</body></html>"; File existingPdfFile = new File("path/to/your/existing.pdf"); // 替换为你的目标PDF路径 final File outputFile = File.createTempFile("FlyingSaucer.MergedPDF", ".pdf"); try (OutputStream os = new FileOutputStream(outputFile)) { ITextRenderer renderer = new ITextRenderer(); // 生成HTML对应的PDF内容,第二个参数false表示不关闭文档,留作后续追加 renderer.setDocumentFromString(htmlStr); renderer.layout(); renderer.createPDF(os, false); // 获取当前PDF的Writer和Document实例 PdfWriter writer = renderer.getWriter(); Document document = renderer.getDocument(); // 读取需要追加的PDF文件 PdfReader pdfReader = new PdfReader(existingPdfFile.getAbsolutePath()); int pageCount = pdfReader.getNumberOfPages(); // 逐页导入并追加到当前PDF for (int i = 1; i <= pageCount; i++) { document.newPage(); // 创建新的空白页 PdfImportedPage importedPage = writer.getImportedPage(pdfReader, i); PdfContentByte contentByte = writer.getDirectContent(); contentByte.addTemplate(importedPage, 0, 0); // 将导入的页面写入当前页 } // 关闭PdfReader释放资源 pdfReader.close(); } // 完成整个PDF的最终生成 renderer.finishPDF(); } }
关键说明
renderer.createPDF(os, false)中的false参数确保文档不被关闭,允许后续追加内容。- 通过
PdfReader读取现有PDF的所有页面,使用PdfImportedPage导入页面内容,再通过PdfContentByte将页面模板写入当前文档。 - 每追加一页前调用
document.newPage()创建独立空白页,保证追加的PDF内容以独立页面形式存在。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

