2012-08-23 40 views
53

que estoy tratando de hacer que una página de un pdf con pdf.jspdf.js: Representación de un archivo PDF utilizando una fuente de archivo de base 64 en lugar de URL

Normalmente, el uso de una dirección URL, que puedo hacer esto:

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

Pero en este caso, tengo el archivo de base 64 en lugar de una dirección URL:

data:application/pdf;base64,JVBERi0xLjUKJdDUxdgKNSAwIG9iaiA8PAovTGVuZ3RoIDE2NjUgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjarVhLc9s2... 

¿Cómo se puede hacer esto?

Respuesta

82

desde el código fuente en 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. 
*/ 

Así que un XMLHttpRequest estándar (XHR) se utiliza para recuperar el documento. El problema con esto es que XMLHttpRequests no admite datos: uris (por ejemplo, datos: application/pdf; base64, JVBERi0xLjUK ...).

Pero existe la posibilidad de pasar una matriz Javascript Javascriptcida a la función. Lo único que debe hacer es convertir la cadena base64 a Uint8Array. Puede utilizar esta función se encuentran en 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) 
+1

así que será posible buscar el binario de pdf y mostrarlo en el visor de PDF usando pdf.js – dakait

+0

@Codetoffel me ahorra algunas horas –

+1

Buen trabajo. Pero, ¿qué sucede si la fuente se recupera en PDF mediante una llamada RESTful en un buffer o blob? Publiqué una pregunta aquí: http://stackoverflow.com/questions/24288221/pdf-js-render-pdf-using-an-arraybuffer-or-blob-instead-of-url – witttness

0

Se utiliza la respuesta aceptada para hacer una verificación para IE y convertir el DataURI a UInt8Array; una forma aceptada por 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; 
 
     },

0

According to the examples codificación base64 se apoya directamente, aunque no lo he probado a mí mismo. Tome su cadena base64 (derivada de un archivo o cargada con cualquier otro método, POST/GET, websockets, etc.), conviértala en un binario con atob, y luego analice esto en getDocument en la API de PDFJS como PDFJS.getDocument({data: base64PdfData}); La respuesta de Codetoffel funciona bien para mí sin embargo.

Cuestiones relacionadas