Отображение PDF в Javafx с использованием библиотеки PDFJS в Webview - PullRequest
0 голосов
/ 17 декабря 2018

Моя цель - отобразить PDF-документы в моем приложении JavaFX.После исследования я наткнулся на библиотеку Mozilla PDFJS и нашел ее довольно полезной.Я читаю PDF-файл в виде байтового массива из JAVA и вызываю код 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 Browser.

  2. IЯ думал, что проблема может быть в библиотеке PDFJS.Поэтому я попытался поместить свой PDF-файл в каталог WEB и открыл viewer.html.К моему удивлению, pdf отображается правильно.

  3. Я подумал, что, возможно, некоторые байты теряются, когда я отправляю данные из Java в Javascript. Поэтому я напечатал количество байтов на каждом конце, и они совпадают.

  4. Наконец, я подумал, что Java может испортить кодировку.Поэтому я прочитал файл из java и записал байты в отдельный файл, и сгенерированный файл является правильным.

Я пытаюсь понять, пропустил ли я что-то.Любые предложения приветствуются.Заранее спасибо.

Вот как выглядит мой pdf после рендеринга: - enter image description here

1 Ответ

0 голосов
/ 19 февраля 2019

У меня была та же проблема: Ни один текст не будет отображаться правильно в JavaFX WebView с использованием текущей стабильной версии PDF.js на сегодняшний день ( v2.0.943 ).PDF-файлы, основанные на изображениях, отображаются правильно.

Взглянув на заметки о выпуске PDF.js, я обнаружил, что v2.0.943 внес много изменений, связанных со шрифтами, и, похоже, нарушил рендеринг шрифтов.в JavaFX.

Хорошей новостью является то, что текущий предварительный релиз , v2.1.266 имеет некоторые исправления , касающиеся обработки шрифтов и устраняет проблему с отображением текста в JavaFX WebView.

Если вы не чувствуете себя комфортно, используя предварительную версию, вы можете использовать v1.10.100 , рендеринг текста также работает с этой версией, хотя я рекомендую использовать последнюю версию, потому что онакажется, что делает различные шрифты намного лучше.

...