在进行PDF读取的时候,遇到
pdfminer ImportError: cannot import name process_pdf
问题,各处搜索之后,除了stackoverflow的
how to use pdfminer
有比较好的总结之外,还是得看官方手册啊,这句话
process_pdf function is implemented as a class method PDFPage.get_pages.
所以是API 改变了点咯,妈蛋!
很少有中文文章写了,这里我把遇到的问题和解决的方法写一下,如果能解决你的问题,倍感荣幸,自己也顺便练习。
就是:不使用process_pdf
因为pdfminer 20140328这个版本是最近的,而且不支持process_pdf,如果你想要它支持process_pdf,你可以安装pdfminer-20110515版本的,这个可以正常导入包,但是其他函数使用体验不好。我查找了几个不使用process_pdf照样能够读取PDF的几个函数,自己修改了一下,如果想直接看例子使用,请直接跳转到pdfminer使用一二则。
安装20110515版本的pdfminer请在cmd下运行该命令,当然前提你装了pip,也可以自己去github找pdfminer历史版本
pip install http://pypi.python.org/packages/source/p/pdfminer/pdfminer-20110515.tar.gz
pdfminer安装
更加详细的参考官方手册
pdfminer下载
懒得看官方,来,看我的
1.下载压缩包,解压
2.cmd命令,切换到解压后路径(使用cd 路径)
3.直接复制下面的,到你的cmd窗口,然后他会安装,这是对中文字符识别需要额外加的。官方的话是
On Windows machines which don't have make command, paste the following commands on a command line prompt:
mkdir pdfminer\cmap
python tools\conv_cmap.py -c B5=cp950 -c UniCNS-UTF8=utf-8 pdfminer\cmap Adobe-CNS1 cmaprsrc\cid2code_Adobe_CNS1.txt
python tools\conv_cmap.py -c GBK-EUC=cp936 -c UniGB-UTF8=utf-8 pdfminer\cmap Adobe-GB1 cmaprsrc\cid2code_Adobe_GB1.txt
python tools\conv_cmap.py -c RKSJ=cp932 -c EUC=euc-jp -c UniJIS-UTF8=utf-8 pdfminer\cmap Adobe-Japan1 cmaprsrc\cid2code_Adobe_Japan1.txt
python tools\conv_cmap.py -c KSC-EUC=euc-kr -c KSC-Johab=johab -c KSCms-UHC=cp949 -c UniKS-UTF8=utf-8 pdfminer\cmap Adobe-Korea1 cmaprsrc\cid2code_Adobe_Korea1.txt
python setup.py install
然后你就应该装好了,试试我最后的两段代码,直接可用的。
pdfminer使用一二则
1.对本地保存的pdf文件进行读取和写入到txt
写法一:
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import *
from pdfminer.converter import PDFPageAggregator
def Pdf2Txt(Path,Save_name):
parser = PDFParser(Path)
document = PDFDocument(parser)
if not document.is_extractable:
raise PDFTextExtractionNotAllowed
else:
rsrcmgr=PDFResourceManager()
laparams=LAParams()
device=PDFPageAggregator(rsrcmgr,laparams=laparams)
interpreter=PDFPageInterpreter(rsrcmgr,device)
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
layout=device.get_result()
for x in layout:
if(isinstance(x,LTTextBoxHorizontal)):
with open('%s'%(Save_name),'a') as f:
f.write(x.get_text().encode('utf-8')+'\n')
Path = open('test1_chinese.pdf', 'rb')
Pdf2Txt(Path,'b.txt')
我直接把函数封装起来了,以后直接调用就可以了,传递的参数Path是本地pdf路径,Save_name是将要识别的文字保存在txt中的名字,默认路径为项目py文件路径。识别中文的效果像是这样的
我知道很难看,没办法,这是一篇期刊,里面各种图,影响识别的。
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
def convert_pdf_to_txt(path,save_name):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = file(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages, password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
try:
with open("%s"%save_name,"w") as f:
for i in str:
f.write(i)
print "%s Writing Succeed!"%save_name
except:
print "Writing Failed!"
convert_pdf_to_txt('C:\\pdfminer-master\\chapter1.pdf',"c.txt")
和写法一差不太多啦,就是个别语句不一样,这次我识别的是英文的pdf,效果如下,当然你要是识别上述的中文,那是一样样的烂!
我这是已经封装了函数了,大家要是不喜欢其中的写入txt,可以直接返回str完事,调用之后再写进去也可以的,我这人懒,就直接这么写了。
2.对pdf网页进行读取和写入到txt
这里我使用StringIO来处理,我就是不想下载到本地,就想直接读到内存里,处理下完事,这是我从CSV处理方法上借鉴过来的,改了上述代码中其中几句话,即可实现。
首先看一下在线pdf啥样的,这里用了教材上的一个pdf网页
OK,Let’s do this!
写法一:
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
import urllib2
def Pdf_Write2txt(html,save_name):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams=LAParams()
device = TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=laparams)
fp = StringIO(html)
interpreter = PDFPageInterpreter(rsrcmgr, device)
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=0, password="",caching=True, check_extractable=True):
interpreter.process_page(page)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
try:
with open("%s.txt"%save_name,"w") as f:
for i in str:
f.write(i)
print "%s.txt Writing Succeed!"%save_name
except:
print "Writing Failed!"
url="http://pythonscraping.com/pages/warandpeace/chapter1.pdf"
html = urllib2.urlopen(urllib2.Request(url)).read()
Pdf_Write2txt(html,"c1")
实现的效果,写入了c1.txt中成功
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import *
from pdfminer.converter import PDFPageAggregator
import urllib2
from cStringIO import StringIO
def Pdf2Txt(DataIO,Save_path):
parser = PDFParser(DataIO)
document = PDFDocument(parser)
if not document.is_extractable:
raise PDFTextExtractionNotAllowed
else:
rsrcmgr=PDFResourceManager()
laparams=LAParams()
device=PDFPageAggregator(rsrcmgr,laparams=laparams)
interpreter=PDFPageInterpreter(rsrcmgr,device)
for page in PDFPage.create_pages(document):
interpreter.process_page(page)
layout=device.get_result()
for x in layout:
try:
if(isinstance(x,LTTextBoxHorizontal)):
with open('%s'%(Save_path),'a') as f:
f.write(x.get_text().encode('utf-8')+'\n')
except:
print "Failed!"
url = "http://pythonscraping.com/pages/warandpeace/chapter1.pdf"
html = urllib2.urlopen(urllib2.Request(url)).read()
DataIO = StringIO(html)
Pdf2Txt(DataIO,'b2.txt')
结果和上述的是一样的,所以不贴图了。。。。
上述两种写法,都是实际测试并通过的,针对的是现在最新版本的pdfminer 20140328,环境是python2.7 我对本测试负责。
个人推崇写法二,原作者我找不到了,这里致歉,代码我经过一些修改,更加符合使用习惯。还有就是,多看官方手册。
@Stack overflow–How do I use pdfminer as a library
@euske–pdfminer Github下载
@圆滚滚姑娘–从PDF中提取信息—-PDFMiner
Python 2.7 IDE Pycharm 5.0.3 pdfminer 20140328解决问题和测试多个版本读pdf解决问题在进行PDF读取的时候,遇到pdfminer ImportError: cannot import name process_pdf问题,各处搜索之后,除了stackoverflow的how to use pdfminer有比较好的总结之外,还是得看官方手册啊,这句
1. 使用默认的session, 在ini文件中:复制代码 代码如下:from pyramid.session
import
UnencryptedCookieSessionFactoryConfigmy_session_factory = UnencryptedCookieSessionFactoryConfig(‘itsaseekreet’)
from pyramid.config
import
Configuratorconfig = Configurator(session_factory = my_session_factory)
缺点:这个session是存储在Cookie中的,
PDF
Min
er
简介
pdf
提取目前的
解决
方案大致只有py
PDF
和
PDF
Min
er
。据说
PDF
Min
er
更适合文本的解析,首先说明的是解析
PDF
是非常蛋疼的事,即使是
PDF
Min
er
对于格式不工整的
PDF
解析效果也不怎么样,所以连
PDF
Min
er
的开发者都吐槽
PDF
is evil. 不过这些并不重要。
PDF
Min
er
是一个可以从
PDF
文档中提取信息的工具。与其他
PDF
相关的工具不同,它注重的完全是获取和分析文本数据。
PDF
Min
er
允许你获取某一页中文本的准确位置和一些诸如字体、行数的信息。它
包
括一
ImportError
: cannot
import
name '
process
_
pdf
' from '
pdf
min
er
.
pdf
int
er
p'
可以先卸载
PDF
Min
er
3K和
PDF
Min
er
,然后重新安装
PDF
Min
er
即可
pip uninstall
PDF
Min
er
3K
pip uninstall
PDF
Min
er
pip install
pdf
min
er
3k
mac
ImportError
cannot
import
name pr
python
报错:cannot
import
name ‘
PDF
Document’ from ‘
pdf
min
er
.
pdf
pars
er
’
解决
方法
显示报错如下
from
pdf
min
er
.
pdf
pars
er
import
PDF
Pars
er
,
PDF
Document
ImportError
: cannot
import
name '
PDF
Document' from '
pdf
min
er
.
pdf
pars
er
'
解决
办法
1、修改模块导入方式
from
pdf
min
er
.
pdf
pars
er
import
P
项目中之前一直都是如下导
包
,未曾改动过,在此之前都是好好的能够运行,直到今早…
很早的来到公司(六点四十的闹钟没关,七点到了公司),开心的打开 Pycharm ,点击运行~~~~竟然报错了
在运行之前我下载了 tabula-py依赖,想要实现
PDF
提取表格的需求,开始怀疑是不是这个库导致的冲突
一番卸载(tabula-py)、重启(PyCharm 程序员:重启能够
解决
99% 问题的直觉,肯定不是我的问题,一定是环境问题,之前还好好的,怎么突然就不行了呢)、更新(pip install --upgr.
python
处理
pdf
也是常用的技术了,
pdf
min
er
3k是一个非常好的工具。
先在系统目录下建立pip目录,呈现 C:\Us
er
s\Ad
min
istrator\pip,之后建立pip.ini文本文件,内容如下:
[global]
index-url=http://mirrors.aliyun.com/pypi/simple/
[install]
trusted-...
官方文档:https://euske.github.io/
pdf
min
er
/program
min
g.html
翻译:https://blog.csdn.net/robolinux/article/details/43318229
我是
python
3,一开始装了一个
pdf
min
er
,装了一个
pdf
min
er
3k,但是使用时报错:
Import
Er
r..
第一种方法:多线程处理
优点:可以同时处理多个文件,速度非常快。
缺点:只能识别文字信息,对于图片等非文本内容无法识别;另外,
pdf
文档中避免出现 ‘\n’ 等转义字符,否则可能会出现一些识别歧义。
使用情景:文件量大,且只对文本信息有要求的情况
import
os
from configpars
er
import
ConfigPars
er
from io
import
StringIO
from io
import
open
from concurrent.futures
import
Process
Po
所使用
python
环境为最新的3.6版本一、安装
pdf
min
er
模块
安装anaconda后,直接可以通过pip安装pip install
pdf
min
er
3k
如上图所示安装成功。二、在IDE中进行编码#!/usr/bin/env
python
# encoding: utf-8"""
@author: wugang
@software: PyCharm
@file: prase_
pdf
.py
QianTu&:
总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证)
xueweigang: