2016-06-07 7 views
3

Wir implementieren PDFJS, um PDF-Dateien auf einer Website zu rendern.PDFJS und PDF-Codierung

Beim Versuch, ein PDFDocument/Viewer als ArrayBuffer zu initiieren, erhalten wir alle Arten von Fehlern und die Datei wird nicht gerendert. Beim Öffnen der gleichen Datei im Viewer von URL (DEFAULT_URL-Variable), die Datei gerendert fein.

Es gibt jedoch einige Dateien, die als Streams rendern. Wenn Sie diese Dateien im Editor vergleichen, werden sie unterschiedlich codiert.

Dieses Stück Code wird verwendet, um die Datei im Viewer zu öffnen:

function rawStringToBuffer(str) { 
    var idx, len = str.length, arr = new Array(len); 
    for (idx = 0 ; idx < len ; ++idx) { 
     arr[ idx ] = str.charCodeAt(idx) & 0xFF; 
    } 
    return new Uint8Array(arr).buffer; 
} 

function readSingleFile(e) { 
    var file = e.target.files[0]; 
    if (!file) { 
    return; 
    } 
    var reader = new FileReader(); 
    reader.onload = function(e) { 
    var contents = e.target.result; 

    var uint8array = rawStringToBuffer(contents); 

    pdfjsframe.contentWindow.PDFViewerApplication.open(uint8array,0); 

    }; 
    reader.readAsText(file); 
} 

test.pdf Hello World pdf, die mit dem Code nicht oben wiedergegeben wird.

file content in notepad

test2.pdf Hello World pdf, die oben mit Code gerendert wird.

enter image description here

Das Verhalten ist nicht Browser abhängig. Der Build ist b15f335.

Gibt es etwas mit dem Code oder der Standardkonfiguration des Viewers, sodass test.pdf vom Viewer nicht gerendert werden kann?

+0

Was ist die Frage, die Sie hier gefragt werden? – psmears

+0

Ich habe eine Frage hinzugefügt ;-) – Steffe

+0

Versuchen Sie diese (http://html2pdf.fr/en/default) – Mad

Antwort

3

Ich glaube nicht, dass Ihre Zeichenfolge Umwandlung Routine rawStringToBuffer() tut, was Sie wollen. Sie lesen die Datei als Text, der UTF-8 in UTF-16 umwandelt. Aber rawStringToBuffer() nimmt nur das niederwertige Byte jedes UTF-16-Zeichens und verwirft das höherwertige Byte, was nicht die inverse Transformation ist. Dies funktioniert mit 7-Bit-ASCII-Daten, aber nicht mit anderen Zeichen. Der beste Weg, um eine Zeichenfolge in UTF-8 zu konvertieren, ist mit der TextEncoder API (nicht auf allen Browsern unterstützt, aber Polyfills sind verfügbar).

Die Konvertierung der Daten von UTF-8 und zurück ist jedoch nicht erforderlich. Verwenden Sie einfach FileReader.readAsArrayBuffer() anstelle von readAsText(), um Ihre ArrayBuffer direkt zu produzieren.

Hier ist eine (nicht getestet) Ersatzfunktion:

function readSingleFile(e) { 
    var file = e.target.files[0]; 
    if (!file) { 
    return; 
    } 
    var reader = new FileReader(); 
    reader.onload = function(e) { 
    var contents = e.target.result; 

    pdfjsframe.contentWindow.PDFViewerApplication.open(contents, 0); 
    }; 
    reader.readAsArrayBuffer(file); 
} 
+0

Ref: [charCodeAt()] (https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/Global_Objects/String/charCodeAt) erklärt kurz UTF-16. –

Verwandte Themen