阅读 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("'", "’")
我需要阅读 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' 8240b'\xc3\xa7' 231
b'\xc3\xa3' 227
如果您正在获取代码点 231,(>>>hex(231) # '0xe7
),那么您将从 PyPDF 取回错误数据。
我尝试过将特定的“'”unicode 替换为“'”,从而解决了这个问题。如果您仍然无法通过这种方法生成 pdf,请告诉我。
text = text.replace("'", "’")