java - 如何以编程方式将电子邮件打印为 pdf

标签 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/

相关文章:

java - 拦截对 Mailer 操作的调用

email - SMTP 点填充..何时何地进行?

java - 如何创建内容提供程序以通过隐式 Intent 与另一个应用程序共享 PDF 文件?

python - 将 PDF 转换为文本 - 保留表格行 - Python

c# - 使用 iTextSharp/iText 将表格添加到预先存在的 PDF

java - 如何配置java在jdk 9、10和11中应使用的DNS服务器

java - 从 SQLiteDatabase 显示数据时出现 OutOfMemory 错误

java - 选项面板验证

java - 我可以将函数名称存储在最终的 HashMap 中以供执行吗?

python - 如何使用 Python 接收邮件?