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

Java 如何从多个html模板生成多页PDF?,java,pdf,itext,Java,Pdf,Itext,我需要从几个html字符串生成pdf文件,每个字符串放在文档的单独页面上。我写了以下方法: public Optional<File> generatePdf(String[] htmlPages) { try { ConverterProperties properties = new ConverterProperties(); FontProvider fontProvider = new DefaultFontProvider();

我需要从几个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();
}
public可选generatePdf(字符串[]htmlpage){
试一试{
ConverterProperties属性=新ConverterProperties();
FontProvider FontProvider=新的DefaultFontProvider();
FontProgram FontProgram=FontProgramFactory.createFont();
addFont(fontProgram);
属性。setFontProvider(fontProvider);
File pdfFile=File.createTempFile(“pdfdata”,null);
PdfWriter PdfWriter=新的PdfWriter(Pdfile);
PdfDocument pdf=新PdfDocument(pdfWriter);
PdfMerger合并=新PdfMerger(pdf);
for(int page=0;page

但是,尽管正确创建了每个页面的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;
}
public byte[]generatePdf(列出HTML页面){
试一试{
ByteArrayOutputStream arrayOutputStream=新建ByteArrayOutputStream();
PdfWriter writer=新的PdfWriter(arrayOutputStream);
ConverterProperties属性=新ConverterProperties();
FontProvider FontProvider=新的DefaultFontProvider();
FontProgram FontProgram=FontProgramFactory.createFont();
addFont(fontProgram);
属性。setFontProvider(fontProvider);
列表文档=新建ArrayList();
PdfDocument pdf=新PdfDocument(编写器);
for(字符串htmlPage:htmlPage){
File pageFile=File.createTempFile(“pagepdfdata”,null);
PdfDocument temp=新PdfDocument(新PdfWriter(页面文件));
临时设置DefaultPageSize(新的PageSize(7951042));
HtmlConverter.convertToPdf(htmlPage、temp、properties);
temp=新PdfDocument(新PDF阅读器(新文件输入流(页面文件));
临时copyPagesTo(1,临时getNumberOfPages(),pdf);
pageFile.deleteOnExit();
文件添加(临时);
}
docs.forEach(PdfDocument::close);
pdf.close();
返回arrayOutputStream.toByteArray();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}

我猜您需要
close()
您的
PdfWriter
来确保它完成了所有必要的磁盘写入操作。@JoachimSauer感谢您的回复,不幸的是这没有帮助。然而,我找到了另一种方法(见下文)。