Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring boot和itext将HTML呈现为可下载的PDF_Java_Spring Boot_Java 8_Itext - Fatal编程技术网

Java 使用spring boot和itext将HTML呈现为可下载的PDF

Java 使用spring boot和itext将HTML呈现为可下载的PDF,java,spring-boot,java-8,itext,Java,Spring Boot,Java 8,Itext,我正在做一个项目,我需要使用一个HTML模板来填充一些参数,将其呈现为PDF格式,最后将其作为下载返回到响应中 此时,正如您将在我的服务上看到的,我可以生成要呈现的最终HTML。它完全起作用了 //bla bla Service code @Override public String buildHtmlFromTemplate(String voucherUUid, Date created, String employerDenomination, String employerEm

我正在做一个项目,我需要使用一个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
阅读文档,显然在Stacky的帮助下,可以创建以下两种方法:

第一个渲染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渲染器不支持BAO

这是我的控制器代码:

@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
中编写报告,例如在服务层中编写如下内容:

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;
}
然后在资源层(控制器)中返回:

@RequestMapping("/download/report")
public ResponseEntity download(HttpServletResponse response) {
    return ResponseEntity.ok(myService.generateReport(response/*, other args...*/));
}

最后我找到了解决办法。 正如您在generateVoucher()的这一行中看到的

我传递了一个输出流。 因此,我在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;

}

谢谢你的阅读和评论

谢谢你的回复。我的问题与如何下载PDF或如何生成PDF无关。问题是如何呈现html。
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;

}