阅读PDF

时间:2015-11-12 04:52:46

标签: python pdf pypdf

我需要阅读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

2 个答案:

答案 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("'", "’")