阅读 PDF 时字符编码错误

Error in the coding of the characters in reading a PDF

我需要阅读 this PDF

我正在使用以下代码:

from PyPDF2 import PdfFileReader

f = open('myfile.pdf', 'rb')
reader = PdfFileReader(f)
content = reader.getPage(0).extractText()
f.close()
content = ' '.join(content.replace('\xa0', ' ').strip().split())

print(content)

然而,编码不正确,它打印:

Resultado da Prova de Sele“‰o do...

但我预料到了

Resultado da Prova de Seleção do...

如何解决?

我正在使用 Python 3

PyPDF2 extractTest method returns UniCode。所以你们很多人只需要明确地编码它。例如,将 Unicode 显式编码为 UTF-8。

# -*- coding: utf-8 -*-
correct = u'Resultado da Prova de Seleção do...'
print(correct.encode(encoding='utf-8'))

您使用的是 Python 3,因此您拥有 Unicode,并且 Python 3 默认为 UTF-8。但我想知道您是否需要根据您的 locale.

指定不同的编码
# Show installed locales
import locale
from pprint import pprint
pprint(locale.locale_alias)

如果这不是快速修复,因为您正在从 PyPDF 返回 Unicode,您可以查看这两个字符的代码点。 PyPDF 可能无法确定正确的编码并为您提供了错误的字符。

例如,对您发布的好字符串和坏字符串进行快速粗略的比较:

# -*- coding: utf-8 -*-
# Python 3.4
incorrect = 'Resultado da Prova de Sele“‰o do'
correct = 'Resultado da Prova de Seleção do...'

print("Incorrect String")
print("CHAR{}UNI".format(' ' * 20))
print("-" * 50)
for char in incorrect:
    print(
        '{}{}{}'.format(
            char.encode(encoding='utf-8'),
            ' ' * 20,  # Hack; Byte objects don't have __format__
            ord(char)
        )
    )

print("\n" * 2)

print("Correct String")
print("CHAR{}UNI".format(' ' * 20))
print("-" * 50)
for char in correct:
    print(
        '{}{}{}'.format(
            char.encode(encoding='utf-8'),
            ' ' * 20,  # Hack; Byte objects don't have __format__
            ord(char)
        )
    )

相关输出:

b'\xe2\x80\x9c' 8220
b'\xe2\x80\xb0' 8240

b'\xc3\xa7' 231
b'\xc3\xa3' 227

如果您正在获取代码点 231,(>>>hex(231) # '0xe7),那么您将从 PyPDF 取回错误数据。

我尝试过将特定的“'”unicode 替换为“'”,从而解决了这个问题。如果您仍然无法通过这种方法生成 pdf,请告诉我。

text = text.replace("'", "’")