美文网首页
python解析PDF文件

python解析PDF文件

作者: 王文强Python | 来源:发表于2020-02-23 16:30 被阅读0次

    1、当时用的python3.7在 pdfminer3k 与 pdfplumber 两个库之间存在冲突,安装pdfplumber时会将pdfminer3k覆盖掉,安装的时候要先安装pdfplumber再安装pdfminer3k。
    2、阿里云RPA只支持python3.5,后来我的环境就改成了3.5
    3、首先创建 python3.5 的 virtualenv
    4、cmd中进入创建的 env 中安装pdfplumber命令:

    pip install pdfplumber  -i https://pypi.doubanio.com/simple/
    
    此时会按照相关的第三方库:
    chardet, pycryptodome, unicodecsv, sortedcontainers, pdfminer.six, six, pillow, wand, pdfplumber
    本版分别为:
    chardet-3.0.4 pdfminer.six-20200104 pdfplumber-0.5.19 pillow-7.1.1 pycryptodome-3.9.7 six-1.14.0 sortedcontainers-2.1.0 unicodecsv-0.14.1 wand-0.5.9
    

    5、在运行下方代码时会报错:

    import pdfplumber
    
    pdf = pdfplumber.open(path)
    p0 = pdf.pages[0]
    im = p0.to_image()
    
    1.png

    6、打开下方网站

    http://docs.wand-py.org/en/latest/guide/install.html#install-imagemagick-on-windows
    
    2.png

    这个网站有ImageMagick的安装方法

    7、打开下方网站下载ImageMagick-7.0.10-7-Q16-x64-dll.exe

    [https://imagemagick.org/script/download.php#windows](https://imagemagick.org/script/download.php#windows)
    
    3.png

    8、from pdfminer.pdfinterp import process_pdf 时会报错

    pdfminer3k  与 pdfplumber 两个库之间存在冲突
    先安装pdfplumber  (切记安装顺序)
    from pdfminer.pdfinterp import  process_pdf 时会报错
    这时候再安装pdfminer3k就不会报错了
    pip install pdfminer3k  -i https://pypi.doubanio.com/simple/
    

    会报错

    from .pdftypes import PDFObjectNotFound
    ImportError: cannot import name 'PDFObjectNotFound'
    

    转来转去最后发现对于只有表格和文字的pdf 用 pdfminer3k 再配合 tabula 去读取表格

    import tabula
    
    df_list = tabula.read_pdf(self.pdf_path, encoding='UTF-8', pages=new_all_pages,multiple_tables = True, lattice=True)
    

    上面这个完了还有个坑

    Tabula是专门用来提取PDF表格数据的,同时支持PDF导出为CSV、Excel格式。
    官网: [http://tabula.technology/](http://tabula.technology/)
    Github: [https://github.com/chezou/tabula-py](https://github.com/chezou/tabula-py)
    首先安装tabula-py: `pip install tabula-py`   (重点在这里)
    tabula-py依赖库包括java、pandas、numpy,所以需保证运行环境中安装了这些库。
    安装java的链接可参考:[https://www.jianshu.com/p/a66e393e1b27](https://www.jianshu.com/p/a66e393e1b27)
    

    java 安装包
    链接:https://pan.baidu.com/s/1TZ32uR1pN3zz1HWRqdX_qA
    提取码:8onf

    代码如下:

    import tabula
    
    df = tabula.read_pdf("D:/test.pdf", encoding='gbk', pages='all')
    print(df)
    for indexs in df.index:
        # 遍历打印企业名称
        print(df.loc[indexs].values[1].strip())
    

    又遇到一个大坑
    https://github.com/euske/pdfminer/tree/2103e5875ef04cfaf424b25d2fd0dc9535a90714/pdfminer/cmap
    再来总结一下pdfminer遇到的坑
    1、应该安装pdfminer3k
    2、缺少字符编码(UniGB-UCS2-H、Adobe-GB1)

    从下方网址中下载  pdfminer包
    下载好后将UniGB-UCS2-H.pickle.gz、to-unicode-Adobe-GB1.pickle.gz不要解压直接放在 Py35Env\Lib\site-packages\pdfminer\cmap文件夹下
    https://github.com/euske/pdfminer/tree/2103e5875ef04cfaf424b25d2fd0dc9535a90714
    
    可以参考https://www.cnblogs.com/wzjbg/p/7644127.html
    
    7.png
    8.png
    9.png

    字符编码的问题解决后又会抛出下方红色字


    10.png

    解决办法


    11.png
    好了基本大功告成
    下方附一段代码
    from io import StringIO
    from io import open
    from pdfminer.converter import TextConverter
    from pdfminer.layout import LAParams
    from pdfminer.pdfinterp import PDFResourceManager, process_pdf
    
    pdf_path = 'D:\RPA_ProjectFile\Cody\Pdffile\20200420154222.pdf'
    
    def read_pdf(pdf):
        # resource manager
        rsrcmgr = PDFResourceManager()
        retstr = StringIO()
        laparams = LAParams()
        # device
        device = TextConverter(rsrcmgr, retstr, laparams=laparams)
        process_pdf(rsrcmgr, device, pdf)
        device.close()
        content = retstr.getvalue()
        retstr.close()
        lines = str(content).split("\n")
        return lines
    
    
    with open(pdf_path, "rb") as pdf:
        PQ = read_pdf(pdf)
        for div in range(len(PQ)):
            temp = PQ[div].strip()
            print(temp)
    

    在使用 tabula 提取pdf文件中的表格时 提示当前环境缺少CID-keyed font AdobeKaitiStd-Regular字体和CID-keyed font STSong-Light字体,pdfbox使用使用LiberationSans字体进行替换。


    1.png
    Got stderr:  org.apache.pdfbox.pdmodel.font.PDCIDFontType0 <init>
    警告: Using fallback MT-Extra for CID-keyed font STSong-Light
    

    这两个字体可以用AdobeKaitiStd-Regular.otf和SimSun.ttf两个字体文件。
    找字体文件可以在自己的电脑上找,可以在这个C:\Windows\Fonts找到,或者用everything工具查找,没有的话可以在网上找
    有些字体实在找不到,也可以修改pdfbox的源码,修改字体的替换规则,
    替换的规则在org.apache.pdfbox.pdmodel.font.FontMapperImpl可以查看到

    参考两个网站
    https://blog.csdn.net/qq_28822933/article/details/83239950
    https://blog.csdn.net/qq_36956002/article/details/105094651

    字体目录 【控制面板\外观和个性化\字体】


    3.png

    另外还有一种解析PDF文件的方法就是将pdf转成html文件
    https://github.com/coolwanglu/pdf2htmlEX
    在cmd中以命令的方式直接将pdf转成html,然后再去html文件中解析数据,熟悉爬虫页面解析的可以尝试一下所见即所得也挺简单的。

    使用pdfminer、tabula第三方库文本和表格都能提取出来,接下来要解决的问题是在这些杂乱无章的数据中正确的提取出自己想要数据,首先分析pdf页面的规律找到自己想要的数据在哪里,往往是文本要和表格对应起来pdfminer用来提取文本内容,tabula来提取表格,再根据规律将文本和表格对应起来,我这边有一份 收货单、送货单、订货单的pdf文件解析代码,大家可以根据我的代码来分析我的思路!

    相关文章

      网友评论

          本文标题:python解析PDF文件

          本文链接:https://www.haomeiwen.com/subject/jgijqhtx.html