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()

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
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字体进行替换。

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

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