0

我目前正在为 pdf 文件开发 Python 3.x 图像提取器,但似乎无法找到解决我在整个工作过程中遇到的问题的解决方案。我的目的是提取 pdf 文件(车辆报告)的所有图像,而无需提供这些文件的公司的徽标。到目前为止,我有一个使用 fitz 的工作代码,它可以找到图像并存储它们(我在互联网上找到了这个代码)。不幸的是,它们以错误的顺序退回。为了用标题注释图片,它们必须按照它们在 pdf 中的显示顺序保存。

我已经尝试通过按升序使用外部参照字符串(在 pdf 中定义对象的字符串)中定义的对象名称来解决这个问题。在那个版本之前,我通过字典用计数器注释图片(我知道它是未排序的,但通过对键进行排序来修复它),但是大约 30 张图像中有大约 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  

也可以随意提出一种全新的方式来完成这项任务。在此先感谢您的帮助。

4

2 回答 2

3

来自回购维护者的回答:

在较新的 PyMuPDF 版本(最好使用 v1.17.0)中,您可以获得图像在页面上的位置。当您谈论“正确的顺序”:时,这似乎是您的意图rect = page.getImageBbox(name),其中名称是您的entry[7]上面。

于 2020-06-11T19:50:07.610 回答
0

将 sorted() 用于图像列表。如果您可以使用不同的版本,请参阅https://stackoverflow.com/a/68267356/7240889

于 2021-07-06T08:59:45.177 回答