有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使用Spring boot创建pdf文件和发送电子邮件

我有一个控制器和一个导出器类,可以在SpringBoot中创建一个类数据的pdf。它在本地主机上工作。我可以通过此链接发送带有附件的电子邮件,这些附件位于resources/static/目录中: https://asbnotebook.com/2020/01/26/send-email-with-attachment-spring-boot/

我想通过电子邮件发送在fly创建的pdf文件。我试着把它们结合起来,但没用

 public String sendMail(EmailRequestDto request, Map<String, String> model) {
 
        String response;
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED,
                    StandardCharsets.UTF_8.name());
           
            Template template = configuration.getTemplate("email.ftl");
            String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
 
            helper.setTo(request.getTo());
            helper.setFrom(request.getFrom());
            helper.setSubject(request.getSubject());
            helper.setText(html, true);
            
            List<PurchaseDetail> cities = (List<PurchaseDetail>)basketService.getPurchases();
                      
                      ByteArrayInputStream bis = InvoicePdfExporter.citiesReport(cities);
                      
                      HttpHeaders headers = new HttpHeaders(); headers.add("ContentDisposition",
                      "inline; filename=citiesreport.pdf");
                      InputStreamResource rs= (new InputStreamResource(bis)) ;
            
            //this gives error because rs is a inputStreamResource but not InputStream
helper.addAttachment("citiesreport.pdf",newByteArrayResource(IOUtils.toByteArray(rs)));
 
            mailSender.send(message);
            response = "Email has been sent to :" + request.getTo();
        } catch (MessagingException | IOException | TemplateException e) {
            response = "Email send failure to :" + request.getTo();
        }
        return response;
    }

我的工作控制器类创建pdf。InvoicePdfExporter类将datatable添加到文档中,并以return new ByteArrayInputStream(out.toByteArray())的形式返回:

    @RequestMapping(value = "/pdfreport", method = RequestMethod.GET, 
            produces =    MediaType.APPLICATION_PDF_VALUE) 
            public ResponseEntity<InputStreamResource> citiesReport() throws IOException
            {

            List<PurchaseDetail> purchases = (List<PurchaseDetail>)
            basketService.getPurchases();

            ByteArrayInputStream bis = InvoicePdfExporter.citiesReport(purchases);

            HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition",
            "inline; filename=citiesreport.pdf");

            return
            ResponseEntity.ok().headers(headers).contentType(MediaType.APPLICATION_PDF)
            .body(new InputStreamResource(bis)) ; }
}

我真的需要帮助我真的不明白从IOStreams,我尝试了很多事情,但没有一个解决我的问题。谢谢

编辑: 我通过将InvoicePdfExporter的返回类型更改为InputStreamSource解决了此问题,并更改为:

List<PurchaseDetail> cities = (List<PurchaseDetail>)basketService.getPurchases();
                      
      InputStreamSource bis =InvoicePdfExporter.citiesReport(cities);
                      
                      
    HttpHeaders headers = new HttpHeaders(); headers.add("Content-Disposition",
                      "inline; filename=citiesreport.pdf");
                      
                      
                      
            helper.addAttachment("citiesreport.pdf",bis, "application/pdf" );

共 (0) 个答案