2016-06-07 78 views
3

我們正在實施PDFJS在網站上呈現PDF文件。PDFJS和PDF編碼

當試圖啓動一個PDF文檔/查看器作爲arrayBuffer時,我們會遇到各種錯誤,並且不會呈現文件。 當從url(DEFAULT_URL變量)在查看器中打開同一個文件時,該文件呈現正常。

但是有一些文件會呈現爲流。在記事本中比較這些文件顯示它們具有不同的編碼/字符。

這段代碼用於在查看器打開該文件:不與上述代碼呈現

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的HelloWorld PDF。這確實與以上代碼呈現

file content in notepad

test2.pdf的HelloWorld PDF。

enter image description here

的行爲不依賴於瀏覽器。構建是b15f335。

查看器的代碼或默認配置是否存在,以便查看器無法呈現test.pdf?

+0

是什麼你問這裏的問題? – psmears

+0

我添加了一個問題;-) – Steffe

+0

試試這個(http://html2pdf.fr/en/default) – Mad

回答

3

我不認爲你的字符串轉換例程rawStringToBuffer()做你想要的。您正在將文件作爲文本讀取,這會將UTF-8轉換爲UTF-16。但rawStringToBuffer()只取每個UTF-16字符的低位字節並丟棄高位字節,而不是反轉換。這將適用於7位ASCII數據,但不適用於其他字符。將字符串轉換爲UTF-8的最佳方式是使用TextEncoder API(不支持所有瀏覽器,但可以使用polyfills)。

但是,將數據從UTF-8轉換回來並不必要。只需使用FileReader.readAsArrayBuffer()而不是readAsText()即可直接生成ArrayBuffer

下面是一個(未經測試)替換功能:

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)簡潔地解釋了UTF-16。 –