首页 > 解决方案 > 避免在磁盘上创建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?...我想避免从磁盘读取。

任何想法都会受到赞赏。

谢谢

标签: javapdffileoutputstream

解决方案


内存方式

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);

推荐阅读