我目前正在开发一个用于pdf文件的Python3.x图像提取器,但似乎找不到一个解决方案来解决我在整个工作过程中遇到的问题。我的目的是提取pdf文件(车辆报告)的所有图像,而不是提供这些文件的公司的徽标。到目前为止,我有一个使用fitz的工作代码,它可以找到图像并存储它们(我在互联网上找到了这个代码)。不幸的是,它们以错误的顺序返回。为了用标题注释图片,它们必须按照在pdf中显示的顺序保存。
我已经尝试过以升序使用xref-String (定义pdf中的对象的字符串)中定义的对象名称。在这个版本之前,我通过字典(我知道它是未排序的,但通过对键进行排序来修复它)用计数器注释图片,但大约有2-4张图片是未排序的。此外,这段代码对我来说似乎不是一个好的解决方案,因为我通过注释计数器来“伪造”图像编号。
我的当前版本(外部参照名称):
import fitz
import sys
import re
checkXO = r"/Type(?= */XObject)" # finds "/Type/XObject"
checkIM = r"/Subtype(?= */Image)" # finds "/Subtype/Image"
doc = fitz.open(fr"{pdfpath}")
lenXREF = doc._getXrefLength() # number of objects
pixmaps = {}
imgcount=0
count=0
imglist=[]
for i in range(1, lenXREF): # scan through all objects
text = doc._getXrefString(i) # string defining the object
isXObject = re.search(checkXO, text) # tests for XObject
isImage = re.search(checkIM, text) # tests for Image
if not isXObject or not isImage: # not an image object if not both True
continue
count+=1
pix = fitz.Pixmap(doc, i) # make pixmap from image
if re.search(r'Name \WIm(\d+)',text) != None:
imglist.append(re.search(r'Name \W(Im\d+)',text).group(1))
pixmaps[re.search(r'Name \W(Im\d+)',text).group(1)]=pix
if re.search(r'Name \W(Im\d+)',text) == None:
imglist.append(count)
pixmaps[count]=pix
imglist1=[]
for i in range(1,doc.pageCount):
if len(doc.getPageImageList(i))>1:
for entry in doc.getPageImageList(i):
imglist1.append(entry[7])
break
for entry in imglist1:
pixmaps[entry].writeImage(fr"{dirpath}\%s.jpg" % (imgcount),'jpg')
imgcount+=1 你也可以提出一种全新的方式来完成这项任务。提前感谢您的帮助。
发布于 2020-06-12 03:50:08
来自repo维护者的回答:
在较新的PyMuPDF版本(最好使用v1.17.0)中,您可以获取图像在页面上的位置。当你谈到“正确的顺序”时,这似乎是你的意图:rect = page.getImageBbox(name),其中entry[7]是你上面的名字。
发布于 2021-07-06 16:59:45
对图像列表使用已排序的()。如果您可以使用不同的版本,请参阅https://stackoverflow.com/a/68267356/7240889
https://stackoverflow.com/questions/57754100
复制相似问题