我需要阅读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
答案 0 :(得分:2)
PyPDF2 extractTest method返回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返回错误数据。
答案 1 :(得分:0)
我试图用“”替换特定的“” unicode,以解决此问题。请让我知道您是否仍然无法使用这种方法生成pdf。
text = text.replace("'", "’")