【问题标题】:generating and emailing a pdf on google app engine for java在 google app engine for java 上生成 PDF 并通过电子邮件发送
【发布时间】:2011-05-24 04:30:25
【问题描述】:

我有一个要求,我想即时创建 pdf 并将其邮寄给 google app engine for 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);

【问题讨论】:

  • 请发布抛出的异常。
  • class javax.mail.SendFailedException:发送失败(javax.mail.MessagingException:转换附件数据失败)
  • 您是否考虑过使用其他 PDF 生成工具,例如 JasperReports?
  • 我尝试了 iText 并发现了同样的问题
  • 您找到解决方案了吗?我发现使用 itext 生成器存在一些问题。

标签: java google-app-engine pdf-generation


【解决方案1】:

这可能有点晚了,但我想我会参与进来,以防其他人遇到这个问题。我认为问题在于您试图将文档附加到电子邮件的 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(); 
      }
  }

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2020-02-26
    • 1970-01-01
    • 2012-03-24
    • 2011-04-24
    • 2010-10-27
    • 2016-10-19
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多