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

时间:2014-12-05 14:12:58

标签: java email pdf thunderbird

我想从" raw"生成PDF文档。电子邮件。这封电子邮件可能包含HTML或文本。我不在乎附件。

生成的pdf应包含正确的格式(来自css和html)以及嵌入的图像。

我的第一个想法是使用像thunderbird这样的电子邮件客户端呈现电子邮件,然后将其打印为pdf。雷鸟是否提供这样的API,或者是否有可用于打印电子邮件到pdf的java库?

6 个答案:

答案 0 :(得分:3)

我找到了一个比我之前发布的更好的解决方案。将电子邮件保存为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();
    }
}

享受!

答案 1 :(得分:2)

我将一个软件放在一起,通过解析(和清理)mime /结构将eml文件转换为pdf,然后将其转换为html,然后使用wkhtmltopdf将其转换为pdf文件。

它还处理内联图像,损坏的mime标头,并且可以使用代理。

该代码在apache V2许可下的github处可用。

答案 2 :(得分:1)

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

import java.io.FileOutputStream;
import java.io.IOException;
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();
            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);
            createPdf(msg.getSubject(), (String) bp.getContent());
        } catch (Exception mex) {
            mex.printStackTrace();
        }
    }

    public static void createPdf(String filename, String body)
            throws DocumentException, IOException {

        Document document = new Document();
        PdfWriter.getInstance(document, new FileOutputStream(filename + ".pdf"));
        document.open();
        document.add(new Paragraph(body));
        document.close();
    }

}

我已将itext用作pdf库

答案 3 :(得分:0)

您可以使用电子邮件客户端阅读HTML内容,然后使用iText将其转换为PDF

答案 4 :(得分:0)

查看fpdf和fpdi,PHP的两个免费库都用于创建PDF文档。

由于SMTP协议具有约定,实际上是严格的规则,因此您始终可以依赖第一个空行作为消息内容之前的内容。因此,您可以在行的第一部分之后解析所有内容,以获取整个消息。

对于嵌入式图像,您需要基于64位解码器(通常)或基于电子邮件附件编码类型的其他解码器将数据转换为人类可读图像。

答案 5 :(得分:0)

您可以尝试Apache PPDFbox库。

它似乎有一个很好的API,它也支持打印。 PrintPDF

您必须以CLI文件作为参数从CLI运行print命令。

编辑:它是Java和开源。

希望它有所帮助!