【发布时间】:2011-06-10 09:41:17
【问题描述】:
我有一些 HTML 内容(包括格式标记,如strong、图像等)。在我的 Java 代码中,我想将此 HTML 内容转换为 PDF 文档,而不会丢失 HTML 格式。
有没有办法在 Java 中实现(使用 iText 或任何其他库)?
【问题讨论】:
标签: java pdf-generation html-parsing itext
我有一些 HTML 内容(包括格式标记,如strong、图像等)。在我的 Java 代码中,我想将此 HTML 内容转换为 PDF 文档,而不会丢失 HTML 格式。
有没有办法在 Java 中实现(使用 iText 或任何其他库)?
【问题讨论】:
标签: java pdf-generation html-parsing itext
我使用了来自Flying Saucer 项目的ITextRenderer。
这是一个简短的、独立的、有效的示例。 就我而言,我想稍后将字节流式传输到电子邮件附件中。
因此,在示例中,我将其写入文件纯粹是为了演示这个问题。这是 Java 8。
import com.lowagie.text.DocumentException;
import org.apache.commons.io.FileUtils;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
public class So4712641 {
public static void main(String... args) throws DocumentException, IOException {
FileUtils.writeByteArrayToFile(new File("So4712641.pdf"), toPdf("<b>You gotta walk and don't look back</b>"));
}
/**
* Generate a PDF document
* @param html HTML as a string
* @return bytes of PDF document
*/
private static byte[] toPdf(String html) throws DocumentException, IOException {
final ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
try (ByteArrayOutputStream fos = new ByteArrayOutputStream(html.length())) {
renderer.createPDF(fos);
return fos.toByteArray();
}
}
}
这给了我
为了完整起见,这里是我的 Maven pom.xml 的相关部分
<dependencies>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.0.8</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
【讨论】:
我会尝试DocRaptor.com。它将任何语言的 html 转换为 pdf 或 html 转换为 xls,并且由于它使用 Prince XML(无需让您支付昂贵的许可费),因此质量比其他选项要好得多。它也是一个网络应用程序,所以没有什么可下载的。轻松解决冗长、令人沮丧的编码问题。
这里有一些例子: https://docraptor.com/documentation#coding_examples
【讨论】:
一般来说,将 HTML 转换为 PDF 并不十分简单,但如果您可以控制 HTML 中的内容,您可以尝试使用 XSL-FO 实现,例如 Apache FOP。
它不是开箱即用的,因为您必须编写(或查找)定义转换规则的样式表,但从好的方面来说,它使您可以更好地控制输出格式,这非常有用在屏幕上看起来不错的东西在纸上不一定看起来不错。
【讨论】: