我的目标是在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);
});
JavaScript代码
<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可能丢失了一些字节,所以我在两端打印了字节数并且它们匹配。
最后,我认为Java可能会弄乱编码。因此,我从java中读取了文件,并将字节写入了单独的文件,并且生成的文件是正确的。
我想了解我是否忽略了某些内容。任何建议表示赞赏。预先感谢。
答案 0 :(得分:0)
我遇到了同样的问题:使用当前稳定的PDF.js版本( v2.0.943 ),JavaFX WebView中无法正确显示文本。基于图像的PDF可以正确呈现。
在查看PDF.js发行说明后,我发现v2.0.943引入了许多与字体有关的更改,并且似乎破坏了JavaFX中的字体呈现。
好消息是,当前的预发行版,v2.1.266具有some bugfixes关于字体的处理,它解决了文本渲染问题 >在JavaFX WebView中。
如果您对预发行版不满意,可以使用v1.10.100,尽管我建议使用最新版本,但文本渲染也适用于该版本,因为它似乎可以渲染不同的字体更好。