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

问题描述 投票:3回答:6

我想从“原始”电子邮件生成PDF文档。此电子邮件可能包含HTML或文本。我不在乎附件。

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

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

java email pdf thunderbird
6个回答
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", "[email protected]", "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();
    }
}

请享用!


2
投票

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

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

该代码可在github的apache V2许可下获得。


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", "[email protected]", "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库


0
投票

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


0
投票

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

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

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


0
投票

你可以尝试Apache PPDFbox库。

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

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

编辑:它是Java和开源的。

希望能帮助到你!

© www.soinside.com 2019 - 2024. All rights reserved.