查看原文
其他

PDF图片提取

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王碧琪
文字编辑:戴    雯
技术总编:张    邯



Python云端培训课程报名结束!

     爬虫俱乐部将于2020年7月25日至28日举办的Python编程技术训练营招生工作已圆满结束,感谢大家对我们的支持!



Stata云端培训课程在腾讯课堂上线啦!

      爬虫俱乐部于2020年7月中旬线上举行的Stata编程技术培训课程在腾讯课堂上线啦!课程通过案例教学模式,帮助学员在短期内掌握Stata的基本命令、编程、数据处理以及结果输出等技术,并对Stata16的实用新功能做了详细介绍。

现在关注公众号并在朋友圈转发推文,即可获得600元课程优惠券,集赞50个再领200元课程优惠!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元!

导读


之前我们使用pymupdf提取了PDF文档中的文本信息(《PyMuPDF提取文本信息》),那么对于图片信息,也可以进行一波提取。今天我们一起来试试。

一、简介

待提取PDF文档“demo1”内容如下:

可以观察到,该文档中共有4张图片。提取思路为:首先得到PDF文档的所有对象,然后遍历它们判断是否是图片类型,再将图片信息写入,最后保存为png格式文件。

二、图片提取

(一)引入相应的库

import fitz #处理PDFimport 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

      xrefcross-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)
运行结果为:
34732
这样就定位到了文档中的4张图片。

(四)提取图片

       使用 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
去目标文件夹看一下,成功提取了相应的图片:

以上就是本期推文的全部内容啦,感兴趣的小伙伴快动手试试吧~




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
PDF文档转换成图片
split和nsplit助你轻松拆分

集成学习介绍之三——Stacking算法

PyMuPDF提取文本信息

Mylabels命令介绍  

用WordStat看中国日报新闻  

数据集的划分——交叉验证法

大数据视角下的大学录取分数排行
集成学习介绍之二——Boosting算法

PDF文本信息提取(二)

取长补短、互通有无 ——集成学习介绍之Bagging &随机森林
PDF表格信息提取
神经网络——brain
marktouse标记使用变量
换种视角看问题——支持向量机(SVM)
提取PDF文本信息:入门
毕业季|b站《入海》评论爬取

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存