2013-03-28 44 views
1

我有打破pyPdf PDF文件:http://tovotu.de/tests/test.pdfpyPdf:非法UTF-16代理

這是示例腳本:

from pyPdf import PdfFileWriter, PdfFileReader 

outputPdf = PdfFileWriter() 

inpdf = open("test.pdf","rb") 
inputPdf = PdfFileReader(inpdf) 
[outputPdf.addPage(x) for x in inputPdf.pages] 

with open("output.pdf","wb") as outpdf: 
    outputPdf.write(outpdf) 

錯誤輸出是在這裏:http://pastebin.com/0m38zhjQ

的錯誤是從GitHub使用PyPDF2時也是如此。 pdftk可以像處理任何其他pdf一樣處理這個pdf。請注意,寫作失敗,但閱讀似乎工作得很好!

你至少可以指出我的導致該錯誤的PDF格式的確切一部分?一種解決方法會更好:)

+0

我嘗試下載的PDF,但該服務衝我從一個不想要的文件下。 – mkl 2013-03-28 07:44:00

+0

好的,我將鏈接更改爲更直接的內容。 – thomas 2013-03-28 09:22:24

回答

1

看起來像PyPDF2的錯誤。在this section

if string.startswith(codecs.BOM_UTF16_BE): 
    retval = TextStringObject(string.decode("utf-16")) 
    retval.autodetect_utf16 = True 

它假定從(0xFE的,爲0xFF)任何字符串可以被解碼爲UTF-16。你的文件包含一個以這種方式開始但是包含無效的UTF-16的字節串。

最簡單的解決方法是註釋掉if並無條件使用# This is probably a big performance hit here分支。

+1

實際上,對於流之外的字符串**,這種假設是正確的:**它們有兩種不同的口味,可以被該BOM識別。不幸的是,這種方法在這裏也用於流**內部的字符串**,其編碼遵循完全不同的規則並由PDF字體對象確定。因此,即使在這裏,完整的修復包括爲這兩種情況分開代碼路徑。 – mkl 2013-03-29 23:02:29

+0

事實上,似乎最近PyPDF2的版本(1.16)試圖解決這個問題:https://github.com/mstamy2/PyPDF2/commit/e4d6ebcdb7e3b233e581ebeeaa32686dd5e1fed0 – 2014-07-15 09:55:04