Документ pdf.программы перевода файла в формат PDF с помощью base64 и исходный файл, а не URL-адрес
Я пытаюсь отобразить страницу из pdf с помощью pdf.js
обычно, используя url, я могу сделать это:
PDFJS.getDocument("http://www.server.com/file.pdf").then(function getPdfHelloWorld(pdf) {
//
// Fetch the first page
//
pdf.getPage(1).then(function getPageHelloWorld(page) {
var scale = 1.5;
var viewport = page.getViewport(scale);
//
// Prepare canvas using PDF page dimensions
//
var canvas = document.getElementById('the-canvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
//
// Render PDF page into canvas context
//
page.render({canvasContext: context, viewport: viewport});
});
});
но в этом случае у меня есть файл в base64, а не url:
data:application/pdf;base64,JVBERi0xLjUKJdDUxdgKNSAwIG9iaiA8PAovTGVuZ3RoIDE2NjUgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjarVhLc9s2...
Как это можно сделать?
3 ответа:
из исходного кода по адресу http://mozilla.github.com/pdf.js/build/pdf.js
/** * This is the main entry point for loading a PDF and interacting with it. * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR) * is used, which means it must follow the same origin rules that any XHR does * e.g. No cross domain requests without CORS. * * @param {string|TypedAray|object} source Can be an url to where a PDF is * located, a typed array (Uint8Array) already populated with data or * and parameter object with the following possible fields: * - url - The URL of the PDF. * - data - A typed array with PDF data. * - httpHeaders - Basic authentication headers. * - password - For decrypting password-protected PDFs. * * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object. */
таким образом, для получения документа используется стандартный XMLHttpRequest(XHR). Проблема с этим заключается в том, что XMLHttpRequests не поддерживают data: uris (например. данные: application / pdf; base64, JVBERi0xLjUK...).
но есть возможность передачи типизированного массива Javascript в функцию. Единственное, что вам нужно сделать, это преобразовать строку base64 в Uint8Array. Вы можно использовать эту функцию, найденную в https://gist.github.com/1032746
var BASE64_MARKER = ';base64,'; function convertDataURIToBinary(dataURI) { var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length; var base64 = dataURI.substring(base64Index); var raw = window.atob(base64); var rawLength = raw.length; var array = new Uint8Array(new ArrayBuffer(rawLength)); for(var i = 0; i < rawLength; i++) { array[i] = raw.charCodeAt(i); } return array; }
tl; dr
var pdfAsDataUri = "data:application/pdf;base64,JVBERi0xLjUK..."; // shortened var pdfAsArray = convertDataURIToBinary(pdfAsDataUri); PDFJS.getDocument(pdfAsArray)
согласно примерам кодировка base64 напрямую поддерживается, хотя я сам ее не тестировал. Возьмите строку base64 (полученную из файла или загруженную любым другим методом, POST / GET, websockets и т. д.), превратите ее в двоичный файл с atob, а затем проанализируйте это, чтобы getDocument на API PDFJS, например
PDFJS.getDocument({data: base64PdfData});
Codetoffel ответ работает просто отлично для меня, хотя.
использовал принятый ответ для проверки IE и преобразования dataURI в UInt8Array; принятая форма PDFJS
Ext.isIE ? pdfAsDataUri = me.convertDataURIToBinary(pdfAsDataUri): ''; convertDataURIToBinary: function(dataURI) { var BASE64_MARKER = ';base64,', base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length, base64 = dataURI.substring(base64Index), raw = window.atob(base64), rawLength = raw.length, array = new Uint8Array(new ArrayBuffer(rawLength)); for (var i = 0; i < rawLength; i++) { array[i] = raw.charCodeAt(i); } return array; },