Библиотека Python для извлечения изображений

Да, я ненавижу себя за то, что задаю довольно простой вопрос.

Я надеялся получить совет относительно лучшей библиотеки Python для извлечения изображений (различного типа) из PDF.

Я пытаюсь взять чертеж в формате PDF, сохранить из него изображение и его положение в PDF, а затем поместить сохраненное изображение в нужное место на множестве других PDF-файлов.

Я пытался сделать это недавно, но застрял в различных ошибках, и исследование, которое я провел, показывает, что нет ясного и очевидного выбора.

Я пробовал PyPDF2, но получил ошибку о том, что PNG фильтр 3 не поддерживается. Я пробовал PDFMiner, но он ограничен JPEG, который пока не нарушает условия сделки, но я до сих пор не могу заставить его извлечь JPEG. Я также попробовал модуль fitz из PyMuPDF и получил 1 из 3 изображений в моем PDF, однако он был перевернутым цветом, назад, вверх ногами. Хотя я уверен, что есть постобработка для этого

Честно говоря, код, который я использовал, - это примеры, которые придумали люди намного умнее меня, и я изменил их по мере необходимости.

Фитц ниже

doc = fitz.open(pdf)
for i in range(len(doc)):
    for img in doc.getPageImageList(i):
        xref = img[0]
        pix = fitz.Pixmap(doc, xref)
        if pix.n < 5:       # this is GRAY or RGB
            pix.writePNG("p%s-%s.png" % (i, xref))
        else:               # CMYK: convert to RGB first
            pix1 = fitz.Pixmap(fitz.csRGB, pix)
            pix1.writePNG("p%s-%s.png" % (i, xref))
            pix1 = None
        pix = None

PyPDF2 ниже

if __name__ == '__main__':
    input1 = PyPDF2.PdfFileReader(pdf)
    page0 = input1.getPage(0)

if '/XObject' in page0['/Resources']:
    xObject = page0['/Resources']['/XObject'].getObject()

    for obj in xObject:
        if xObject[obj]['/Subtype'] == '/Image':
            size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
            data = xObject[obj].getData()
            if xObject[obj]['/ColorSpace'] == '/DeviceRGB':
                mode = "RGB"
            else:
                mode = "P"

            if '/Filter' in xObject[obj]:
                if xObject[obj]['/Filter'] == '/FlateDecode':
                    img = Image.frombytes(mode, size, data)
                    img.save(obj[1:] + ".png")
                elif xObject[obj]['/Filter'] == '/DCTDecode':
                    img = open(obj[1:] + ".jpg", "wb")
                    img.write(data)
                    img.close()
                elif xObject[obj]['/Filter'] == '/JPXDecode':
                    img = open(obj[1:] + ".jp2", "wb")
                    img.write(data)
                    img.close()
                elif xObject[obj]['/Filter'] == '/CCITTFaxDecode':
                    img = open(obj[1:] + ".tiff", "wb")
                    img.write(data)
                    img.close()
            else:
                img = Image.frombytes(mode, size, data)
                img.save(obj[1:] + ".png")

Если вы читаете это и написали что-то из вышеперечисленного, спасибо, что выучили меня так далеко, ха-ха.

Больше ищите советов о том, какая библиотека лучше всего подходит, а не кто-то держит меня за руку с кодом.

Цените любую передачу мудрости

Пит

1 ответ

PyPDF2 может (сейчас) это сделать. Прямо из документов :

      from PyPDF2 import PdfReader

reader = PdfReader("example.pdf")

page = reader.pages[0]
count = 0

for image_file_object in page.images:
    with open(str(count) + image_file_object.name, "wb") as fp:
        fp.write(image_file_object.data)
        count += 1
Другие вопросы по тегам