【问题标题】:Displaying Pdf in Javafx using PDFJS library in Webview在 Webview 中使用 PDFJS 库在 Javafx 中显示 Pdf
【发布时间】:2019-05-18 01:01:53
【问题描述】:

我的目标是在我的 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. 有问题的 pdf 文件可以在 adobe reader、firefox 和 edge 浏览器中正确打开。

  2. 我认为问题可能是 PDFJS 库。所以我尝试将我的pdf文件放在WEB目录中并打开viewer.html。出乎我的意料 pdf显示正确。

  3. 我认为当我将数据从 Java 发送到 Javascript 时可能会丢失一些字节。所以我在每一端打印了字节数,它们匹配。

  4. 最后,我认为 java 可能会弄乱编码。所以我从java读取文件并将字节写入单独的文件,生成的文件是正确的。

我试图了解我是否忽略了某些东西。任何建议表示赞赏。提前致谢。

这是我的 pdf 呈现后的样子:-

【问题讨论】:

  • 不知道为什么这被标记为上述链接的重复。用户试图通过 url 加载 pdf,而我传递的是 base64 编码的字节数组。他们正在谈论的错误,在 java 9 中已修复,与我提到的问题无关。请在将它们标记为重复之前阅读完整的描述和给出的代码,因为这会浪费其他人的时间。
  • 你用的是什么版本的java?看着您附加的图片,您可能会认为这是与字体有关的问题。
  • 您需要停止假设并阅读 java 站点上的错误和我的问题。 Java 网站清楚地声明 webview 永远不会被填充,这正是用户在您发布的链接中报告的内容。这是java网站上的错误链接:bugs.openjdk.java.net/browse/JDK-8180825另外,如果您阅读我上面写的内容,您就会明白我能够正确加载一些pdf文件。
  • 没有什么是一成不变的。您是否错过了“可能重复”的部分?强调“可能”。没有任何时间被浪费。每个人都可以过来看看,然后根据他们从帖子中得到的信息继续前进。

标签: javascript java javafx javafx-8 pdfjs


【解决方案1】:

我遇到了同样的问题:没有文本会在 JavaFX WebView 中正确呈现,使用截至今天 (v2.0.943) 的 PDF.js 的当前稳定版本。基于图像的 PDF 可以正确呈现。

查看 PDF.js 发行说明,我发现 v2.0.943 引入了许多与字体相关的更改,并且似乎破坏了 JavaFX 中的字体呈现。

好消息是当前的预发布版v2.1.266 在字体处理方面有some bugfixes,它修复了JavaFX 中的文本呈现问题网络视图。

如果您对使用预发行版感到不舒服,可以使用v1.10.100,文本渲染也适用于此版本,尽管我建议使用最新版本,因为它似乎可以更好地渲染不同的字体。

【讨论】:

  • 谢谢 Oizulain。这就像一个魅力。我尝试了 2.1.266 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
相关资源
最近更新 更多