PDF图片提取
本文作者:王碧琪
文字编辑:戴 雯
技术总编:张 邯
Python云端培训课程报名结束!
爬虫俱乐部将于2020年7月25日至28日举办的Python编程技术训练营招生工作已圆满结束,感谢大家对我们的支持!
Stata云端培训课程在腾讯课堂上线啦!
爬虫俱乐部于2020年7月中旬在线上举行的Stata编程技术培训课程在腾讯课堂上线啦!课程通过案例教学模式,帮助学员在短期内掌握Stata的基本命令、编程、数据处理以及结果输出等技术,并对Stata16的实用新功能做了详细介绍。
现在关注公众号并在朋友圈转发推文,即可获得600元课程优惠券,集赞50个再领200元课程优惠!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!导读
之前我们使用pymupdf提取了PDF文档中的文本信息(《PyMuPDF提取文本信息》),那么对于图片信息,也可以进行一波提取。今天我们一起来试试。
一、简介
二、图片提取
(一)引入相应的库
import fitz #处理PDF
import re #使用正则表达式
import os #进行相关路径的判断
(二)导入PDF&创建导出图片的文件夹
path = r"F: \pdfs\demo1.pdf" #导入的pdf的路径
pic_path = r"F: \ima" #导出图片的文件夹
if not os.path.exists(pic_path):
os.mkdir(pic_path)
else:
print("文件夹已存在,不必重建!")
doc = fitz.open(path) #打开pdf文件
lenXREF = doc.xrefLength()-1 #获取对象数量长度
print(f"文件名:{path}, 页数: {doc.pageCount}, 对象: {lenXREF}") #打印PDF的信息
文件夹已存在,不必重建!
文件名:F: \pdfs\demo1.pdf, 页数: 3, 对象: 54
xref
是 cross-reference
的缩写。xref比现有对象的数量大一个,所以可以用 Document.xrefLength()-1
得到PDF文档中的对象总数。结果显示:demo1文档有3页,54个对象。
(三)遍历对象,定位图片
for i in range(1, lenXREF):
print(i)
text = doc.xrefObject(i) #得到xref对象的相关信息
print(text)
部分结果如下:
可以看到其中记录了每一个对象的信息。例如对象3,它是一个图片,text中记录了它的type和subtype。我们利用 subtype
标记为 image
这一点,来定位图片。
checkIM = r"/Subtype(?= */Image)" #使用正则表达式来查找图片
for i in range(1, lenXREF):
text = doc.xrefObject(i) #定义对象字符串
isImage = re.search(checkIM, text) #查看是否是image
if isImage:
print(i)
3
4
7
32
(四)提取图片
使用 fitz.Pixmap(doc,xref)
函数创建 pixmap
。像素图的属性(宽度、高度等)将反映图像的属性。这里的xref要对应上面定位到的图片的xref标号。使用pixmap对象的 writePNG(filename)
函数,可以将pixmap保存为png格式的图片。
imgcount = 0 #图片计数
for i in range(1, lenXREF):
text = doc.xrefObject(i) #定义对象字符串
isImage = re.search(checkIM, text) #查看是否是image
if not isImage: #如果不是图片,则进行下一个判断
continue
imgcount += 1 #图片计数
pix = fitz.Pixmap(doc, i) #生成图像对象
new_name = f"图片{imgcount}.png" #生成图片的名称
print(new_name)
pix.writePNG(os.path.join(pic_path, new_name))
pix = None
图片1.png
图片2.png
图片3.png
图片4.png
PDF文本信息提取(二)
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。