2

電子メールの添付ファイルとして送信された PDF を開くことができません。PDF は iText と Flying Saucer を使用して作成され、Java の MimeMessage を使用して送信されます。添付ファイルをダウンロードしようとすると、エンコーディングの問題があると確信しています。PDF が作成されたときは問題ないように見えるからです。添付ファイルとして送信されたときに、開くときに問題が発生しました。たとえば、Chrome では「PDF ドキュメントの読み込みに失敗しました」というエラーが送信されます。他のブラウザや Adob​​e Reader で同様のエラーを送信します。ありがとう。

//creates the pdf
        DocumentBuilder builder =  DocumentBuilderFactory.newInstance().newDocumentBuilder();
        byte[] bytes              = buf.toString().getBytes("iso-8859-1");
        ByteArrayInputStream baos = new ByteArrayInputStream(bytes);

        Document doc = builder.parse(baos);

        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(doc, null);
        renderer.layout();
        OutputStream os = new ByteArrayOutputStream();
        os = response.getOutputStream();
        renderer.createPDF(os);
        os.close();


        //email
        MimeMessage msg = new MimeMessage(session);
        Multipart multipart = new MimeMultipart();
        MimeBodyPart messageBodyPart = new MimeBodyPart();
        messageBodyPart.setText("This is a test");
        multipart.addBodyPart(messageBodyPart);

        messageBodyPart = new MimeBodyPart();
        //construct the pdf body part
        DataSource dataSource = new ByteArrayDataSource(bytes, "application/pdf");
        messageBodyPart.setHeader("Content-Transfer-Encoding", "base64");
        messageBodyPart.setDataHandler(new DataHandler(dataSource));
        messageBodyPart.setFileName("test.pdf");

        multipart.addBodyPart(messageBodyPart);

        //construct message
        msg.setHeader("Content-Type", "multipart/mixed");
        msg.setFrom(new InternetAddress(user));
        msg.setReplyTo(InternetAddress.parse(replyEmail,false));
        msg.setSubject("Test");
        msg.setRecipients(Message.RecipientType.TO, to);
        msg.setSentDate(new java.util.Date());
        msg.setContent(multipart);

        //send email
        Transport.send(msg);            
4

2 に答える 2

1

問題は私が設定していた

os=response.getOutputStream

代わりに、この行を削除して作成しました

byte[] outputBytes = os.toByteArray();

これは、dataSource で使用したものです。

于 2013-03-26T14:19:27.697 に答える
0

「バフ」とは?それを文字列に変換してから、文字列が iso-8859-1 でエンコードされていると仮定して、文字列からバイトを抽出するのはなぜですか?

PDFが「os」に作成されているようです。これはどこにも保存されておらず、添付ファイルにも使用されていません。

于 2013-03-25T03:42:53.803 に答える