Python, pyPdf, Adobe PDF OCR错误:不支持的过滤器/lzwdecode
我的环境:python 2.6 64位(安装了pyPdf-1.13.win32.exe)。使用Wing IDE。操作系统是Windows 7 64位。
我遇到了以下错误:
NotImplementedError: 不支持的过滤器 /LZWDecode
当我运行以下代码时:
from pyPdf import PdfFileWriter, PdfFileReader
import sys, os, pyPdf, re
path = 'C:\\Users\\Homer\\Documents\\' # This is where I put my pdfs
filelist = os.listdir(path)
has_text_list = []
does_not_have_text_list = []
for pdf_name in filelist:
pdf_file_with_directory = os.path.join(path, pdf_name)
pdf = pyPdf.PdfFileReader(open(pdf_file_with_directory, 'rb'))
for i in range(0, pdf.getNumPages()):
content = pdf.getPage(i).extractText() #this is the line what done it
does_it_have_text = re.findall(r'\w{2,}', content)
if does_it_have_text == []:
does_not_have_text_list.append(pdf_name)
print pdf_name
else:
has_text_list.append(pdf_name)
print does_not_have_text_list
这里有点背景信息。这个路径里有很多pdf文件。有些是通过Adobe pdf打印机从文本文件保存的(至少我觉得是这样做的)。还有一些是扫描的图片。我想把它们分开,把那些是图片的进行OCR处理(非图片的那些是完美的,不应该去动)。
几天前我在这里问过如何做到这一点:
我得到的唯一回复是VB的,而我只会python。所以我想我可以试着自己写个答案。我的策略(在上面的代码中体现)是这样的。如果它只是一个图片,那么那个正则表达式会返回一个空列表。如果有文本,正则表达式(表示任何包含两个或更多字母数字字符的单词)会返回一个包含像u'word'这样的内容的列表(在python中,我想这是一个unicode字符串)。
所以代码应该是可以工作的,我们可以迈出第一步,完成那个使用开源软件的其他线程(从图像pdf中分离出OCR处理的部分),但我不知道如何处理这个过滤器错误,谷歌搜索也没有帮助。所以如果有人知道,那就太好了。
我其实不太懂这些东西。我不太确定在pyPdf中“过滤器”是什么意思。我觉得它是在说它无法真正读取pdf,尽管它是OCR处理过的。有趣的是,我把一个非OCR处理的pdf和一个OCR处理的pdf放在同一个文件夹里,和一个python文件一起,这样就能在没有for循环的情况下正常工作,所以我不知道为什么用for循环处理时会出现过滤器错误。我会在下面贴出单独的代码。谢谢。
from pyPdf import PdfFileWriter, PdfFileReader
import sys, os, pyPdf, re
pdf = pyPdf.PdfFileReader(open(my_ocrd_file.pdf', 'rb'))
has_text_list = []
does_not_have_text_list = []
for i in range(0, pdf.getNumPages()):
content = pdf.getPage(i).extractText()
does_it_have_text = re.findall(r'\w{2,}', content)
print does_it_have_text
它能打印一些东西,所以我不知道为什么在一个文件上会出现过滤器错误,而在另一个文件上却没有。当我对目录中的另一个文件(那个不是OCR处理的)运行这段代码时,输出是这样:一行是空字符串,下一行也是空字符串:
[]
[]
所以我猜这也不是非OCR处理pdf的过滤器问题。这对我来说有点复杂,我需要一些帮助。
编辑:
谷歌搜索找到了这个,但我不知道该怎么理解:
2 个回答
LZW是一种压缩格式,常用于GIF图片和有时用于PDF文件。如果你查看一下pyPdf.filters
中提供的过滤器,你会发现没有LZW这个选项,因此会出现NotImplementedError.
你提供的链接是一个代码库的地址,里面有人实现了一个LZW过滤器。
把pyPdf的filter.py文件替换成这个链接里的文件:http://vaitls.com/treas/pdf/pyPdf/filters.py,我这样做之后就解决了问题。