使用Java将HTML文件转换为PDF

21

我需要一种使用Java库将HTML文件转换为PDF的方法,最好是免费的。我已经在网上搜索了一些工具来使用,但没有找到一个突出的解决方案(我看到有一些提到iText,但似乎使用它需要付费)。是否存在一种现有的库,我可以利用它来完成HTML到PDF的转换?

3个回答

17

您有几个选项:

  • openhtmltopdf - 新代码,仍在开发中,但已经有了一些很好的结果
  • Apache FOP - 可以转换 XML,虽然不能转换 HTML,但可能会有用
  • itext 较旧的版本(版本 2)
  • Wkhtmltopdf - 可以通过外部进程从 Java 调用它,并且目前使用效果很好

1
我将itext5更改为openhtmltopdf,它像魔法一样运行良好。 - Sebastian D'Agostino
我想提到可以使用的MIT许可证Java库https://github.com/wooio/htmltopdf-java。 - USM

11

更新:

最终我使用了 Maven 仓库中的 Flying-Saucer:https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf

这对我来说非常容易使用,这是我创建的一个方法来使用它:

public static void generatePDF(String inputHtmlPath, String outputPdfPath)
{
    try {
        String url = new File(inputHtmlPath).toURI().toURL().toString();
        System.out.println("URL: " + url);

        OutputStream out = new FileOutputStream(outputPdfPath);

        //Flying Saucer part
        ITextRenderer renderer = new ITextRenderer();

        renderer.setDocument(url);
        renderer.layout();
        renderer.createPDF(out);

        out.close();
    } catch (DocumentException | IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

以下是使用方法:

public static void main(String[] args){
    String inputFile = "C:/Users/jrothst/Desktop/TestHtml.htm";
    String outputFile = "C:/Users/jrothst/Desktop/TestPdf.pdf";

    generatePDF(inputFile, outputFile);

    System.out.println("Done!");
}

输出PDF的效果非常好,使用起来也非常简单。它还可以很好地处理HTML中的CSS。我没有用它来处理外部CSS,但我相信这也是可能的。


4
我也喜欢飞碟,但请注意,虽然FS有友好的许可证,但它使用了iText 5(例如您代码示例中的ITextRenderer),其具有AGPL许可证。因此,我最终选择了openhtmltopdf,因为它没有iText依赖项(它使用Apache PDFBox)。它与CSS非常兼容,并且迄今为止做了我需要做的一切。 - yngwietiger
请提供您实现的代码。@yngwietiger - Ever Think
2
很遗憾,Flying Saucer不支持CSS3。 - Clément Poissonnier
“org.xhtmlrenderer:flying-saucer-pdf-openpdf” https://github.com/flyingsaucerproject/flyingsaucer 这个怎么样?它也使用itext吗? - Satish Patro

-4

这是一个完整的将HTML文件转换为PDF文件的工作示例。

import com.itextpdf.text.Document;
import com.itextpdf.text.html.simpleparser.HTMLWorker;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.IOException;
import java.io.FileReader;
import java.io.Reader;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.StringReader;
import org.jsoup.Jsoup;

public class Html2pdf2 {
private Html2pdf2() {}

public static String extractText(Reader reader) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(reader);
String line;
while ( (line=br.readLine()) != null) {
  sb.append(line);
}
String textOnly = Jsoup.parse(sb.toString()).text();
return textOnly;
}

public final static void main(String[] args) throws Exception{
FileReader reader = new FileReader
      ("example.html");

 try {

OutputStream file = new FileOutputStream(new File("D:\\Test.pdf"));
Document document = new Document();
PdfWriter.getInstance(document, file);
document.open();
HTMLWorker htmlWorker = new HTMLWorker(document);
htmlWorker.parse(new StringReader(ht));
document.close();
file.close();

} catch (Exception e) {
e.printStackTrace();
}

System.out.println("finished converting");
}
}

你能否在代码中加入一些注释来帮助理解过程吗? - IgniteCoders
@IgniteCoders 上述代码使用了iText库,您可以使用它来完成转换。目前我正在使用它以获得成功。HTMLWorker类完成工作。 - yatheendra k v
你能告诉我们 extractText(Reader reader) 的用途吗?你还没有使用它。 - Anuj Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接