活动地址:CSDN21天学习挑战赛
🏮1 前言
Python在自动化办公方面有很多实用的第三方库,我们可以从官方网https://pypi.org/search/?q=pd找到很多这种第三方库来供给我们使用,这些库可以很方便的处理word
、excel
、ppt
、pdf
等文件,今天我们就学习一下Python处理PDF文档的两个常用库「pdfplumber」、「pypdf2」。
🎈1.1 pdfplumber
-
「实验文档」
官方地址:https://github.com/jsvine/pdfplumber
PyPi库:https://pypi.org/project/pdfplumber/ -
「描述」
探究 PDF 以获取有关每个文本字符、矩形和线条的详细信息。表格提取和可视化在调试阶段。适用于机器产生的pdf文档,而非扫描文档。 -
「当前版本」
v0.7.4 -
「支持版本」
可以支持python3.7 ~ 3.10 +
🎈1.2 pypdf2
-
「实验文档」
PyPi库:https://pypi.org/project/PyPDF2/ -
「描述」
PyPDF2 是一个纯 Python PDF 库,免费开源,可以读取文档信息(标题,作者等)、写入、分割、合并PDF文档,它还可以对pdf文档进行添加水印、加密解密等。 -
「当前版本」
V2.10.1 -
「支持版本」
可以支持python3.6 ~ 3.10 +
🏮2 pdfplumber模块详操
🎈2.1 安装
「安装」
# 网速不好,安装需要一些时间,还有一些依赖库需要安装
Aion.Liu $ pip install pdfplumber
Collecting pdfplumber
Downloading pdfplumber-0.7.4-py3-none-any.whl (40 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.0/40.0 kB 103.8 kB/s eta 0:00:00
Collecting Pillow>=9.1
Using cached Pillow-9.2.0-cp310-cp310-macosx_10_10_x86_64.whl (3.1 MB)
Collecting Wand>=0.6.7
Downloading Wand-0.6.10-py2.py3-none-any.whl (142 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 142.8/142.8 kB 19.0 kB/s eta 0:00:00
Collecting pdfminer.six==20220524
Downloading pdfminer.six-20220524-py3-none-any.whl (5.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.6/5.6 MB 14.7 kB/s eta 0:00:00
Requirement already satisfied: charset-normalizer>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages (from pdfminer.six==20220524->pdfplumber) (2.1.0)
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/cryptography/
Collecting cryptography>=36.0.0
Downloading cryptography-37.0.4-cp36-abi3-macosx_10_10_x86_64.whl (2.8 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.8/2.8 MB 9.8 kB/s eta 0:00:00
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/cffi/
Collecting cffi>=1.12
Downloading cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl (179 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 179.2/179.2 kB 10.1 kB/s eta 0:00:00
Collecting pycparser
Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 118.7/118.7 kB 9.4 kB/s eta 0:00:00
Installing collected packages: Wand, pycparser, Pillow, cffi, cryptography, pdfminer.six, pdfplumber
Successfully installed Pillow-9.2.0 Wand-0.6.10 cffi-1.15.1 cryptography-37.0.4 pdfminer.six-20220524 pdfplumber-0.7.4 pycparser-2.21
最终看到Successfully
就知道我又安装了一个python库。
🎈2.2 基本实例
官方提供的实验的基础例子,我没有下载下来文件,提示连接拒绝。这里,我是直接在浏览器访打开这个地址:
https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf
打开就是一个pdf
文件,然后右键另存为到你磁盘的某一个目录就可以了。然后在文件所在目录下面执行这个命令,将pdf
转为CSV
文件:
Aion.Liu $ pdfplumber < background-checks.pdf > background-checks.cs
转换后使用Excel工具打开就看到下面的内容:
关于pdfplumber
转换的一些参数,如下:
参数 | 描述 |
---|---|
--format [format] | csv 或json 。json格式返回更多信息;它包括 PDF 级和页面级元数据,以及字典嵌套属性。 |
--pages [list of pages] | 以空格分隔、1索引的页面列表或带连字符的页面范围。例如,1, 11-15,它将返回第 1、11、12、13、14 和 15 页的数据。 |
--types [list of object types to extract] | 选择是char, rect, line, curve, image, annot, 等等。默认为所有可用。 |
--laparams | 一个 JSON 格式的字符串(例如,'{"detect_vertical": true}' )传递给pdfplumber.open(..., laparams=...) . |
--precision [integer] | 四舍五入浮点数的小数位数。默认为无舍入。 |
🎈2.3 Python库
- 实验代码
>>> import pdfplumber
>>>
>>> with pdfplumber.open('./background-checks.pdf') as pdf:
... first_page = pdf.pages[0]
... print(first_page.chars[0])
...
{'matrix': (6.96, 0.0, 0.0, 6.96, 47.04, 534.7), 'fontname': 'DCLTEC+Helvetica-Bold', 'adv': 0.667, 'upright': True, 'x0': 47.04, 'y0': 533.0992, 'x1': 51.68232, 'y1': 540.0592, 'width': 4.642319999999998, 'height': 6.960000000000036, 'size': 6.960000000000036, 'object_type': 'char', 'page_number': 1, 'text': 'S', 'stroking_color': None, 'non_stroking_color': None, 'top': 71.94079999999997, 'bottom': 78.9008, 'doctop': 71.94079999999997}
>>>
-
解析:pdfplumber.open(‘
文件路径
’)
打开一个pdf文件的路径,文件字节码对象或者类文件字节码对象。 -
解析:pdfplumber.open(“
文件路径
”, password = “密码
”)
打开一个pdf文件的路径,文件字节码对象或者类文件字节码对象。如果有密码,则需要输入密码,使用password
参数。 -
解析:pdf.pages[0].height
针对pages这个属性,他是pdfplumber的其中一个属性,他是一个集合,里面有很多参数,例如- .page_number :pdf顺序码,默认1,依次类推。
- .width:宽度
- .height:高度
- .objects/ :一个列表,包含一个字典,用于嵌入页面上的每个此类对象。
- .chars/ :文本字符列表,包含一个字典,用于嵌入页面上的每个此类对象。
- .lines/ :单一的一维线列表,包含一个字典,用于嵌入页面上的每个此类对象。
- .rects/ :一个二维矩形列表,包含一个字典,用于嵌入页面上的每个此类对象。
- .curves/:一个列表,包含一个字典,用于嵌入页面上的每个此类对象。
- .images:一个图像列表,包含一个字典,用于嵌入页面上的每个此类对象。
其他参数,可以参考下官方提供的文档,这里不在赘述。https://pypi.org/project/pdfplumber/
🎈2.4 提取表格
提取表格的方式是.extract_tables(table_settings={})
,其中table_settings
是可选项。
- 实验代码
>>> with pdfplumber.open('./background-checks.pdf') as pdf:
... page = pdf.pages[0]
... page.extract_table()
...
[['NICS Firearm Background Checks\nNovember - 2015', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None], ['State / Territory', 'Permit Handgun Long Gun *Other **Multiple Admin', None, None, None, None, None, 'Pre-Pawn\nHandgun Long Gun *Other', None, None, 'Redemption\nHandgun Long Gun *Other', None, None, 'Returned/Disposition\nHandgun Long Gun *Other', None, None, 'Renta
# ……此处省略其他。
从上面一段代码,不难看出来,这里是可以提取pdf中的一个表格,并且打印到了控制台。除了提取表格,还可以在提取前设置提取的table_settings
属性。
{
"vertical_strategy" : "lines" ,
"horizontal_strategy" : "lines" ,
"explicit_vertical_lines" : [],
"explicit_horizo ntal_lines" : [],
"snap_tolerance" : 3 ,
"snap_x_tolerance" : 3 ,
"snap_y_tolerance" : 3 ,
"join_tolerance" : 3 ,
"join_x_tolerance" : 3 ,
"join_y_tolerance" : 3 ,
"edge_min_length": 3 ,
"min_words_vertical": 3 ,
"min_words_horizontal" : 1 ,
"keep_blank_chars" : False,
"text_tolerance" : 3 ,
"text_x_tolerance" : 3 ,
"text_y_tolerance" : 3 ,
"intersection_tolerance" : 3 ,
"intersection_x_tolerance" : 3 ,
"intersection_y_tolerance" : 3 ,
}
属性参数 | 说明 |
---|---|
vertical_strategy | 枚举值,可选项包括"lines" , "lines_strict" , "text" , "explicit" |
horizontal_strategy | 枚举值,可选项包括"lines" , "lines_strict" , "text" , "explicit" |
其他参数,可以参考下官方提供的文档,这里不在赘述。https://pypi.org/project/pdfplumber/
🏮3 pypdf2模块详操
🎈3.1 安装
「安装」
Aion.Liu $ python -m pip install pypdf2
Collecting pypdf2
Downloading PyPDF2-2.10.2-py3-none-any.whl (214 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 214.3/214.3 kB 317.4 kB/s eta 0:00:00
Installing collected packages: pypdf2
Successfully installed pypdf2-2.10.2
pypdf2
的安装比起pdfplumber
相当简单,PyPDF2 是一个免费的开源纯 python PDF 库。如果您计划使用 PyPDF2 加密或解密使用 AES 的 PDF,您将需要安装一些额外的依赖项。使用常规安装支持使用 RC4 加密。则需要安装下面的依赖:
Aion.Liu $ pip install PyPDF2[crypto]
🎈3.2 基本实例
PyPDF2 可以做更多的事情,例如拆分、合并、读取和创建注释、解密和加密等等。
>>> from PyPDF2 import PdfReader
>>>
>>> reader = PdfReader('./background-checks.pdf')
>>> number_of_pages = len(reader.pages)
>>> page = reader.pages[0]
>>> text = page.extract_text()
# 页码
>>> print(number_of_pages)
1
# 分页对象
>>> print(page)
{'/Type': '/Page', '/Parent': IndirectObject(3, 0, 4326346464), '/Resources': IndirectObject(6, 0, 4326346464), '/Contents': IndirectObject(4, 0, 4326346464), '/MediaBox': [0, 0, 1008, 612]}
# 内容
>>> print(text)
State / TerritoryPermit HandgunLong Gun*Other**MultipleAdminHandgunLong Gun*OtherHandgunLong Gun*OtherHandgunLong Gun*OtherHandgunLong GunHandgunLong Gun*OtherHandgunLong Gun*OtherTotals Alabama18,87023,02222,6508591,1780141502,1792,307110001314032071,137 Alaska2093,0623,2091911840930100100018910000007,095 Arizona2,30312,3829,04170761805301,2736484768196111027,087 Arkansas3,2986,35911,611168376012619222,2751000612100025,048 California98 45241 18135 00745 5 9000004804334000000000180 116 Colorado4,14419,78416,0829321,151000000014434000000042,271 Connecticut9,63111,5945,0721340700000000000000026,438 Delaware2042,1522,4246572034017120000592404005,040 District of Columbia854200000000000000000064 Florida 15,907 50,796 28,981 2,268 1,957 121 8 9 02 , 2 4 81 , 1 3 5 2 40 5 0 36 19 0 0 0 01 0 3 , 5 3 2
Georgia 14,111 16,635 15,227 448 758 0 10 14 01 , 7 7 21 , 7 9 6 4 0 0 0 10 9 1 0 0 05 0 , 7 9 5
Guam 0 100 55 12 30 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 171
Hawaii 1,248 00 0 0 0 0 0 0 0 0 0 1 3 0 0 0 0 0 0 01 , 2 5 2
Idaho 1,944 3,609 5,227 190 189 0 0 4 0 273 455 1 22 4 1 1 2 0 0 3 01 1 , 9 2 5
Illinois 87,190 24,412 17,227 0 1,032 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 2 9 , 8 6 1
Indiana 81,935 25,519 20,227 1,113 808 0 2 3 0 13 629 5 28 0 0 31 13 1 2 4 01 3 0 , 3 3 3
Iowa 8,785 267 4,596 27 4 37 0 1 0 0 71 0 4 2 0 0 0 0 0 0 01 3 , 7 9 4
Kansas 894 7,086 8,702 311 396 3 1 3 1 486 530 2 2 0 0 6 10 0 0 0 01 8 , 4 3 3
Kentucky 264,140 12,155 14,847 254 648 1 9 11 01 , 4 9 12 , 3 1 5 2 2 2 0 6 8 0 0 0 02 9 5 , 8 9 1
Louisiana 1,945 14,708 17,368 697 793 0 5 11 2 884 1,323 3 0 0 0 1 10 1 0 1 03 7 , 7 5 2
Maine 299 4,048 4,387 135 171 2 0 0 0 70 165 0 6 7 0 4 3 0 0 0 09 , 2 9 7
Mariana Islands 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Maryland 1,512 3,220 8,310 96 90 0 3 0 72 213 2 14 3 1 1 6 1 0 0 01 3 , 4 6 3
Massachusetts 5,214 6,083 3,931 402 175 0 0 1 0 2 5 0 1 0 1 42 23 5 0 0 01 5 , 8 8 5
Michigan 16,786 13,634 17,604 385 238 1,025 1 4 0 5 489 2 69 24 0 4 1 1 2 3 15 0 , 2 7 8
Minnesota 18,939 9,373 14,173 486 330 0 1 2 0 176 512 0 8 11 0 2 6 0 0 2 24 4 , 0 2 3
Mississippi 618 9,785 13,191 267 523 9 28 20 01 , 1 7 11 , 8 7 4 1 0 0 0 6 6 3 2 0 02 7 , 5 0 4
Missouri 5,884 21,135 22,852 1,004 1,060 0 11 16 01 , 1 3 11 , 7 5 4 3 99 11 4 33 25 6 0 3 05 5 , 0 3 1
Montana 852 2,848 5,170 90 197 10 1 4 6 391 828 1 11 4 0 0 2 0 0 0 01 0 , 4 1 5
Nebraska 4,258 173 3,724 23 10 0 1 0 0 5 96 1 7 0 0 0 0 1 0 0 08 , 2 9 9
Nevada 1,543 4,889 3,272 193 287 0 0 0 0 284 163 0 1 0 0 0 0 0 0 0 01 0 , 6 3 2
New Hampshire 3,630 4,847 4,165 95 21 0 0 0 0 23 1 69 11 1 2 2 0 0 1 01 2 , 8 5 0
New Jersey 03 , 4 6 2 4 , 7 0 4 147 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 08 , 3 1 3
New Mexico 829 5,247 4,974 334 277 0 2 3 1 397 618 1 33 0 0 0 4 0 1 0 01 2 , 7 2 1
New York 2,906 8,650 23,519 665 149 0 0 3 0 16 25 0 0 0 0 243 220 16 5 4 03 6 , 4 2 1
North Carolina 22,469 1,370 20,107 576 202 0 16 25 01 , 7 7 12 , 6 4 4 7 0 0 0 2 26 1 1 0 04 9 , 2 1 7
North Dakota 453 1,720 3,744 65 79 0 0 3 0 65 157 0 0 0 0 1 1 0 0 0 06 , 2 8 8
Ohio 9,338 34,878 31,817 1,392 1,483 0 24 16 11 , 2 2 81 , 3 8 9 4 0 0 0 21 22 1 1 0 18 1 , 6 1 6
Oklahoma 01 5 , 0 0 5 1 4 , 7 5 3 778 998 0 11 7 11 , 6 3 92 , 2 2 6 6 0 0 0 11 21 0 0 1 03 5 , 4 5 7
Oregon 35 13,586 11,832 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 02 5 , 4 5 3
Pennsylvania 24,136 62,752 16,297 0 0 58 0 0 0 0 0 0 446 147 0 0 0 0 0 0 01 0 3 , 8 3 6
Puerto Rico 01 , 0 3 3 170 11 20 0 0 0 0 6 1 0 0 0 0 0 0 0 0 1 01 , 2 4 2
Rhode Island 0 954 932 57 135 0 0 0 0 3 4 0 0 0 0 12 2 1 1 0 02 , 1 0 1
South Carolina 7,284 11,452 10,393 561 438 0 3 8 0 979 912 3 16 4 0 4 6 0 1 0 03 2 , 0 6 4
South Dakota 819 2,765 5,484 143 151 0 0 1 0 123 239 0 0 0 0 1 1 0 0 0 09 , 7 2 7
Tennessee 9,509 28,815 24,023 0 1,300 0 0 0 0 0 0 0 17 1 5 0 0 0 0 0 06 3 , 6 7 0
Texas 21,550 56,941 51,670 2,532 3,048 0 29 20 05 , 7 4 85 , 3 3 1 21 1 2 1 42 36 4 1 5 01 4 6 , 9 8 2
Utah 10,429 4,314 5,857 195 262 0 0 1 0 209 285 1 140 58 21 0 0 0 0 0 02 1 , 7 7 2
Vermont 01 , 1 8 9 1 , 8 2 6 49 70 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 03 , 1 3 6
Virgin Islands 93 13 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 109
Virginia 622 24,052 22,348 974 00 0 0 0 0 0 0 10 4 0 0 0 0 0 0 04 8 , 0 1 0
Washington 10,314 15,822 12,425 1,238 606 4 8 8 01 , 0 9 61 , 1 2 9 3 356 159 3 444 340 19 6 9 04 3 , 9 8 9
West Virginia 2,217 6,953 11,561 224 478 2 4 9 0 923 2,678 3 0 0 0 3 8 0 0 0 02 5 , 0 6 3
Wisconsin 5,867 13,700 17,759 458 45 0 0 3 0 124 513 3 15 20 4 10 15 1 0 3 13 8 , 5 4 1
Wyoming 383 1,745 2,372 87 104 1 0 4 0 132 184 0 0 0 0 1 2 0 0 2 05 , 0 1 7
Totals 804,006 671,330 636,903 26,597 23,015 1,281 218 249 13 29,905 38,487 102 1,656 533 44 0 01 , 0 6 7 905 65 31 45 52 , 2 3 6 , 4 5 7NICS Firearm Background ChecksNovember - 2015Pre-PawnRedemptionReturned/DispositionRentalsPrivate SaleReturn to Seller - Private Sale
NOTES:*Refers to frames, receivers and other firearms that are not either handguns or long guns (rifles or shotguns), such as firearms having a pistol grip that expel a shotgun shell**Multiple (multiple types of firearms selected)DISCLAIMERS:Some states may reflect lower than expected numbers for handgun checks based on varying state laws pertaining to handgun permits Since the permit check is done in place of the NICS check in most of the affected states, the low handgun statistics are often balanced out by a higher number of handgun permit checksThese statistics represent the number of firearm background checks initiated through the NICS They do not represent the number of firearms sold Based on varying state laws and purchase scenarios, a one-to-one correlation cannot be made between a firearm background check and a firearm salePage 1 of 205
>>>