java - 避免在磁盘上创建pdf文件以在java中作为附件发送电子邮件
问题描述
我目前有一个 pdf 模板(在特定位置),并将其与生成的 pdf 文件一起使用,我将其保存到同一位置,然后使用 PdfStamper 合并。然后我将新创建的 pdf 附加到电子邮件中。我想避免将 pdf 文件写入磁盘。我目前正在使用 FileOutputStream:
PdfReader pdfTemplate = new PdfReader(getServletContext().getRealPath("/")+
"invoicepdf/manualSalesInvoiceTemplate.pdf");
FileOutputStream fileOutputStream = new FileOutputStream(getServletContext().getRealPath("/")+
"invoicepdf/manualSalesInvoice.pdf");
PdfStamper stamper = new PdfStamper(pdfTemplate, fileOutputStream);
stamper.setFormFlattening(true);
AcroFields form = stamper.getAcroFields();
然后稍后
//add any file attachments to the message
String filename = getServletContext().getRealPath("/")+
"invoicepdf/manualSalesInvoice.pdf";
MimeBodyPart attachmentBodyPart = new MimeBodyPart();
//use a JAF FileDataSource as it does MIME type detection
DataSource source = new FileDataSource(filename);
attachmentBodyPart.setDataHandler(new DataHandler(source));
attachmentBodyPart.setFileName("Invoice" + i_invoiceID +
".pdf");
//add the attachment
multipart.addBodyPart(attachmentBodyPart);
然后我通过电子邮件发送保存的 manualSalesInvoice.pdf,如图所示,但我必须再次访问服务器磁盘才能执行此操作。我希望我可以只创建一个对象,或者我可以使用内存流或临时文件(不确定这个是否需要物理位置),甚至是 ByteArrayStream?...我想避免从磁盘读取。
任何想法都会受到赞赏。
谢谢
解决方案
内存方式
import javax.mail.util.ByteArrayDataSource;
...
byte[] content = ... // obtain content of PDF-file
ByteArrayDataSource ds = new ByteArrayDataSource(content, "application/pdf");
MimeBodyPart attachmentBodyPart = new MimeBodyPart();
attachmentBodyPart.setDataHandler(new DataHandler(ds));
attachmentBodyPart.setFileName("file.pdf");
multipart.addBodyPart(attachmentBodyPart);
推荐阅读
- vim - Vim 自动缩进大型数组文字
- java - Docker 使用 Spring 和 mysql 映像组成推送到注册表
- java - 如何在 RecycleView 中显示理想的循环数组结果
- java - OptionalInt 作为输入参数
- spring - Spring微服务jwt认证
- node.js - 在 NodeJS 中使用归档器压缩音频文件
- c# - iTextSharp - 如何将 PDFLayer 转换为位图?
- haskell - Haskell 的在线平均值
- angular - 即使在令牌过期或注销后,浏览器上也不会清除 JWT 令牌
- php - 如何在 PHP FPDF 中显示十进制值?