Извлекайте изображения pdf с помощью pymupdf в правильном порядке

В настоящее время я работаю над экстрактором изображений Python 3.x для файлов pdf и не могу найти решение проблемы, с которой я сталкивался на протяжении всей моей работы. Я намерен извлечь все изображения из pdf-файлов (отчетов об автомобилях) без логотипов компании, предоставляющей эти документы. Пока у меня есть рабочий код, использующий fitz, который находит изображения и сохраняет их (я нашел этот код в Интернете). К сожалению, они возвращаются в неправильном порядке. Для аннотирования изображений заголовками их необходимо сохранять в том порядке, в котором они видны в pdf.

Я уже пытался получить это право, используя имена объектов, определенные в xref-String (строка, определяющая объект в pdf) в порядке возрастания. До этой версии я аннотировал изображения с помощью счетчика через dict (который, как я знаю, не отсортирован, но исправил это с сортировкой ключей), но имел около 2-4 из примерно 30 несортированных изображений. Кроме того, этот код не кажется мне хорошим решением, потому что я "подделываю" номер изображения, аннотируя счетчик.

Моя текущая версия (Имя xref):

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  

Вы также можете предложить совершенно новый способ работы над этой задачей. Заранее спасибо за помощь.

2 ответа

Ответ от сопровождающего репо:

В более новых версиях PyMuPDF (лучше всего использовать v1.17.0) вы можете получить положение изображения на странице. Кажется, это и есть ваше намерение, когда вы говорите о "правильном заказе":rect = page.getImageBbox(name), где имя твое entry[7] над.

Используйте sorted() для списка изображений. если вы можете использовать другую версию, см. /questions/55917175/posledovatelnost-izvlecheniya-izobrazhenij-python-iz-pdf/58310333#58310333

Другие вопросы по тегам