在 Webview 中使用 PDFJS 库在 Javafx 中显示 Pdf
Displaying Pdf in Javafx using PDFJS library in Webview
我的目标是在我的 JavaFX 应用程序中显示 pdf 文档。经过研究,我发现了 Mozilla 的 PDFJS 库,发现它非常有用。我正在做的是从 JAVA 读取 PDF 文件作为字节数组并在 Web 视图中调用 js 代码。这是代码。
JAVA 代码
byte[] data = Files.readAllBytes(Paths.get("D:\test\test.pdf"));
String base64 = Base64.getEncoder().encodeToString(data);
btn.setOnMouseClicked(e -> {
String js = "openFileFromBase64('" + base64 + "')";
engine.executeScript(js);
});
Java脚本代码
<script>
var openFileFromBase64 = function(data) {
var arr = base64ToArrayBuffer(data);
PDFViewerApplication.open(arr);
}
function base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(new ArrayBuffer(len));
alert(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
问题
我可以很好地渲染一些 pdf 文件,但我有一些 pdf 文件无法正确打开。所以我做了一些分析,发现以下内容:-
有问题的 pdf 文件可以在 adobe reader、firefox 和 edge 浏览器中正确打开。
我认为问题可能出在 PDFJS 库上。所以我尝试将我的 pdf 文件放在 WEB 目录中并打开 viewer.html。出乎我的意料
pdf 显示正确。
我想当我从 Java 发送数据到 Javascript.So 时可能丢失了一些字节我在每一端打印了字节数并且它们匹配。
最后,我认为 java 可能搞乱了编码。所以我从 java 读取文件并将字节写入单独的文件,生成的文件是正确的。
我正在努力了解我是否忽略了什么。任何建议表示赞赏。提前致谢。
这是我的 pdf 渲染后的样子:-
我遇到了同样的问题:没有文本可以正确呈现 在 JavaFX WebView 中使用 PDF.js 的当前稳定版本( v2.0.943)。基于图像的 PDF 可以正确呈现。
查看 PDF.js 发行说明,我发现 v2.0.943 引入了许多与字体相关的更改,并且似乎破坏了 JavaFX 中的字体渲染。
好消息是当前预发布,v2.1.266 has some bugfixes关于字体的处理,它修复了文本渲染问题 在 JavaFX WebView 中。
如果你觉得使用预发布版本不方便,你可以使用 v1.10.100,文本渲染也适用于这个版本,虽然我建议使用最新版本,因为它似乎渲染不同字体好多了。
我的目标是在我的 JavaFX 应用程序中显示 pdf 文档。经过研究,我发现了 Mozilla 的 PDFJS 库,发现它非常有用。我正在做的是从 JAVA 读取 PDF 文件作为字节数组并在 Web 视图中调用 js 代码。这是代码。
JAVA 代码
byte[] data = Files.readAllBytes(Paths.get("D:\test\test.pdf"));
String base64 = Base64.getEncoder().encodeToString(data);
btn.setOnMouseClicked(e -> {
String js = "openFileFromBase64('" + base64 + "')";
engine.executeScript(js);
});
Java脚本代码
<script>
var openFileFromBase64 = function(data) {
var arr = base64ToArrayBuffer(data);
PDFViewerApplication.open(arr);
}
function base64ToArrayBuffer(base64) {
var binary_string = window.atob(base64);
var len = binary_string.length;
var bytes = new Uint8Array(new ArrayBuffer(len));
alert(len);
for (var i = 0; i < len; i++) {
bytes[i] = binary_string.charCodeAt(i);
}
return bytes.buffer;
}
问题
我可以很好地渲染一些 pdf 文件,但我有一些 pdf 文件无法正确打开。所以我做了一些分析,发现以下内容:-
有问题的 pdf 文件可以在 adobe reader、firefox 和 edge 浏览器中正确打开。
我认为问题可能出在 PDFJS 库上。所以我尝试将我的 pdf 文件放在 WEB 目录中并打开 viewer.html。出乎我的意料 pdf 显示正确。
我想当我从 Java 发送数据到 Javascript.So 时可能丢失了一些字节我在每一端打印了字节数并且它们匹配。
最后,我认为 java 可能搞乱了编码。所以我从 java 读取文件并将字节写入单独的文件,生成的文件是正确的。
我正在努力了解我是否忽略了什么。任何建议表示赞赏。提前致谢。
这是我的 pdf 渲染后的样子:-
我遇到了同样的问题:没有文本可以正确呈现 在 JavaFX WebView 中使用 PDF.js 的当前稳定版本( v2.0.943)。基于图像的 PDF 可以正确呈现。
查看 PDF.js 发行说明,我发现 v2.0.943 引入了许多与字体相关的更改,并且似乎破坏了 JavaFX 中的字体渲染。
好消息是当前预发布,v2.1.266 has some bugfixes关于字体的处理,它修复了文本渲染问题 在 JavaFX WebView 中。
如果你觉得使用预发布版本不方便,你可以使用 v1.10.100,文本渲染也适用于这个版本,虽然我建议使用最新版本,因为它似乎渲染不同字体好多了。