Java与HTML转PDF的实用方法
在现代Web应用开发中,将HTML内容转换为PDF格式的需求十分常见,例如生成报表、发票、合同等文档,Java作为一种广泛使用的编程语言,提供了多种工具和库来实现HTML到PDF的转换,本文将详细介绍几种主流的实现方法,包括使用iText、Flying Saucer(xhtmlrenderer)、Apache PDFBox以及浏览器自动化工具,帮助开发者根据具体需求选择合适的方案。

使用iText库实现HTML转PDF
iText是一个功能强大的开源Java库,常用于生成和操作PDF文档,虽然iText本身主要用于直接操作PDF元素,但结合其HTML解析功能,可以实现HTML到PDF的转换。
添加依赖
在项目中引入iText的HTML解析依赖(Maven配置):
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>html2pdf</artifactId>
<version>5.0.0</version>
</dependency>
基本转换代码
以下是一个简单的示例,展示如何将HTML字符串转换为PDF文件:
import com.itextpdf.html2pdf.HtmlConverter;
public class HtmlToPdfExample {
public static void main(String[] args) {
String html = "<h1>Hello, World!</h1><p>This is a PDF generated from HTML.</p>";
try {
HtmlConverter.convertToPdf(html, new FileOutputStream("output.pdf"));
System.out.println("PDF generated successfully!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项
iText的HTML支持有限,可能无法完美呈现复杂的CSS样式,对于需要高度兼容的场景,建议结合其他工具或使用更专业的HTML渲染引擎。
使用Flying Saucer(xhtmlrenderer)
Flying Saucer是一个基于Java的XHTML/CSS渲染引擎,能够将HTML和CSS转换为图像或PDF,它对CSS2和部分CSS3的支持较好,适合需要精确样式还原的场景。
添加依赖
Maven依赖配置:

<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.22</version>
</dependency>
转换示例代码
import org.xhtmlrenderer.pdf.ITextRenderer;
public class FlyingSaucerExample {
public static void main(String[] args) {
String html = "<html><body><h1>Title</h1><p>Content with CSS styling.</p></body></html>";
try {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(html);
renderer.layout();
renderer.createPDF(new FileOutputStream("output.pdf"));
System.out.println("PDF generated successfully!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
优势与局限
Flying Saucer对CSS的支持优于iText,但可能无法处理JavaScript或某些动态内容,生成PDF的性能可能不如浏览器自动化工具高效。
使用Apache PDFBox与HTML解析器
Apache PDFBox是一个专注于PDF处理的Java库,虽然不直接支持HTML转PDF,但可以结合其他HTML解析器(如Jsoup)实现转换。
添加依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
转换逻辑
虽然PDFBox本身不提供HTML渲染功能,但可以通过以下步骤实现转换:
- 使用Jsoup解析HTML并提取文本内容。
- 写入PDFBox生成的PDF文档。
这种方法仅适用于纯文本HTML,无法保留样式。
使用浏览器自动化工具(如Selenium或Headless Chrome)
对于需要高度还原HTML样式和动态内容的场景,可以使用浏览器自动化工具,通过控制无头浏览器(Headless Browser)访问HTML页面并将其打印为PDF。

使用Selenium + Chrome
依赖配置:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-chrome-driver</artifactId>
<version>4.1.0</version>
</dependency>
转换代码:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class SeleniumToPdf {
public static void main(String[] args) {
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
WebDriver driver = new ChromeDriver(options);
try {
driver.get("file:///path/to/your/file.html");
driver.findElement(By.tagName("body")).sendKeys(Keys.chord(Keys.CONTROL, "p"));
// 通过操作系统打印功能保存为PDF(需手动配置)
} finally {
driver.quit();
}
}
}
使用Headless Chrome直接打印
通过Chrome的命令行参数直接生成PDF:
import java.io.File;
public class HeadlessChromePdf {
public static void main(String[] args) {
String url = "file:///path/to/your/file.html";
String outputPath = "output.pdf";
String chromePath = "/path/to/chrome";
ProcessBuilder pb = new ProcessBuilder(
chromePath,
"--headless",
"--disable-gpu",
"--print-to-pdf=" + outputPath,
url
);
try {
pb.start().waitFor();
System.out.println("PDF generated successfully!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
优势与适用场景
浏览器自动化工具能完美还原HTML样式,支持CSS、JavaScript和动态内容,但依赖本地浏览器环境,且性能较低。
选择合适的方案
- 简单需求:如果仅需转换简单HTML且对样式要求不高,iText或PDFBox+Jsoup是轻量级选择。
- 样式还原需求:Flying Saucer适合需要较好CSS支持的场景,但无法处理动态内容。
- 高保真转换:浏览器自动化工具(如Selenium或Headless Chrome)能实现最佳效果,但需权衡性能和环境依赖。
Java实现HTML转PDF的方法多种多样,开发者应根据项目需求、样式复杂度和性能要求选择合适的工具,iText适合基础转换,Flying Saucer提供较好的CSS支持,而浏览器自动化工具则能实现高保真效果,通过合理选择和组合这些工具,可以高效满足不同场景下的HTML到PDF转换需求。


















