簡體   English   中英

包含非標准字符時,pdfjs 無法查看 PDF

[英]pdfjs can't view PDF when containing non standard characeters

我正在嘗試使用 PDFJS 查看 PDF。 我有以下代碼適用於我從 PDFJS 網站獲得的演示 PDF,但它不適用於我嘗試過的其他 PDF。 這是有效的演示 PDF 的原始文本:

%PDF-1.7
1 0 obj  % entry point
<</Type/Catalog/Pages 2 0 R>>
endobj
2 0 obj<</Type/Pages/MediaBox[ 0 0 200 200]/Count 1/Kids[3 0 R]>>endobj
3 0 obj<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 4 0 R>>>>/Contents 5 0 R>>endobj
4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman>>endobj
5 0 obj  % page content
<</Length 44>> stream
BT 70 50 TD /F1 12 Tf(Hello, world!) Tj ET
endstream endobj
xref trailer <</Size 6/Root 1 0 R>> startxref
%%EOF

這是我成功加載上述 PDF 的 html 代碼:

<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.2.228/pdf.js"></script>
<input type="file" id="input"/> </br> <canvas id="can" width=1000 height=1000/>
<script>
    document.getElementById('input').addEventListener('change', function(e){
        var reader = new FileReader()
        reader.onload = function(x){
            window['pdfjs-dist/build/pdf'].getDocument({data:x.target.result}).promise.then(function(pdf){
                pdf.getPage(1).then(function(page){
                    page.render({canvasContext:document.getElementById('can').getContext('2d'),
                        viewport:page.getViewport({scale:1})})
        })})}
        reader.readAsText(e.target.files[0])
    }, false)
</script>

但是,我的其他 PDF 根本無法加載。 例如,我生成了一個 1 頁的 PDF,在背面只包含“測試”這個詞並下載了它。 當我嘗試將此 PDF 上傳到我的 html 代碼時,我在控制台中收到這些錯誤:

Warning: Invalid stream: "FormatError: Bad FCHECK in flate stream: 120, 253"
util.js:306 Warning: Indexing all PDF objects
2util.js:306 Warning: Invalid stream: "FormatError: Bad FCHECK in flate stream: 120, 253"
viewPDF.html:1 Uncaught (in promise) InvalidPDFException {name: "InvalidPDFException", message: "Invalid PDF structure"}
Promise.then (async)
reader.onload @ viewPDF.html:7
load (async)
(anonymous) @ viewPDF.html:6

我懷疑我遇到的問題與不起作用的 PDF 包含非標准字符這一事實有關。 這是來自背頁的 PDF 的前幾行:

%PDF-1.5
%���
3 0 obj
<< /Linearized 1 /L 11602 /H [ 678 125 ] /O 7 /E 11072 /N 1 /T 11321 >>
endobj

4 0 obj
<< /Type /XRef /Length 51 /Filter /FlateDecode /DecodeParms << /Columns 4 /Predictor 12 >> /W [ 1 2 1 ] /Index [ 3 14 ] /Info 1 0 R /Root 5 0 R /Size 17 /Prev 11322                 /ID [<8f1689fb6a16051fd66ebeadaa364b8d><4a8030207ba6597007a967ed52a9309d>] >>
stream
x�cbd�g`b`8 $��XF@���*��    ��@�Y�����v�#�.
endstream
endobj

5 0 obj
<< /Pages 14 0 R /Type /Catalog >>
endobj
6 0 obj
<< /Filter /FlateDecode /S 36 /Length 48 >>
stream
x�c```e``Z��
            pe31
                B�����,��v�>aW�

您輸出這些符號所看到的編碼二進制流,並且隨着您使 PDF 變得更加復雜,數學字體、圖像和普通嵌入字體將越來越需要它們。 可以將它們以 ascii 代碼輸出並且只要所有輸出都被索引就可以接受。 通過輸出為 WEB /Linearized,您的背頁代碼也變得更加復雜。

PDF 的結構並不簡單,您的最小工作示例應該看起來更像這樣,其中包含外部參照表。

%PDF-1.7
%µ¶

1 0 obj
<</Type/Catalog/Pages 2 0 R>>
endobj

2 0 obj
<</Type/Pages/MediaBox[0 0 200 200]/Count 1/Kids[3 0 R]>>
endobj

3 0 obj
<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 4 0 R>>>>/Contents 5 0 R>>
endobj

4 0 obj
<</Type/Font/Subtype/Type1/BaseFont/Times-Roman>>
endobj

5 0 obj
<</Length 63>>
stream
q
BT
-50 TL
/F1 12 Tf
1 0 0 1 70 50 Tm
(Hello, world!) Tj
ET
Q

endstream
endobj

xref
0 6
0000000000 65536 f 
0000000016 00000 n 
0000000062 00000 n 
0000000136 00000 n 
0000000227 00000 n 
0000000293 00000 n 

trailer
<</Size 6/Root 1 0 R>>
startxref
405
%%EOF

這種格式的主要問題是十進制字節地址需要正確,因此大文件中 \\n \\r\\n 和 \\r 之間的不同操作系統行結尾可以徹底改變這些值,例如一個字節錯誤並且文件已損壞.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM