【问题标题】:pyPdf: illegal UTF-16 surrogatepyPdf:非法的 UTF-16 代理
【发布时间】:2013-03-28 02:41:16
【问题描述】:

我有一个破坏 pyPdf 的 pdf 文件:http://tovotu.de/tests/test.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)

错误输出在这里:http://pastebin.com/0m38zhjQ

使用来自 GitHub 的 PyPDF2 时,错误是相同的。 pdftk 可以像处理任何其他 pdf 一样处理此 pdf。请注意,写入失败,但读取似乎工作正常!

您能否至少指出导致该错误的 pdf 的确切部分?解决方法会更好:)

【问题讨论】:

  • 我尝试下载 PDF,但该服务将我从一个不需要的文件赶到下一个。
  • 好的,我把链接改成了更直接的东西。

标签: python pdf decode utf-16 pypdf


【解决方案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 分支。

【讨论】:

  • 实际上,对于 流之外的字符串,这种假设是可以的:它们有 2 种不同的风格,可以被 BOM 识别。不幸的是,此方法也用于字符串流内,其编码遵循完全不同的规则,并由 PDF 字体对象确定。因此,即使在这里,完整的修复也包括为这两种情况分离代码路径。
  • 事实上,最近版本的 PyPDF2 (1.16) 似乎试图解决这个问题:github.com/mstamy2/PyPDF2/commit/…
猜你喜欢
  • 2021-10-23
  • 2021-06-10
  • 2019-02-02
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2023-03-06
相关资源
最近更新 更多