我正在编写一个JavaFX应用程序,它使用WebView访问网站并从其页面中提取数据。在某些时候,我想点击一个链接,打开一个显示PDF文件的新窗口。随着JavaFX中PDF支持的运气,我想一个可能的解决方案可能是读取该PDF的http响应并创建PDF格式的二进制数据。
PDF页面的网址是动态的,因此我没有文件的实际名称,因此我无法使用第三方工具生成pdf。
任何想法都会非常感激。
由于
答案 0 :(得分:1)
启动基于Swing的PDF查看器
以下是我在JavaFX中编写的小型Web浏览器(名为code extract)中的willow-browser:
webEngine.locationProperty().addListener(new ChangeListener<String>() {
@Override public void changed(ObservableValue<? extends String> observableValue, String oldLoc, String newLoc) {
if (newLoc.endsWith(".pdf")) {
try {
final PDFViewer pdfViewer = new PDFViewer(false);
pdfViewer.openFile(new URL(newLoc));
} catch (Exception ex) {
// handle bad pdf url . . . most likely no action required
}
}
}
}
该代码使用了第三方基于Swing的pdf查看器,它启动它来加载URL。 由于Swing pdf查看器在一个单独的窗口中运行,因此没有任何Swing / JavaFX集成问题 - 它似乎正常工作。
要使其工作,您可以下载柳树浏览器源的副本并构建它(网站上托管的样本二进制文件不包括pdf查看器,只有源构建版本可以。)
理想情况下,除了uri字符串之外,代码还会查询http内容类型以确定该文件是pdf,但这需要一些低级别的网络访问,这在WebView的情况下很难获得。如果您不担心在许多站点上检测pdf内容时非常准确,那么如果您不使用内容类型来确定pdf则无关紧要。
如果Swing pdf查看器没有为您提供所需的体验,您可以尝试其他pdf查看器,例如: jpedalfx或ICEpdf。
启动原生PDF查看器
如果您愿意,可以在pdf网址上拨打HostServices.showDocument(uri),这将触发在本地网络浏览器中打开网址,其中一些内置pdf查看器或设置为使用Acrobat查看pdf阅读器。
确定要查看的pdf的网址的代码在这种情况下与上面的代码相同。