Python pyPdf:非法UTF-16代理

Python pyPdf:非法UTF-16代理,python,pdf,decode,utf-16,pypdf,Python,Pdf,Decode,Utf 16,Pypdf,我有一个破坏pyPdf的pdf文件: 以下是示例脚本: 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 out

我有一个破坏pyPdf的pdf文件:

以下是示例脚本:

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)
错误输出如下:

从GitHub使用PyPDF2时,错误相同。pdftk可以像处理任何其他pdf一样处理此pdf。请注意,写作失败,但阅读似乎很好


你能至少告诉我pdf文件中导致错误的确切部分吗?一个解决方法会更好:)

看起来像PyPDF2中的一个bug。在:

它假设以(0xFE,0xFF)开头的任何字符串都可以解码为UTF-16。您的文件包含一个以这种方式开始的bytestring,但随后包含无效的UTF-16


最简单的修复方法是注释掉
if
,并无条件地使用

看起来像PyPDF2中的一个bug。在:

它假设以(0xFE,0xFF)开头的任何字符串都可以解码为UTF-16。您的文件包含一个以这种方式开始的bytestring,但随后包含无效的UTF-16


最简单的修复方法是注释掉
if
并无条件使用
分支的性能可能会受到很大影响。

我尝试下载PDF,但该服务将我从一个不需要的文件快速下载到下一个文件。好的,我将链接更改为更直接的内容。我尝试下载PDF,但该服务将我从一个不需要的文件快速转到另一个文件。好的,我将链接更改为更直接的内容。实际上,对于流之外的字符串,这种假设是可以接受的:它们有两种不同的风格,可以由BOM识别。不幸的是,此方法也用于流中的字符串,其编码遵循完全不同的规则,并由PDF字体对象确定。因此,即使在这里,一个完整的解决方案也包括为这两种情况分离代码路径。事实上,PyPDF2(1.16)的最新版本似乎试图解决这个问题:实际上,对于流之外的字符串,这种假设是可以接受的:它们有两种不同的风格,可以由BOM识别。不幸的是,此方法也用于流中的字符串,其编码遵循完全不同的规则,并由PDF字体对象确定。因此,即使在这里,完整的修复也包括分离这两种情况的代码路径。事实上,PyPDF2(1.16)的最新版本似乎试图修复此问题:
if string.startswith(codecs.BOM_UTF16_BE):
    retval = TextStringObject(string.decode("utf-16"))
    retval.autodetect_utf16 = True