Избегайте создания PDF-файла на диске для отправки по электронной почте в виде вложения в java - PullRequest
0 голосов
/ 14 июля 2020

В настоящее время у меня есть шаблон pdf (в указанном c месте), и я использую его со сгенерированным файлом 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? ... Я хочу избежать чтения с диска.

Любые идеи приветствуются.

спасибо

1 Ответ

0 голосов
/ 14 июля 2020

в памяти

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...