создание и отправка по электронной почте PDF-файла в Google App engine для java

#java #google-app-engine #pdf-generation

#java #google-app-engine #генерация pdf

Вопрос:

У меня есть требование, согласно которому я хочу создать PDF-файл «на лету» и отправить его пользователю в Google App engine для Java. я пытался использовать PDFJet, но, похоже, возникла проблема, поскольку app engine выдает исключения при попытке отправить созданный 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. Пожалуйста, опубликуйте возникшее исключение.

2. исключение javax.mail.SendFailedException класса: ошибка отправки (исключение javax.mail.MessagingException: не удалось преобразовать данные вложения)

3. Рассматривали ли вы возможность использования другого инструмента генерации PDF, такого как JasperReports?

4. Я попробовал iText и обнаружил ту же проблему

5. Вы нашли решение? я нахожу некоторую проблему с использованием itext generator.

Ответ №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-файл в виде массива байтов. (Это именно тот код, за исключением того, что я изменил адрес электронной почты from. Имейте в виду, что адрес электронной почты from должен соответствовать приведенным здесь правилам 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(); 
      }
  }