下面我将为你详细介绍几种主流的 Java 库和方法,从最推荐到其他备选方案,并提供完整的代码示例。

核心挑战
PDF 和 HTML 是两种 fundamentally different 的格式:
- PDF (Portable Document Format): 是一种“固定布局”的格式,像一张图片,精确控制了每个元素的位置、大小和外观,它的本质是描述“页面应该长什么样”。
- HTML (HyperText Markup Language): 是一种“流式布局”的格式,内容会根据浏览器窗口的大小和元素的类型(如
<p>,<div>)进行重新排列。
转换过程是一个“逆向工程”过程,充满了挑战:
- 布局恢复: 从固定的 PDF 布局推断出原始的 HTML 结构(如哪个文本块是标题,哪个是段落)非常困难,简单的 PDF 转换通常会用
<div>和绝对定位来模拟 PDF 布局,但这不利于 SEO 和响应式设计。 - 字体处理: PDF 可能使用嵌入的特殊字体,HTML 需要通过 Web 字体(@font-face)来加载。
- 图片和矢量图形: PDF 中的图片需要被提取并保存为独立的文件(如 PNG, JPG),然后在 HTML 中通过
<img>标签引用。 - 表格和列表: PDF 中的表格和列表需要被正确地解析并转换为对应的 HTML 标签(
<table>,<ul>,<ol>)。
推荐使用 Apache PDFBox (开源)
Apache PDFBox 是一个功能强大的开源 Java 工具库,用于处理 PDF 文档,它本身不直接提供 PDF 转 HTML 的功能,但可以通过其渲染引擎将 PDF 页面渲染为图像,或者利用其文本提取能力来构建 HTML。
对于“准确保真”的转换,一个更成熟的方案是 pdfbox-html,这是一个基于 PDFBox 的库,它专门致力于将 PDF 转换为 HTML,并且做得相当不错,它保留了文本的顺序、基本样式,并处理了分页。

添加依赖
如果你使用 Maven,在你的 pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.29</version> <!-- 请使用最新版本 -->
</dependency>
<!-- 如果你使用 pdfbox-html,它可能依赖于 pdfbox -->
<!-- 注意:pdfbox-html 可能不是一个官方子项目,请从其官方仓库获取最新依赖 -->
<!-- 一个常见的实现是使用 com.github.librepdf:pdfbox-html -->
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>pdfbox-html</artifactId>
<version>2.1.0</version> <!-- 请检查最新版本 -->
</dependency>
代码示例 (使用 PDFBox + pdfbox-html)
这个示例会读取一个 PDF 文件,将其转换为单个 HTML 文件,并将所有图片提取到 output_images 文件夹中。
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;
import com.github.librepdf.pdfbox.HtmlRenderer;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
public class PdfToHtmlConverter {
public static void main(String[] args) {
String pdfFilePath = "path/to/your/document.pdf";
String outputHtmlPath = "output/document.html";
String outputImagesDir = "output_images";
try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {
// 1. 创建输出目录(如果不存在)
Files.createDirectories(Paths.get(outputImagesDir));
// 2. 创建 HTML 渲染器
// HtmlRenderer 会处理文本提取和 HTML 结构构建
HtmlRenderer htmlRenderer = new HtmlRenderer(document);
// 3. 设置可选参数
htmlRenderer.setExtractImages(true); // 提取图片
htmlRenderer.setImageOutputDirectory(new File(outputImagesDir)); // 图片输出目录
// htmlRenderer.setWritePageHeaderAndFooter(true); // 是否写页眉页脚
// 4. 渲染并写入 HTML 文件
try (OutputStream htmlOutputStream = Files.newOutputStream(Paths.get(outputHtmlPath))) {
htmlRenderer.render(htmlOutputStream);
}
System.out.println("PDF 转换 HTML 成功!");
System.out.println("HTML 文件位置: " + outputHtmlPath);
System.out.println("图片文件位置: " + new File(outputImagesDir).getAbsolutePath());
} catch (IOException e) {
System.err.println("PDF 转换 HTML 失败: " + e.getMessage());
e.printStackTrace();
}
}
}
优点:
- 开源免费: 无需支付任何费用。
- 功能强大: 基于 PDFBox,底层功能非常扎实。
- 效果较好:
pdfbox-html能较好地保留文本顺序和基本布局,生成的 HTML 在视觉上与原 PDF 接近。
缺点:

