JavaFX WebView中PDF.js的PDFViewerApplication.page设置无效问题咨询
我之前在项目里也碰到过一模一样的情况,当时折腾了好一会儿才搞明白问题所在——直接给PDFViewerApplication.page赋值不会触发PDF.js内部的页面切换逻辑,这和你用open方法能正常工作的原因刚好对应:open是PDFViewerApplication提供的官方API,内部会处理从文档加载到视图更新的全流程,而直接改page属性只是修改了一个变量,没有同步到渲染视图上。
问题根源
PDFViewerApplication的page属性本质上是一个只读的快捷访问器(或者说它的setter没有绑定视图更新的逻辑),真正控制页面显示的是它内部的pdfViewer实例。你直接改page的值,只会改变属性本身,不会通知渲染引擎去切换页面。
正确的解决方案
你需要通过PDFViewerApplication.pdfViewer的currentPageNumber属性来设置页面,这个属性是和视图渲染绑定的,修改它会自动触发页面跳转。
在你的加载成功回调里,把原来的代码替换成:
PDFViewerApplication.pdfViewer.currentPageNumber = 12;
额外的时机保障
有时候WebEngine的加载事件触发时,PDF.js可能还在异步渲染文档(比如大文件),这时候直接设置页面可能还是没效果。保险起见,你可以监听PDF.js内部的documentLoaded事件,确保文档完全初始化后再执行页面切换:
// 先监听文档加载完成事件 PDFViewerApplication.eventBus.on('documentLoaded', function() { // 再跳转到目标页面 PDFViewerApplication.pdfViewer.currentPageNumber = 12; });
为什么open方法能正常工作
PDFViewerApplication.open()是官方提供的公开API,内部会处理文档解析、视图初始化、事件绑定等所有必要流程,所以调用它能正常触发PDF的加载和显示。而直接改page属性相当于绕过了这些内部机制,自然不会有效果。
内容的提问来源于stack exchange,提问作者Milan Novkovic

