Java邮件PDF附件不起作用

时间:2013-02-04 07:59:11

标签: java pdf encoding javamail email-attachments

我正在生成PDF并尝试将其附加到邮件中,并使用java从浏览器下载。从浏览器下载工作正常,但附加到邮件是我面临的问题。该文件已附加。附件名称和文件大小完好无损。问题是当我从邮件附件打开PDF时,它什么都没显示。没有内容的正确页数。当我通过硬编码附加从浏览器下载的文件时,它工作正常。所以我认为问题不在于PDF生成。我尝试使用比较工具打开两个文件(一个从浏览器下载,另一个从邮件下载)文件。从邮件下载的那个显示转换错误。当我用notepad ++打开时,两者都显示不同的编码。我不太熟悉这些编码的东西。我想这与编码有关。

我还观察到邮件下载的内容与PDF生成的内容相同。但浏览器下载的那个是不同的。

我在浏览器下载中的摘录如下(内容太大而无法粘贴)

%PDF-1.4
%âãÏÓ
4 0 obj <</Type/XObject/ColorSpace/DeviceRGB/Subtype/Image/BitsPerComponent 8/Width 193/Length 11222/Height 58/Filter/DCTDecode>>stream
ÿØÿà  

我收到的邮件下载摘录如下:

%PDF-1.4
%????
4 0 obj <</Type/XObject/ColorSpace/DeviceRGB/Subtype/Image/BitsPerComponent 8/Width 193/Length 11222/Height 58/Filter/DCTDecode>>stream
????

我使用Spring MimeMessageHelper发送消息。我使用以下方法添加附件

MimeMessageHelper.addAttachment(fileName, new ByteArrayResource(attachmentContent.getBytes()), "application/pdf");

我也尝试了另一种附着方式,但徒劳无功

DataSource dataSource = new ByteArrayDataSource(bytes, "application/pdf");
MimeBodyPart pdfBodyPart = new MimeBodyPart();
pdfBodyPart.addHeader("Content-Type", "application/pdf;charset=UTF-8");
pdfBodyPart.addHeader("Content-disposition", "attachment; filename="+fileName);
pdfBodyPart.setDataHandler(new DataHandler(dataSource));
pdfBodyPart.setFileName(fileName);
mimeMessageHelper.getMimeMultipart().addBodyPart(pdfBodyPart);

非常感谢任何帮助。提前致谢

3 个答案:

答案 0 :(得分:0)

我不确定这是否与它有任何关系,但我注意到你没有在pdfBodyPart.addHeader("Content-Type", "application/pdf;charset");中设置实际的字符集,也没有用charset作为参数调用attachmentContent.getBytes()。怎么知道你想用哪一个?

答案 1 :(得分:0)

您收到的邮件中的附件使用了哪些内容传输编码?通常,JavaMail会选择一个合适的值,但如果文档中包含纯文本和二进制文件的不寻常混合,那么JavaMail可能不会选择最佳编码。您可以尝试添加pdfBodyPart.setHeader(“Content-Transfer-Encoding”,“base64”);

答案 2 :(得分:0)

我发现了为什么它不起作用。这是一个编码问题,但与MimeMessageHelper无关。问题是我将PDF生成为OutputStream并将其转换为String,然后将其转换为字节数组。当我将其转换为String时,编码发生了变化,从而导致了问题。所以我通过从outputStream获取字节数组来修复它:)