首页 > 解决方案 > 使用 Spring Boot 和 itext 将 HTML 渲染为可下载的 PDF

问题描述

我正在做一个项目,我需要使用 HTML 模板来填充一些参数,将其呈现为 PDF,最后将其作为下载返回到响应中。

此时,您将在我的服务中看到,我可以生成要呈现的最终 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

好吧,阅读文档并且显然借助 stackoverflow 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 并将其放置以供下载。任何的想法?

标签: javaspring-bootjava-8itext

解决方案


最后我找到了解决方案。正如您在 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;

}

感谢您的阅读和评价!


推荐阅读