解决pdfminer ImportError: cannot import name process_pdf

本文解决了PDF读取时出现的pdfminer导入错误问题,并提供了两种实用的Python代码示例,用于读取PDF文件并转换为文本,适用于最新版pdfminer。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 2.7
IDE Pycharm 5.0.3
pdfminer 20140328


解决问题和测试多个版本读pdf

解决问题

在进行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

### 解决 `mmdet.apis` 中无法导入 `'init_dist'` 的 `ImportError` 当遇到 `ImportError: cannot import name 'init_dist' from 'mmdet.apis'` 这类错误时,通常有几种可能的原因和解决方案。 #### 1. 版本兼容性问题 确保所使用的 MMDetection 库版本与项目需求相匹配。不同版本之间可能存在 API 变更或移除某些函数的情况。建议查看官方文档确认当前版本支持哪些功能[^1]。 #### 2. 安装依赖库不完全 有时安装过程中可能会遗漏一些必要的子模块或其他依赖项,这可能导致特定接口不可用。尝试重新安装整个环境或者单独更新 mmdet: ```bash pip install --upgrade mmcv-full mmdet ``` 如果是在 conda 环境下,则可以考虑使用如下命令来创建一个新的虚拟环境并安装最新稳定版: ```bash conda create -n open-mmlab python=3.8 -y conda activate open-mmlab pip install mmcv-full mmdet ``` #### 3. 导入路径配置不当 检查项目的结构布局以及 Python 路径设置是否正确无误。特别是对于自定义扩展来说,要保证所有相关联的脚本能被正常解析到。可以通过调整 PYTHONPATH 或者修改 sys.path 来修正这个问题[^3]。 #### 4. 文件间相互引用造成循环依赖 正如提到的例子那样,确实存在由于多个文件之间的交叉引用而导致的无限递归加载现象。为了避免这种情况发生,在设计程序架构之初就应该尽量减少不必要的双向关联;另外还可以通过重构代码逻辑、引入中间层等方式打破这种恶性循环关系。 #### 5. 函数名变更或删除 考虑到框架本身也在不断迭代演进之中,不排除部分旧有的API已经被废弃或是重命名的可能性。此时应当参照最新的开发指南来进行相应调整。例如,如果是关于分布式训练初始化方面的需求,或许应该寻找替代方案如 `torch.distributed.init_process_group()` 结合 PyTorch 使用。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值