Python - pdf转文本,编码错误
Python - convert pdf to text, encoding error
我尝试将 pdf 文档转换为 txt 文件。
(pdf 文件示例 link)
所以我尝试如下。
但是提取的文本很奇怪,比如 ??챘#?遏?h첨챦_철?‾n?~w??¬?k
我该如何解决?
#!/usr/bin/python
# -*- coding: cp949 -*-
# -*- coding: utf-8 -*-
# -*- coding: latin-1 -*-
# -*- coding: euc-kr -*-
import codecs
import pyPdf
filename = "d:/data/processed_data/paper/iscram/2006/iscram1.pdf"
#pdf = codecs.open(filename, "rb", encoding = 'utf-8')
pdf = codecs.open(filename, "rb", encoding = 'latin1')
for page in pdf:
print page.encode('utf-8')
我用的是win7-64位韩版
我通过使用 pyPdf 尝试了另一种方式,如下所示
import os
import glob
from pyPdf import PdfFileReader
import pdfminer
f=open("d:/data/processed_data/paper/iscram/2006/iscram1.txt",'w')
parent = "d:/data/processed_data/paper/iscram/2006"
os.chdir(parent)
filename = os.path.abspath('iscram1.pdf')
input = PdfFileReader(file(filename, "rb"))
for page in input.pages:
f.write(page.extractText())
但它不起作用并且出现“'ascii'编解码器无法对位置 602 中的字符 u'\u0152 进行编码:序号不在范围内 (128)”错误
以前的代码根本行不通,PDF根本不一定包含直接可读的文本。不过,后一个带有 pyPdf 的代码看起来更有前途。
TypeError
is raised because the pages in PDF(page
)不是字符串,但f.write
希望看到的是字符串。
因此您可以尝试使用文档中的 extractText
方法:
for page in input.pages:
f.write(page.extractText().encode('UTF-8'))
- pdf 命令流使用类似于 latin-1 的编码进行编码
- 命令流包括在页面上显示内容的指令
- 这个东西是 "text" 那么它实际上是显示字符形状的指令,即从一种字体(或一种字体的子集或几种字体的位组合)中提取的字形。
- 大多数情况下,翻译这些字节所需的信息
(比如)unicode 文本的说明存储在 PDF 中,但有时不是,有时根本不可能进行翻译(例如字体打印徽标的地方)。
PyPDF2(和许多其他开源 PDF 包)不包含处理此问题的全部复杂性的功能,但幸运的是,许多文档创建者依赖于一小部分 "standard encodings"包括许多 latin-1 变体,并且 'extract text' 函数在这些情况下确实提供了可用的结果。我还找到了 PDF,其中字体定义具有替换映射,可以为您提供所用每个字节的字形名称,并且发现很容易修改 PyPDF2 来解决这个问题。其他情况就没那么简单了。
最后,在尝试从 PDF 中提取可读文本时,还需要考虑另外两个因素。首先是一些 PDF 流可以被压缩,而一些是加密的。 PyPDF2 可以处理这两种情况。第二个问题是 PDF 说明只是将字符放在页面上的特定位置。在大多数情况下,PDF 编写者可能会按阅读顺序编写数据,但可能会在字内和断字处进行定位更改。
我尝试将 pdf 文档转换为 txt 文件。 (pdf 文件示例 link)
所以我尝试如下。
但是提取的文本很奇怪,比如 ??챘#?遏?h첨챦_철?‾n?~w??¬?k
我该如何解决?
#!/usr/bin/python
# -*- coding: cp949 -*-
# -*- coding: utf-8 -*-
# -*- coding: latin-1 -*-
# -*- coding: euc-kr -*-
import codecs
import pyPdf
filename = "d:/data/processed_data/paper/iscram/2006/iscram1.pdf"
#pdf = codecs.open(filename, "rb", encoding = 'utf-8')
pdf = codecs.open(filename, "rb", encoding = 'latin1')
for page in pdf:
print page.encode('utf-8')
我用的是win7-64位韩版
我通过使用 pyPdf 尝试了另一种方式,如下所示
import os
import glob
from pyPdf import PdfFileReader
import pdfminer
f=open("d:/data/processed_data/paper/iscram/2006/iscram1.txt",'w')
parent = "d:/data/processed_data/paper/iscram/2006"
os.chdir(parent)
filename = os.path.abspath('iscram1.pdf')
input = PdfFileReader(file(filename, "rb"))
for page in input.pages:
f.write(page.extractText())
但它不起作用并且出现“'ascii'编解码器无法对位置 602 中的字符 u'\u0152 进行编码:序号不在范围内 (128)”错误
以前的代码根本行不通,PDF根本不一定包含直接可读的文本。不过,后一个带有 pyPdf 的代码看起来更有前途。
TypeError
is raised because the pages in PDF(page
)不是字符串,但f.write
希望看到的是字符串。
因此您可以尝试使用文档中的 extractText
方法:
for page in input.pages:
f.write(page.extractText().encode('UTF-8'))
- pdf 命令流使用类似于 latin-1 的编码进行编码
- 命令流包括在页面上显示内容的指令
- 这个东西是 "text" 那么它实际上是显示字符形状的指令,即从一种字体(或一种字体的子集或几种字体的位组合)中提取的字形。
- 大多数情况下,翻译这些字节所需的信息 (比如)unicode 文本的说明存储在 PDF 中,但有时不是,有时根本不可能进行翻译(例如字体打印徽标的地方)。
PyPDF2(和许多其他开源 PDF 包)不包含处理此问题的全部复杂性的功能,但幸运的是,许多文档创建者依赖于一小部分 "standard encodings"包括许多 latin-1 变体,并且 'extract text' 函数在这些情况下确实提供了可用的结果。我还找到了 PDF,其中字体定义具有替换映射,可以为您提供所用每个字节的字形名称,并且发现很容易修改 PyPDF2 来解决这个问题。其他情况就没那么简单了。
最后,在尝试从 PDF 中提取可读文本时,还需要考虑另外两个因素。首先是一些 PDF 流可以被压缩,而一些是加密的。 PyPDF2 可以处理这两种情况。第二个问题是 PDF 说明只是将字符放在页面上的特定位置。在大多数情况下,PDF 编写者可能会按阅读顺序编写数据,但可能会在字内和断字处进行定位更改。