如何从多个 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;
}
我需要从几个 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;
}