You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:31:12