<分区>
我想从“原始”电子邮件生成 PDF 文档。此电子邮件可以包含 html 或仅包含文本。我不关心附件。
生成的 pdf 应包含正确的格式(来自 css 和 html)以及嵌入的图像。
我的第一个想法是使用像 thunderbird 这样的电子邮件客户端呈现电子邮件,然后将其打印为 pdf。 thunderbird 是否提供这样的 API 或者是否有可用于将电子邮件打印为 pdf 的 java 库?
标签 java email pdf thunderbird
<分区>
我想从“原始”电子邮件生成 PDF 文档。此电子邮件可以包含 html 或仅包含文本。我不关心附件。
生成的 pdf 应包含正确的格式(来自 css 和 html)以及嵌入的图像。
我的第一个想法是使用像 thunderbird 这样的电子邮件客户端呈现电子邮件,然后将其打印为 pdf。 thunderbird 是否提供这样的 API 或者是否有可用于将电子邮件打印为 pdf 的 java 库?
最佳答案
我找到了比我之前发布的解决方案更好的解决方案。将电子邮件保存为 html,然后使用 jtidy将其清理为 xhtml。最后使用 flying saucer html renderer将其保存为 pdf。
这是我写的一个例子:
import com.lowagie.text.DocumentException;
import org.w3c.tidy.Tidy;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.*;
import java.util.*;
import javax.mail.*;
public class Email2PDF {
public static void main(String[] args) {
Properties props = new Properties();
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getInstance(props, null);
Store store = session.getStore();
//read your latest email
store.connect("imap.gmail.com", "youremail@gmail.com", "password");
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
Message msg = inbox.getMessage(inbox.getMessageCount());
Multipart mp = (Multipart) msg.getContent();
BodyPart bp = mp.getBodyPart(0);
String filename = msg.getSubject();
FileOutputStream os = new FileOutputStream(filename + ".html");
msg.writeTo(os);
//use jtidy to clean up the html
cleanHtml(filename);
//save it into pdf
createPdf(filename);
} catch (Exception mex) {
mex.printStackTrace();
}
}
public static void cleanHtml(String filename) {
File file = new File(filename + ".html");
InputStream in = null;
try {
in = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
OutputStream out = null;
try {
out = new FileOutputStream(filename + ".xhtml");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
final Tidy tidy = new Tidy();
tidy.setQuiet(false);
tidy.setShowWarnings(true);
tidy.setShowErrors(0);
tidy.setMakeClean(true);
tidy.setForceOutput(true);
org.w3c.dom.Document document = tidy.parseDOM(in, out);
}
public static void createPdf(String filename)
throws IOException, DocumentException {
OutputStream os = new FileOutputStream(filename + ".pdf");
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(new File(filename + ".xhtml"));
renderer.layout();
renderer.createPDF(os) ;
os.close();
}
}
尽情享受吧!
关于java - 如何以编程方式将电子邮件打印为 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27317795/