2012-06-28 26 views
15

Estoy empezando con pdf.js y estoy tratando de cargar un archivo pdf a partir de los datos brutos en pdf. He visto el código:Uso de pdf.js para visualizar pdf desde datos sin formato

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

Pero estoy preguntando si hay alguna manera de cargar un PDF a partir de los datos PDF primas en lugar de desde el nombre del archivo. es posible?

Respuesta

5

junté algo de código completo y era capaz de encontrar el problema con la solución a continuación:

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

Al utilizar esta solución Corrí en el problema que otros usuarios han visto (@MurWade y @ user94154) - el mensaje de error stream must have data. Parece que el problema está en la línea siguiente:

var int8View = new Uint8Array(...); 

La matriz que contiene los datos no quede adecuadamente creado, ya que los datos no está en el formato esperado. Por lo tanto, esta línea funciona en algunos casos, pero podría no funcionar en el caso general.

He creado una solución completa, que parece funcionar mejor. Carga un archivo PDF y lo convierte en una secuencia de PDF sin formato. Esto es solo para fines de prueba, en un ejemplo del mundo real, la transmisión en PDF probablemente se recibirá de una manera diferente. Puede examinar la secuencia en un depurador y se mostrará como texto sin formato. A continuación se muestra la línea clave del código para que esta muestra funcione. En lugar de convertir la secuencia de PDF sin formato a una matriz, conviértala en datos.

var docInitParams = { data: pdfraw }; 

Luego continúe con la carga de los datos. A continuación se muestra la muestra de trabajo completa de cómo cargar un flujo de PDF sin formato estándar y mostrarlo. Solía ​​PDF JS hello world sample como punto de partida. Por favor, hágamelo saber en los comentarios si alguna aclaración es necesaria sobre esto.

'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

¡Agradable, aceptando esta respuesta ya que parece más completa que la original! – Swiss

+0

¡Gracias! Avíseme si puedo hacer algo para mejorarlo. –

+0

@ user94154, ¿la solución anterior responde su pregunta? –

2

Bueno, ya que nadie más ha respondido, publicaré mis conclusiones. Descubrí que sí, es posible cargar un archivo pdf a partir de los datos brutos. La forma en que esto se puede hacer es usar un UInt8Array rellenado con datos en lugar de la url donde se almacena el archivo pdf.

Código de ejemplo para hacer esto es el siguiente:

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

} 
+0

Esto no funcionó para mí. Obtengo el error 'stream must have'' – MurWade

+0

Obtengo el mismo error @MurWade. Me encantaría * tener esto arreglado. – user94154

+0

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

Cuestiones relacionadas