Использование pdf.js для отображения pdf из исходных данных

Я только начинаю с pdf.js, и я пытаюсь загрузить pdf файл из необработанных pdf-данных. Я видел код:

PDFJS.getPdf('cwpdf.pdf', function getPdfHelloWorld(data) { 
   ...
}

Но мне интересно, есть ли способ загрузить PDF из необработанных pdf-данных, а не из имени файла. Возможно ли это?

Ответы

Ответ 1

Я собрал некоторый полный код и смог найти проблему с решением ниже:

var int8View = new Uint8Array(...); //populate int8View with the raw pdf data
PDFJS.getDocument(int8View).then(function(pdf) {
}

При использовании этого решения я столкнулся с проблемой, которую видели другие пользователи (@MurWade и @user94154) - сообщение об ошибке stream must have data. Похоже, проблема заключается в следующей строке:

var int8View = new Uint8Array(...);

Массив, содержащий данные, не создается должным образом, поскольку данные не находятся в ожидаемом формате. Следовательно, эта строка работает в некоторых случаях, но может не работать в общем случае.

Я собрал полное решение, которое, похоже, работает лучше. Он загружает PDF файл и преобразует его в необработанный поток PDF. Это только для целей тестирования, в реальном мире поток PDF, вероятно, будет получен другим способом. Вы можете проверить поток в отладчике, и он будет отображаться как обычный текст. Ниже приведена ключевая строка кода, чтобы этот образец работал. Вместо этого преобразование необработанного потока PDF в массив, преобразование его в данные.

var docInitParams = { data: pdfraw };

Затем продолжайте загрузку данных. Ниже приведен полный рабочий пример загрузки стандартного необработанного потока PDF и его отображения. В качестве отправной точки я использовал PDF-образец PDF JS hello. Пожалуйста, дайте мне знать в комментариях, если это необходимо для разъяснения.

'use strict';

PDFJS.getDocument('helloworld.pdf').then(function(pdf) {


  pdf.getData().then(function(arrayBuffer) {
    var pdfraw = String.fromCharCode.apply(null, arrayBuffer);

    var docInitParams = {
      data: pdfraw
    };
    PDFJS.getDocument(docInitParams).then(function(pdfFromRaw) {
      pdfFromRaw.getPage(1).then(function(page) {
        var scale = 1.5;
        var viewport = page.getViewport(scale);

        var canvas = document.getElementById('the-canvas');
        var context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;

        var renderContext = {
          canvasContext: context,
          viewport: viewport
        };
        page.render(renderContext);
      });
    });
  });
});

Ответ 2

Хорошо, так как никто другой не ответил, я опубликую свои выводы. Я понял, что да, можно загрузить файл PDF из необработанных данных. То, как это можно сделать, - это использовать UInt8Array, заполненный данными вместо URL-адреса, где хранится файл pdf.

Пример кода для этого ниже:

var int8View = new Uint8Array(...); //populate int8View with the raw pdf data
PDFJS.getDocument(int8View).then(function(pdf) {

}