2012-06-28 16 views
15

Ho appena iniziato con pdf.js e sto provando a caricare un file pdf dai dati PDF grezzi. Ho visto il codice:Utilizzo di pdf.js per visualizzare il pdf dai dati grezzi

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

ma mi chiedo se non v'è alcun modo per caricare un file PDF a partire dai dati grezzi pdf invece che dal nome del file. È possibile?

risposta

5

ho messo insieme un po 'di codice completo e sono stato in grado di trovare il problema con la soluzione qui di seguito:

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

Quando si utilizza questa soluzione mi sono imbattuto nel problema che altri utenti hanno visto (@MurWade e @ user94154) - il messaggio di errore stream must have data. Sembra che il problema è nella seguente riga:

var int8View = new Uint8Array(...); 

La matrice contenente i dati non viene correttamente creato, in quanto i dati non è nel formato previsto. Pertanto, questa linea funziona per alcuni casi, ma potrebbe non funzionare nel caso generale.

Ho messo insieme una soluzione completa, che sembra funzionare meglio. Carica un file PDF e lo converte in un flusso PDF non elaborato. Questo è lì solo a scopo di test, in un esempio reale, lo stream PDF verrà probabilmente ricevuto in modo diverso. È possibile esaminare lo stream in un debugger e verrà visualizzato come testo normale. Di seguito è riportata la riga chiave del codice per far funzionare questo esempio. Invece di convertire il flusso PDF grezzo in un array, convertirlo in dati.

var docInitParams = { data: pdfraw }; 

Quindi procedere con il caricamento dei dati. Di seguito è riportato l'esempio completo di come caricare un flusso PDF raw standard e visualizzarlo. Ho usato il campione mondiale PDF JS hello come punto di partenza. Per favore fatemi sapere nei commenti se qualche chiarimento è necessario su questo.

'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

Bello, accettando questa risposta poiché sembra più completa della mia originale! – Swiss

+0

Grazie! Fammi sapere se posso fare qualcosa per migliorarci. –

+0

@ user94154, la soluzione sopra riportata risponde alla tua domanda? –

2

Bene, dato che nessun altro ha risposto, posterò i miei risultati. Ho capito che sì, è possibile caricare un file pdf dai dati grezzi. Il modo in cui questo può essere fatto è usare un UInt8Array popolato con i dati al posto dell'url dove si trova il file pdf.

il codice di esempio per fare questo è al di sotto:

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

} 
+0

Questo lavoro non ha ancora per me. ottengo l'errore 'stream deve avere dati' – MurWade

+0

Ho lo stesso errore @MurWade. Vorrei * amare * per farlo correggere. – user94154

+0

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

Problemi correlati