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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容