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