python解析PDF文件

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文件解析代码,大家可以根据我的代码来分析我的思路!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容