Python - 将pdf转换为文本,编码错误

时间:2015-03-15 06:01:26

标签: python pdf text encoding error-handling

我尝试将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-64bit韩文版。

我通过使用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'编解码器不能对字符u' \ u0152'进行编码。在位置602:顺序不在范围(128)'错误

2 个答案:

答案 0 :(得分:1)

以前的代码根本不起作用,PDF根本不一定包含直接可读的文本。使用pyPdf的后一个代码看起来更有希望。

引发TypeError是因为pages in PDFpage)不是字符串,但f.write期望看到字符串。

因此,您可以尝试使用文档中的extractText方法:

for page in input.pages:
    f.write(page.extractText().encode('UTF-8'))

答案 1 :(得分:0)

  1. pdf命令流的编码类似于latin-1
  2. 命令流包括在页面上显示内容的指令
  3. 如果这些东西是“文本”,则实际上是显示字符形状的指令,即从字体(或字体的子集或几种字体的位组合)中提取的字形。
  4. 大多数情况下,翻译这些字节中的字节所需的信息 用于(例如)unicode文本的说明存储在PDF中,但有时却没有,有时甚至根本无法翻译(例如,字体印有徽标的地方)。
  5. PyPDF2(以及许多其他开源PDF软件包)不包含处理此问题的全部功能,但幸运的是,许多文档创建者都依赖一小套“标准编码”,其中包括许多拉丁语-1变体和“提取文本”功能在这些情况下确实提供了可用的结果。我还发现了PDF,其中的字体定义具有替换映射,这些替换映射为您使用的每个字节提供了字形的名称,并且发现修改PyPDF2来解决这一问题很容易。其他情况并非如此简单。

  6. 最后,在尝试从PDF提取可读文本时,还需要考虑其他两个因素。首先是一些PDF流可以被压缩,而某些则可以被加密。 PyPDF2可以处理这两种情况。第二个问题是PDF指令仅将字符放在页面上的特定位置。在大多数情况下,PDF编写者可以按阅读顺序写数据,但可以在单词内以及分词处进行位置更改。