- 布局非完美: 对于复杂布局的 PDF,转换后的 HTML 可能仍然使用绝对定位,而不是理想的语义化标签。
- 依赖第三方:
pdfbox-html不是 Apache PDFBox 的官方核心库,需要单独维护。
商业库 (如 Aspose.Words for Java)
如果你的项目预算允许,商业库通常是效果最好、最省心的选择,它们在布局还原、字体处理、复杂表格等方面有巨大的优势。
Aspose.Words for Java 是业界领先的文档处理库,它不仅能处理 Word,也能完美地读取 PDF 并将其转换为高质量的 HTML。
添加依赖
Aspose 提供了 Maven 仓库,但通常需要先下载并安装 JAR 文件到你的本地仓库或项目中。
<!-- 你需要从 Aspose 官网下载 JAR 并手动安装到你的仓库 -->
<dependency>
<groupId>com.aspose</groupId>
<artifactId>aspose-words</artifactId>
<version>23.8</version> <!-- 请使用最新版本 -->
</dependency>
注意: Aspose 是商业软件,需要购买许可证才能在产品环境中使用,开发时可以使用免费的试用版,但会有一些限制。
代码示例
Aspose 的 API 设计得非常直观。
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import java.io.File;
public class AsposePdfToHtmlConverter {
public static void main(String[] args) {
String pdfFilePath = "path/to/your/document.pdf";
String outputHtmlPath = "output/aspose_document.html";
try {
// 1. 加载 PDF 文档
// Aspose.Words 会自动解析 PDF 的内容和结构
Document doc = new Document(pdfFilePath);
// 2. 保存为 HTML
// SaveFormat.HTML 会生成一个包含 CSS 样式的 HTML 文件,布局还原效果极佳
doc.save(outputHtmlPath, SaveFormat.HTML);
System.out.println("PDF 转换 HTML 成功 (使用 Aspose)!");
System.out.println("HTML 文件位置: " + outputHtmlPath);
} catch (Exception e) {
System.err.println("PDF 转换 HTML 失败 (使用 Aspose): " + e.getMessage());
e.printStackTrace();
}
}
}
优点:
- 顶级质量: 布局还原、样式保留、表格处理等方面都是业界顶尖水平。
- API 简洁: 代码非常简单,一行
save方法即可完成。 - 功能全面: 支持多种高级选项,如将 HTML 拆分为多个文件、导出为响应式 HTML 等。
缺点:
- 收费: 需要购买许可证,成本较高。
使用 iText (开源)
iText 是另一个非常著名的 Java PDF 库,它提供了商业和开源两个版本,开源版本(iText 5)的 PDF 到 HTML 转换功能相对基础,而商业版本(iText 7)则提供了更强大的转换能力。
添加依赖 (iText 7)
<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>
注意: iText 5 的 AGPL 开源协议有“传染性”,如果你的项目是私有的,可能需要购买商业许可证,iText 7 有更宽松的 AGPL 许可证,但商业使用仍需购买许可。
代码示例 (iText 7)
iText 7 的 html2pdf 模块主要是为了将 HTML 转换为 PDF,将 PDF 转换为 HTML 需要更底层的操作,或者使用其商业版提供的专门转换器,对于“PDF to HTML”这个特定任务,iText 并不是最直接的选择。
总结与选择建议
| 特性/库 | Apache PDFBox + pdfbox-html | Aspose.Words for Java | iText |
|---|---|---|---|
| 类型 | 开源 | 商业 | 开源/商业 |
| 成本 | 免费 | 需购买许可证 | 开源版有协议限制,商业版需购买 |
| 转换质量 | 良好,能保持基本布局和顺序 | 优秀,布局还原最接近原 PDF | 一般 (开源版),优秀 (商业版) |
| 易用性 | 中等,需要了解 PDFBox | 非常简单 | 中等 |
| 推荐场景 | 个人项目、预算有限、对质量要求不是极致的项目 | 企业级应用、对文档保真度要求高、预算充足的项目 | 已经在使用 iText 进行其他 PDF 操作的项目 |
如何选择?
-
首选推荐: Apache PDFBox + pdfbox-html,对于绝大多数 Java 这是在“成本”和“效果”之间最佳平衡的选择,它足够强大,而且是完全免费的。
-
追求极致效果: 如果你的项目(如电子书发布、合同系统)对文档的最终呈现效果有极高的要求,并且有相应的预算,Aspose.Words 是不二之选,它能为你节省大量的调试和优化时间。
-
已有 iText 技术栈: 如果你已经在项目中广泛使用 iText 5 或 7,并且已经购买了商业许可,那么可以考虑使用其提供的转换功能,以保持技术栈的统一。
希望这个详细的指南能帮助你顺利完成 PDF 转 HTML 的任务!
