我正在开发一个程序,该程序应该通过javax将填充的PDF文件作为附件发送到邮件中。为了进行测试,我将邮件发送到我自己的地址,发送本身工作正常,但附加的PDF文件似乎已损坏。
我的PDF阅读器告诉,该文件可能被错误地解码了。经过一番重新搜索,我添加了行
filePart.setHeader("Content-Transfer-Encoding", "base64");
filePart.setHeader("Content-Type", "application/pdf");
到下面的代码,但它仍然不起作用。
try
{
String filename = "C:/somerandompath/PDFTest.pdf";
reader = new PdfReader(filename);
tempFile = File.createTempFile("FORM" , ".pdf");
fostream = new FileOutputStream(tempFile);
stamper = new PdfStamper(reader , fostream);
acro_fields = stamper.getAcroFields();
Iterator entries = pdfOutputs.entrySet().iterator();
while (entries.hasNext())
{
Entry thisEntry = (Entry)entries.next();
acro_fields.setField((String)thisEntry.getKey() , (String)thisEntry.getValue());
}
/** Sending the Mail */
try
{
Properties properties = new Properties();
properties.put("mail.smtp.host" , "servername");
javax.mail.Session sess = javax.mail.Session.getDefaultInstance(properties , null);
DataSource fileDataSource = new FileDataSource(tempFile.getAbsolutePath());
BodyPart filePart = new MimeBodyPart();
MimeMultipart content = new MimeMultipart();
MimeBodyPart textPart = new MimeBodyPart();
String mailtext = "This is a Testmail";
filePart.setDataHandler(new DataHandler(fileDataSource));
filePart.setFileName("File.pdf");
filePart.setHeader("Content-Transfer-Encoding", "base64");
filePart.setHeader("Content-Type", "application/pdf");
content.addBodyPart(filePart);
textPart.setText(mailtext);
textPart.setHeader("MIME-Version" , "1.0");
textPart.setHeader("Content-Type" , textPart.getContentType());
content.addBodyPart(textPart);
Message msg = new MimeMessage(sess);
InternetAddress addressFrom = new InternetAddress("sendermail@gmail.com");
InternetAddress addressTo = new InternetAddress("recipientmail@gmail.com");
InternetAddress adressCC = new InternetAddress("ccmail@gmail.com");
msg.setFrom(addressFrom);
msg.setRecipient(Message.RecipientType.TO , addressTo);
msg.setRecipient(Message.RecipientType.CC, adressCC);
msg.setSubject("Your file");
msg.setContent(content);
Transport.send(msg);
properties.clear();
}
catch(Exception ex1)
{
System.out.println(ex1);
}
}
catch(Exception ex2)
{
System.out.println(ex2);
}
我将不胜感激任何指导
正如 mkl 已经指出的那样,您应该在使用临时文件发送邮件之前关闭PdfStamper
实例。现在,根据您共享的代码片段,您的PDF文件已损坏是正常的:您使用的是未完成的PDF。
除此之外,您使用的是临时文件非常奇怪。为什么不在内存中创建文件?做这样的事情:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfStamper stamper = new PdfStamper(reader, baos);
// do stuff with stamper
stamper.close();
byte[] pdf_bytes = baos.toByteArray();
现在,您可以在JavaMail中使用这些字节,如下所述:使用byte[]和Java-Mail发送电子邮件附件