相关文章推荐
奔跑的小虾米  ·  How can I do a UML ...·  1 年前    · 

在进行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
写法一:

# -*- coding: utf-8 -*-
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):
    #来创建一个pdf文档分析器
    parser = PDFParser(Path)
    #创建一个PDF文档对象存储文档结构
    document = PDFDocument(parser)
    # 检查文件是否允许文本提取
    if not document.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        # 创建一个PDF资源管理器对象来存储共赏资源
        rsrcmgr=PDFResourceManager()
        # 设定参数进行分析
        laparams=LAParams()
        # 创建一个PDF设备对象
        # device=PDFDevice(rsrcmgr)
        device=PDFPageAggregator(rsrcmgr,laparams=laparams)
        # 创建一个PDF解释器对象
        interpreter=PDFPageInterpreter(rsrcmgr,device)
        # 处理每一页
        for page in PDFPage.create_pages(document):
            interpreter.process_page(page)
            # 接受该页面的LTPage对象
            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文件路径。识别中文的效果像是这样的
这里写图片描述

我知道很难看,没办法,这是一篇期刊,里面各种图,影响识别的。

# -*- coding: utf-8 -*-
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!
写法一:

# -*- coding: utf-8 -*-
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()
    # 创建一个PDF资源管理器对象来存储共赏资源
    retstr = StringIO()
    laparams=LAParams()
    device = TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=laparams)
    # 创建一个PDF解释器对象
    #修改此行
    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中成功

# -*- coding: utf-8 -*-
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):
    #来创建一个pdf文档分析器
    parser = PDFParser(DataIO)
    #创建一个PDF文档对象存储文档结构
    document = PDFDocument(parser)
    # 检查文件是否允许文本提取
    if not document.is_extractable:
        raise PDFTextExtractionNotAllowed
    else:
        # 创建一个PDF资源管理器对象来存储共赏资源
        rsrcmgr=PDFResourceManager()
        # 设定参数进行分析
        laparams=LAParams()
        # 创建一个PDF设备对象
        # device=PDFDevice(rsrcmgr)
        device=PDFPageAggregator(rsrcmgr,laparams=laparams)
        # 创建一个PDF解释器对象
        interpreter=PDFPageInterpreter(rsrcmgr,device)
        # 处理每一页
        for page in PDFPage.create_pages(document):
            interpreter.process_page(page)
            # 接受该页面的LTPage对象
            layout=device.get_result()
            for x in layout:
                try:
                    if(isinstance(x,LTTextBoxHorizontal)):
                        with open('%s'%(Save_path),'a') as f:
                            #参数a,表示不会覆盖,直接追加写,和w不一样
                            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&: 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 你好,请问这个是直接copy到terminal中然后就可以吗?我的报错显示 (null): can't open file 'tools\conv_cmap.py': [Errno 2] No such file or directory 总结:Bias(偏差),Error(误差),Variance(方差)及CV(交叉验证) xueweigang: 好棒,集百家之所长,非常nice