如何从多个 html 模板生成多页 PDF?

How to generate multi-page PDF from several html templates?

我需要从几个 html 字符串生成 pdf 文件,每个字符串都放在文档的单独页面上。我写了下面的方法:

public Optional<File> generatePdf(String[] htmlPages) {
    try {
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new DefaultFontProvider();
        FontProgram fontProgram = FontProgramFactory.createFont();
        fontProvider.addFont(fontProgram);
        properties.setFontProvider(fontProvider);
        File pdfFile = File.createTempFile("pdfdata", null);
        PdfWriter pdfWriter = new PdfWriter(pdfFile);
        PdfDocument pdf = new PdfDocument(pdfWriter);
        PdfMerger merger = new PdfMerger(pdf);
        for(int page = 0; page < htmlPages.length; page++) {
            String htmlPage = htmlPages[page];
            File pageFile = File.createTempFile("pagepdfdata", null);
            PdfDocument temp = new PdfDocument(new PdfWriter(pageFile));
            temp.setDefaultPageSize(new PageSize(795, 1042));
            HtmlConverter.convertToPdf(htmlPage, temp, properties);
            temp = new PdfDocument(new PdfReader(new FileInputStream(pageFile)));
            merger.merge(temp, 1, temp.getNumberOfPages());
            pageFile.deleteOnExit();
            temp.close();
        }
        pdfFile.deleteOnExit();
        return Optional.of(pdfFile);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return Optional.empty();
}

但是,虽然正确创建了每个页面的pdf文件,但生成的pdf文件长度为0字节,无法打开。你能帮我解决这个问题吗?

我通过重写代码解决了这个问题:

public byte[] generatePdf(List<String> htmlPages) {
    try {
        ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
        PdfWriter writer = new PdfWriter(arrayOutputStream);
        ConverterProperties properties = new ConverterProperties();
        FontProvider fontProvider = new DefaultFontProvider();
        FontProgram fontProgram = FontProgramFactory.createFont();
        fontProvider.addFont(fontProgram);
        properties.setFontProvider(fontProvider);
        List<PdfDocument> docs = new ArrayList<>();
        PdfDocument pdf = new PdfDocument(writer);
        for(String htmlPage: htmlPages) {
            File pageFile = File.createTempFile("pagepdfdata", null);
            PdfDocument temp = new PdfDocument(new PdfWriter(pageFile));
            temp.setDefaultPageSize(new PageSize(795, 1042));
            HtmlConverter.convertToPdf(htmlPage, temp, properties);
            temp = new PdfDocument(new PdfReader(new FileInputStream(pageFile)));
            temp.copyPagesTo(1, temp.getNumberOfPages(), pdf);

            pageFile.deleteOnExit();
            docs.add(temp);
        }
        docs.forEach(PdfDocument::close);
        pdf.close();
        return arrayOutputStream.toByteArray();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}