You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX应用嵌入PDF查看器遇报错,求免费开源简易实现方案

在JavaFX中显示PDF的简便开源方案

嘿,我之前也在JavaFX项目里折腾过PDF显示的需求,你遇到的pdf.js字符异常我也碰见过,大概率是资源加载时的编码或者路径问题导致的。不过确实有几个更省心的免费开源方案,给你分享下亲测好用的:

1. Apache PDFBox(纯Java实现,无需Web依赖)

Apache PDFBox是Apache基金会的开源PDF处理库,完全用Java编写,不需要依赖WebView,稳定性很高,适合JavaFX场景。

步骤:

  • 先添加Maven依赖(Gradle同理):
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.32</version> <!-- 可以替换为最新稳定版 -->
</dependency>
  • 核心代码示例:把PDF页面渲染成JavaFX的ImageView
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.ImageView;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

// 加载PDF文件
try (PDDocument document = PDDocument.load(new File("path/to/your.pdf"))) {
    PDFRenderer renderer = new PDFRenderer(document);
    // 渲染第一页(页码从0开始)
    BufferedImage bufferedImage = renderer.renderImageWithDPI(0, 96); // 96 DPI适配屏幕
    // 转成JavaFX的Image
    javafx.scene.image.Image fxImage = SwingFXUtils.toFXImage(bufferedImage, null);
    // 放到ImageView中显示
    ImageView imageView = new ImageView(fxImage);
    // 可以添加到Scene的布局里,比如ScrollPane
} catch (IOException e) {
    e.printStackTrace();
}

如果需要显示多页,可以循环渲染每一页,放到VBox或者ScrollPane里,还能轻松添加翻页、缩放等逻辑,灵活性拉满。

2. 修复WebView + pdf.js的字符异常问题

如果你还是想用pdf.js的方案,之前的SyntaxError: Invalid character '舖'大概率是HTML/JS文件编码不对,或者资源路径加载错误导致的乱码。可以试试这几个修复步骤:

  • 确保你的pdf.js相关文件(包括pdf.js、pdf.worker.js和加载用的HTML文件)都是UTF-8编码保存的;
  • 加载HTML文件时使用getResource()方式,避免相对路径的坑:
WebView webView = new WebView();
WebEngine engine = webView.getEngine();
// 假设HTML文件放在resources/pdf-viewer.html
URL url = getClass().getResource("/pdf-viewer.html");
if (url != null) {
    engine.load(url.toExternalForm());
}
  • 在HTML文件中正确引入pdf.js,比如:
<script src="pdf.js"></script>
<script>
    // 加载PDF的逻辑
    async function loadPDF() {
        const pdfUrl = "path/to/your.pdf";
        const pdfDoc = await pdfjsLib.getDocument(pdfUrl).promise;
        // 渲染第一页的示例
        const page = await pdfDoc.getPage(1);
        const viewport = page.getViewport({scale: 1});
        const canvas = document.getElementById('pdf-canvas');
        const context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;
        await page.render({canvasContext: context, viewport: viewport}).promise;
    }
    loadPDF();
</script>

这样基本能解决因路径或编码问题导致的乱码异常。

3. PDFViewerFX(专门的JavaFX PDF控件)

还有一个专门为JavaFX打造的开源控件PDFViewerFX,封装好了PDF显示的常用功能(翻页、缩放、搜索等),用起来特别省心。你可以通过Maven添加依赖:

<dependency>
    <groupId>com.github.ralfstuckert.pdfbox-layout</groupId>
    <artifactId>pdfviewerfx</artifactId>
    <version>1.0.0</version>
</dependency>

使用起来超简单:

import com.github.ralfstuckert.pdfbox.layout.viewer.PDFViewer;
import java.io.File;

PDFViewer viewer = new PDFViewer();
viewer.loadPDF(new File("path/to/your.pdf"));
// 把viewer直接添加到布局中即可,自带所有交互功能

这个控件已经把常用交互都封装好了,适合快速集成到项目里。


内容的提问来源于stack exchange,提问作者FX_Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:29:33