2012-06-28 3 views
15

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

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

Но мне интересно, если есть способ загрузки PDF из необработанных данных в формате PDF, а не из файла. Это возможно?

ответ

5

я собрал некоторый полный код и был в состоянии найти проблемы с ниже решения:

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); 
 
     }); 
 
    }); 
 
    }); 
 
});

+0

Приятно, принимая этот ответ, поскольку он кажется более полным, чем мой оригинальный! – Swiss

+0

Спасибо! Сообщите мне, могу ли я сделать что-нибудь, чтобы улучшить его. –

+0

@ user94154, делает ли это решение на ваш вопрос? –

2

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

Пример кода, чтобы сделать это ниже:

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

} 
+0

Это не работало для меня. Я получаю сообщение об ошибке «поток должен иметь данные» – MurWade

+0

Я получаю ту же ошибку @MurWade. Я бы * хотел, чтобы это было исправлено. – user94154

+0

http://jsperf.com/string-to-uint8array – user94154