HTML 使用 spring 引导和 itext 呈现为可下载的 PDF
HTML render to Downloadable PDF using spring boot and itext
我正在做一个项目,我需要使用 HTML 模板来填充一些参数,将其呈现为 PDF,最后 return 它作为下载响应。
此时您将在我的服务中看到,我可以生成要呈现的最终 HTML。它完全正常工作。
//bla bla Service code
@Override
public String buildHtmlFromTemplate(String voucherUUid, Date created, String employerDenomination, String employerEmail) {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML");
templateResolver.setCacheable(false);
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
Context context = new Context();
context.setVariable("voucherUuid", voucherUUid);
context.setVariable("voucherCreated", created);
context.setVariable("employerDenomination", employerDenomination);
context.setVariable("employerEmail", employerEmail);
// Get the plain HTML with the resolved ${name} variable!
return templateEngine.process("pdf_templates/voucher", context);
}
//bla bla Service code
嗯,阅读文档,显然在 Whosebug 的帮助下,y 可以创建接下来的两个方法:
第一个呈现 html 并在服务器内部生成一个文件。还是下载不了
//bla bla service code
@Override
public void generateVoucher(String html) throws IOException, DocumentException {
OutputStream outputStream = new FileOutputStream("message.pdf");
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(outputStream);
outputStream.close();
}
//bla bla Service code
对于第二个,我可以下载 PDF 文件,但很明显,它没有呈现。所以我在 PDF 中收到了计划 HTML。
//bla bla Service code
@Override
public ByteArrayOutputStream generateVoucherDocument(String html) throws IOException, DocumentException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Document document = new Document(PageSize.A4);
PdfWriter.getInstance(document, bos);
document.open();
document.addAuthor("Me");
document.add(new Paragraph(html));
document.close();
return bos;
}
//bla bla Service code
itext渲染器不支持baos
这是我的控制器代码:
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException, DocumentException {
//TODO implementar logica para obtener los datos del voucher
String htmlInvoice = voucherService.buildHtmlFromTemplate(UUID.randomUUID().toString(), new Date(), "Empleador", "encargado@empleador.com");
ByteArrayOutputStream bos = voucherService.generateVoucherDocument(htmlInvoice);
byte[] pdfReport = bos.toByteArray();
String mimeType = "application/pdf";
response.setContentType(mimeType);
response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", "voucherLiquidacion.pdf"));
response.setContentLength(pdfReport.length);
ByteArrayInputStream inStream = new ByteArrayInputStream( pdfReport);
FileCopyUtils.copy(inStream, response.getOutputStream());
}
我真的很困惑如何在 PDF 中呈现 html 并将其放置以供下载。
有什么想法吗?
要在用户浏览器中创建可下载的 PDF,您需要在 HttpServletResponse
中编写报告,例如在 service 层中,您可以这样写:
public HttpServletResponse generateReport(HttpServletResponse response /*, other args...*/) {
try {
response.setContentType("application/pdf");
response.setHeader("Content-Deposition", "inline; file-name=report.pdf");
response = reportUtility.generateMyReport(response /*, other args...*/);
} catch (Exception e) {
//exception handling....
}
return response;
}
在你的资源层(控制器)return它:
@RequestMapping("/download/report")
public ResponseEntity download(HttpServletResponse response) {
return ResponseEntity.ok(myService.generateReport(response/*, other args...*/));
}
我终于找到了解决办法。
正如您在 generateVoucher()
这一行看到的
renderer.createPDF(outputStream);
我传递了一个输出流。
所以,我尝试在 generateVoucherDocumentBaos() 中做同样的事情并且成功了。
public ByteArrayOutputStream generateVoucherDocumentBaos(String html) throws IOException, DocumentException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(baos);
baos.close();
return baos;
}
感谢阅读和评价!
我正在做一个项目,我需要使用 HTML 模板来填充一些参数,将其呈现为 PDF,最后 return 它作为下载响应。
此时您将在我的服务中看到,我可以生成要呈现的最终 HTML。它完全正常工作。
//bla bla Service code
@Override
public String buildHtmlFromTemplate(String voucherUUid, Date created, String employerDenomination, String employerEmail) {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("HTML");
templateResolver.setCacheable(false);
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
Context context = new Context();
context.setVariable("voucherUuid", voucherUUid);
context.setVariable("voucherCreated", created);
context.setVariable("employerDenomination", employerDenomination);
context.setVariable("employerEmail", employerEmail);
// Get the plain HTML with the resolved ${name} variable!
return templateEngine.process("pdf_templates/voucher", context);
}
//bla bla Service code
嗯,阅读文档,显然在 Whosebug 的帮助下,y 可以创建接下来的两个方法:
第一个呈现 html 并在服务器内部生成一个文件。还是下载不了
//bla bla service code
@Override
public void generateVoucher(String html) throws IOException, DocumentException {
OutputStream outputStream = new FileOutputStream("message.pdf");
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(outputStream);
outputStream.close();
}
//bla bla Service code
对于第二个,我可以下载 PDF 文件,但很明显,它没有呈现。所以我在 PDF 中收到了计划 HTML。
//bla bla Service code
@Override
public ByteArrayOutputStream generateVoucherDocument(String html) throws IOException, DocumentException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Document document = new Document(PageSize.A4);
PdfWriter.getInstance(document, bos);
document.open();
document.addAuthor("Me");
document.add(new Paragraph(html));
document.close();
return bos;
}
//bla bla Service code
itext渲染器不支持baos
这是我的控制器代码:
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException, DocumentException {
//TODO implementar logica para obtener los datos del voucher
String htmlInvoice = voucherService.buildHtmlFromTemplate(UUID.randomUUID().toString(), new Date(), "Empleador", "encargado@empleador.com");
ByteArrayOutputStream bos = voucherService.generateVoucherDocument(htmlInvoice);
byte[] pdfReport = bos.toByteArray();
String mimeType = "application/pdf";
response.setContentType(mimeType);
response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", "voucherLiquidacion.pdf"));
response.setContentLength(pdfReport.length);
ByteArrayInputStream inStream = new ByteArrayInputStream( pdfReport);
FileCopyUtils.copy(inStream, response.getOutputStream());
}
我真的很困惑如何在 PDF 中呈现 html 并将其放置以供下载。 有什么想法吗?
要在用户浏览器中创建可下载的 PDF,您需要在 HttpServletResponse
中编写报告,例如在 service 层中,您可以这样写:
public HttpServletResponse generateReport(HttpServletResponse response /*, other args...*/) {
try {
response.setContentType("application/pdf");
response.setHeader("Content-Deposition", "inline; file-name=report.pdf");
response = reportUtility.generateMyReport(response /*, other args...*/);
} catch (Exception e) {
//exception handling....
}
return response;
}
在你的资源层(控制器)return它:
@RequestMapping("/download/report")
public ResponseEntity download(HttpServletResponse response) {
return ResponseEntity.ok(myService.generateReport(response/*, other args...*/));
}
我终于找到了解决办法。 正如您在 generateVoucher()
这一行看到的renderer.createPDF(outputStream);
我传递了一个输出流。 所以,我尝试在 generateVoucherDocumentBaos() 中做同样的事情并且成功了。
public ByteArrayOutputStream generateVoucherDocumentBaos(String html) throws IOException, DocumentException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(baos);
baos.close();
return baos;
}
感谢阅读和评价!