我的目标是在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文件无法正确打开。所以我进行了一些分析并发现以下情况:
Adobe阅读器、Firefox和Edge浏览器可以正确打开有问题的PDF文件。
我认为问题可能是PDFJS库。所以我尝试将我的PDF文件放置在WEB目录中并打开viewer.html。令我惊讶的是,PDF文件显示正确。
我认为可能是从Java到JavaScript发送数据时丢失了一些字节。所以我打印了每个端口上的字节数,并且它们匹配。
最后,我想到Java可能会破坏编码。因此,我从Java中读取文件并将字节写入单独的文件,生成的文件是正确的。
我正在尝试了解是否有什么我忽视的地方。欢迎任何建议。提前感谢您的帮助。