在Java开发中,将HTML转换为PDF是一项常见需求,例如生成报表、电子书或文档导出功能,实现这一功能需要结合Java后端技术与HTML渲染引擎,以下是几种主流方案及其实现步骤,帮助开发者根据项目需求选择合适的方法。

使用iText库实现HTML转PDF
iText是Java领域广泛使用的PDF处理库,其iText 7版本提供了HtmlConverter工具类,支持将HTML字符串或文件直接转换为PDF,这种方法适合简单HTML场景,但对复杂CSS和JavaScript支持有限。
实现步骤:
-
添加依赖:在Maven项目的
pom.xml中引入iText核心依赖:<dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.2.5</version> <type>pom</type> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>4.0.3</version> </dependency> -
编写转换代码:
import com.itextpdf.html2pdf.HtmlConverter; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; public class HtmlToPdfConverter { public static void main(String[] args) { String htmlPath = "input.html"; String pdfPath = "output.pdf"; try (InputStream htmlStream = new FileInputStream(htmlPath); OutputStream pdfStream = Files.newOutputStream(Paths.get(pdfPath))) { HtmlConverter.convertToPdf(htmlStream, pdfStream); System.out.println("PDF生成成功:" + pdfPath); } catch (IOException e) { e.printStackTrace(); } } }
注意事项:
- iText默认不支持外部CSS文件和JavaScript,需将样式内联到HTML中。
- 对于中文字体,需额外注册字体资源,避免乱码问题:
FontProvider fontProvider = new DefaultFontProvider(true, false, false); fontProvider.addFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); HtmlConverter.convertToPdf(htmlStream, pdfStream, new ConverterProperties().setFontProvider(fontProvider));
使用Flying Saucer(xhtmlrenderer)实现复杂HTML转PDF
Flying Saucer是一个基于Java的XHTML渲染引擎,支持CSS 2.1和部分CSS 3样式,适合需要精确还原页面布局的场景(如打印样式)。
实现步骤:
-
添加依赖:

<dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf</artifactId> <version>9.1.22</version> </dependency> -
编写转换代码:
import org.xhtmlrenderer.pdf.ITextRenderer; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; public class FlyingSaucerConverter { public static void main(String[] args) { String htmlPath = "input.html"; String pdfPath = "output.pdf"; try (OutputStream os = new FileOutputStream(pdfPath)) { ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(new File(htmlPath)); renderer.layout(); renderer.createPDF(os); System.out.println("PDF生成成功:" + pdfPath); } catch (Exception e) { e.printStackTrace(); } } }
优化建议:
- 支持外部CSS和图片:需设置资源加载路径:
renderer.getSharedContext().setBaseURL("file:/path/to/resources/"); - 中文字体配置:通过
ITextFontResolver注册字体:ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("simhei.ttf", "UTF-8", true);
集成Headless浏览器(如PhantomJS或Selenium)
对于需要执行JavaScript或渲染动态HTML的场景(如单页应用),可通过无头浏览器将HTML渲染为图片,再转换为PDF。
实现步骤(以Selenium + Chrome为例):
-
添加依赖:
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.1.0</version> </dependency> -
编写转换代码:
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import java.io.File; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDImageXObject; public class SeleniumToPdf { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); ChromeOptions options = new ChromeOptions(); options.addArguments("--headless"); // 无头模式 WebDriver driver = new ChromeDriver(options); try { driver.get("http://example.com"); File screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); // 将截图转换为PDF(需结合PDFBox等库) PDDocument document = new PDDocument(); PDPage page = new PDPage(); document.addPage(page); PDImageXObject image = PDImageXObject.createFromFile(screenshot.getPath(), document); document.save("output.pdf"); document.close(); } catch (IOException e) { e.printStackTrace(); } finally { driver.quit(); } } }
局限性:
- 需安装浏览器驱动(如ChromeDriver),且版本需匹配。
- 转换效率较低,适合处理动态内容较少的场景。
商业解决方案对比
对于企业级应用,商业工具如Aspose.Words、Adobe PDF Library等提供更强大的HTML转PDF功能,支持复杂布局、表单、数字签名等特性,但需付费授权。

选择HTML转PDF方案时,需综合考虑HTML复杂度、CSS支持需求、动态内容处理能力及成本:
- 简单HTML:iText轻量级,适合基础转换;
- 复杂CSS/布局:Flying Saucer支持更完善的样式;
- 动态HTML:无头浏览器可处理JavaScript,但性能较低;
- 企业级需求:商业工具提供稳定性和高级功能。
无论哪种方案,都需注意字体乱码、资源路径、样式兼容性等细节问题,通过测试确保输出PDF的准确性。

















