问题描述
我正在尝试使用PyPDF4打开PDF文件。
import PyPDF4
text = ""
pdf_file = open(filename,mode='rb')
pdfReader = PyPDF4.PdfFileReader(pdf_file)
pdfObj = pdfReader.getPage(0)
text = pageObj.extract(pdfObj)
print(text)
正常工作,除了PDF的内容是德语,并且特殊字符(Umlaute)的编码错误(例如,zun-chst而不是zunächst)。
我无法更改二进制代码的编码,但是如果我不使用二进制代码,则会收到错误消息
文件“ /usr/local/lib/python3.8/site-packages/PyPDF4/pdf.py”,第1754行,已读取 stream.seek(-1,2)io.UnsupportedOperation:不能进行非零的相对结束搜索
此错误有多个线程(例如Seeking from end of file throwing unsupported exception) 但是,这些解决方案似乎都不适合我。 非常感谢您的任何帮助。
解决方法
PDF文件肯定是二进制文件;您绝对不要尝试使用'rb'
模式以外的任何其他方式来读取它。
您可以 做的是解码提取的文本。如果您知道编码为UTF-8(根据显示的示例,可能不是真的),
print(text.decode('utf-8'))
根据您的单个示例,我认为可以肯定地说编码不是UTF-8,而是因为我们不知道您在查看文本时使用的是哪种编码,所以这完全是推测。如果您可以显示字符串中的实际字节,则不难从几个样本中找出实际编码,也许借助https://tripleee.github.io/8bit/这样的字符表。您粘贴的字符是U+2212,它看起来并不直接对应于ä的任何普通8位编码,但这也许只是粘贴中的一个错误。
也许有些背景也可以Problematic questions about decoding errors。理想情况下,如果还没有把您带到可以自己解决问题的地方,那么也许可以更新您的问题以提供所要求的详细信息。
如果PyPDF确实认为字符是"−"
,则其提取逻辑可能有误,或者PDF有缺陷。如果无法解决,则可能只是在找到有问题的字符时手动对其进行重新映射。您可能想要使用logging
添加调试打印,以突出显示提取文本中可打印ASCII范围之外的任何字符,直到您知道所有字符都被覆盖为止。
import re
import logging
# ...
text = text.replace("\u2212","ä").replace("\u1234","ö") # etc
for match in re.findall(r'(.{1,5})?([^äö\n -\u007f])(.{1,5})?',text):
logging.warning("{0} found in {1}".format(match[1],"".join(match)))
不幸的是,以上代码无法完全正常工作-尤其是U + 2212似乎都与ASCII范围匹配,无论我传递了什么re
标志。(请注意,占位符{{1 }}-用一些有用的东西替换它,并在找到它们时添加更多。)