создание и отправка по электронной почте PDF на Google App Engine для Java - PullRequest
2 голосов
/ 24 мая 2011

У меня есть требование, где я хочу создать PDF на лету и отправить его по почте пользователю на Google App Engine для Java.я попытался использовать pdfJet, но, похоже, проблема заключается в том, что движок приложения генерирует исключения при попытке отправить созданный pdf по электронной почте.

Если у вас есть рабочий образец, использующий либо pdfjet, либо какую-то другую библиотеку, пожалуйста, сообщите ..

с pdfJet мой код выглядит так:

ByteArrayOutputStream out = new ByteArrayOutputStream();
    PDF pdf;
    try {
        pdf = new PDF(out);
        log.info("#1");
        pdf.setTitle("Using TextColumn and Paragraph classes");
        pdf.setSubject("Examples");
        pdf.setAuthor("Innovatics Inc.");
        log.info("#2");

        Page page = new Page(pdf, Letter.PORTRAIT);
        pdf.flush();

           Multipart mp = new MimeMultipart();
        MimeBodyPart htmlPart = new MimeBodyPart();
        htmlPart.setFileName("whatever.pdf");
        log.info("#7");
        htmlPart.setContent(out.toByteArray(), "application/pdf");
        mp.addBodyPart(htmlPart);
        log.info("#8");
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        Message msg = new MimeMessage(session);
        msg.setContent(mp);
        msg.setFrom(new InternetAddress("vik.ceo@gmail.com")); 
        msg.addRecipient(Message.RecipientType.TO,
                    new InternetAddress("vik.ceo@gmail.com"));


        msg.setSubject("testing PDF system");
        Transport.send(msg);

1 Ответ

1 голос
/ 26 марта 2014

Это может быть немного поздно, но я подумал, что скину, если кто-нибудь еще столкнется с этим.Я думаю, что проблема в том, что вы пытаетесь прикрепить документ в разделе html письма, а не добавлять его в качестве вложения.

Сначала я использую pdfjet для создания pdf в этом методе (я немного отредактировал это без тестирования, но это должно работать)

private byte[] createPDF(String title) throws Exception
{
   ByteArrayOutputStream out = new ByteArrayOutputStream();

   PDF pdf = new PDF(out);
   pdf.setTitle("Title");

   Page page = new Page(pdf, Letter.PORTRAIT);
   Font f1 = new Font(pdf, CoreFont.HELVETICA);
   f1.setSize(16); 

   TextColumn column = new TextColumn();
   column.setLineBetweenParagraphs(true);
   column.setLineSpacing(1.0);

   //Fill data

   Paragraph title = new Paragraph();
   title.setAlignment(Align.CENTER);
   title.add(new TextLine(f1, text));
   column.addParagraph(title);

   column.setPosition(90, 90); 
   column.setSize(470, 100);
   column.drawOn(page);

   pdf.flush();
   byte[] bytes = out.toByteArray();
   return bytes;
}

Вот метод, который я использую для отправкиэлектронное письмо с передачей PDF в виде байтового массива.(Это именно тот код, за исключением того, что я изменил адрес электронной почты от. Имейте в виду, что адрес электронной почты от должен следовать приведенным здесь правилам https://developers.google.com/appengine/docs/java/mail/#Java_Sending_mail)

private void sendEmailWithPDF(String recipient, String content, byte[] pdf) throws Exception
  { 
      Properties props = new Properties(); 
      Session session = Session.getDefaultInstance(props, null); 
      session.setDebug(true); 

      String htmlBody = content; 

      try { 
              javax.mail.Message msg = new MimeMessage(session); 
              MimeMultipart mp = new MimeMultipart(); 
              MimeBodyPart htmlPart = new MimeBodyPart(); 
              MimeBodyPart attachment = new MimeBodyPart(); 

              msg.setFrom(new InternetAddress("myaddress@mydomain.com")); 
              msg.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(recipient,recipient)); 
              msg.setSubject(content); 

              //prepare html part 
              htmlPart.setContent(htmlBody, "text/html"); 

              //prepare attachment using a bytearraydatasource 
              DataSource src = new ByteArrayDataSource(pdf, "application/pdf"); 
              attachment.setFileName("form " + new Date().toString() + ".pdf"); 
              attachment.setDataHandler(new DataHandler(src)); 

              //put the parts together into a multipart 
              mp.addBodyPart(htmlPart); 
              mp.addBodyPart(attachment); 

              //set the content of the message to be the multipart 
              msg.setContent(mp); 
              msg.saveChanges();

              Transport.send(msg); 
      } catch (AddressException e) { 
              e.printStackTrace(); 
      } catch (MessagingException e) { 
              e.printStackTrace(); 
      } catch (UnsupportedEncodingException e) { 
              e.printStackTrace(); 
      }
  }
...