使用PDFJS库在JavaFX中通过Webview显示PDF文件

3

我的目标是在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文件无法正确打开。所以我进行了一些分析并发现以下情况:

  1. Adobe阅读器、Firefox和Edge浏览器可以正确打开有问题的PDF文件。

  2. 我认为问题可能是PDFJS库。所以我尝试将我的PDF文件放置在WEB目录中并打开viewer.html。令我惊讶的是,PDF文件显示正确。

  3. 我认为可能是从Java到JavaScript发送数据时丢失了一些字节。所以我打印了每个端口上的字节数,并且它们匹配。

  4. 最后,我想到Java可能会破坏编码。因此,我从Java中读取文件并将字节写入单独的文件,生成的文件是正确的。

我正在尝试了解是否有什么我忽视的地方。欢迎任何建议。提前感谢您的帮助。

这是我的PDF在渲染后的样子:- enter image description here


可能是以下问题的重复:PDF在JavaFX WebView中完全无法加载 - SedJ601
不确定为什么这被标记为提到的链接的重复。用户正在尝试通过URL加载PDF,而我正在传递经过Base64编码的字节数组。他们谈论的错误与我提到的问题无关,这个错误在Java 9中已经修复。请在将它们标记为重复之前阅读完整的描述和给定的代码,因为这会浪费其他人的时间。 - Manik
你使用的Java版本是什么?从你附加的图片来看,可以推断这是与字体相关的问题。 - SedJ601
你需要停止猜测并阅读Java网站上的错误和我的问题。Java网站明确指出Webview从未被填充,这正是用户在您发布的链接中报告的情况。这是Java网站上错误的链接:https://bugs.openjdk.java.net/browse/JDK-8180825此外,如果您阅读我上面写的内容,那么您就会理解我能够正确加载一些PDF文件。 - Manik
没有什么是铁板钉钉的。你错过了它说“可能重复”的部分吗?强调的是“可能”。没有时间被浪费。每个人都可以来看看,根据他们从帖子中获得的内容向前迈进。 - SedJ601
1个回答

2
我遇到了同样的问题:无法正确渲染任何文本,使用今天(v2.0.943)PDF.js 的当前稳定版本在 JavaFX WebView 中。基于图像的 PDF 可以正确渲染。
查看 PDF.js 发布说明后,我发现 v2.0.943 引入了许多与字体相关的更改,并似乎破坏了 JavaFX 中的字体呈现。
好消息是 当前的预发布版 v2.1.266 具有关于处理字体的 一些错误修复,它解决了 JavaFX WebView 中的文本呈现问题
如果您不想使用预发布版本,可以使用v1.10.100,这个版本也支持文本渲染,但我建议使用最新版本,因为它似乎可以更好地呈现不同的字体。

谢谢Oizulain。这个非常有效。我试了2.1.266版本。 - Manik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接