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
相关产品推荐
相关产品推荐

