使用Webview中的PDFJS库在Javafx中显示Pdf

时间:2018-12-17 16:12:17

标签: javascript java javafx javafx-8 pdfjs

我的目标是在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呈现后的样子:- enter image description here

1 个答案:

答案 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,尽管我建议使用最新版本,但文本渲染也适用于该版本,因为它似乎可以渲染不同的字体更好。