#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();
}
}