Извлечь изображение из PDF в Python - PullRequest
4 голосов
/ 11 декабря 2019

Я пытаюсь извлечь изображения из PDF с помощью PyPDF2, но когда мой код получает его, изображение сильно отличается от того, как оно должно выглядеть на самом деле, посмотрите на пример ниже:

text Но вот как это должно выглядеть на самом деле:

text

Вот PDF-файл, который я использую:

https://www.hbp.com/resources/SAMPLE%20PDF.pdf

Вотмой код:

pdf_filename = "SAMPLE.pdf"
pdf_file = open(pdf_filename, 'rb')
cond_scan_reader = PyPDF2.PdfFileReader(pdf_file)
page = cond_scan_reader.getPage(0)

xObject = page['/Resources']['/XObject'].getObject()
i = 0
for obj in xObject:
    # print(xObject[obj])
    if xObject[obj]['/Subtype'] == '/Image':
        if xObject[obj]['/Filter'] == '/DCTDecode':
            data = xObject[obj]._data
            img = open("{}".format(i) + ".jpg", "wb")
            img.write(data)
            img.close()
            i += 1 

И так как мне нужно сохранить изображение в цветном режиме, я не могу просто преобразовать его в RBG, если это был CMYK, потому что мне нужна эта информация. Кроме того, я пытаюсь получить dpi из изображений, которые я получаю из PDF, всегда ли эта информация хранится в изображении? Заранее спасибо

Ответы [ 2 ]

1 голос
/ 11 декабря 2019

Я использовал pdfreader , чтобы извлечь изображение из вашего примера. Изображение использует ICCBased цветовое пространство со значением N = 4 и Намерение значение RelativeColorimetric . Это означает, что «ближайшим» цветовым пространством PDF является DeviceCMYK .

Все, что вам нужно, - это преобразовать изображение в RGB и инвертировать цвета.

Вот код:

from pdfreader import SimplePDFViewer
import PIL.ImageOps 

fd = open("SAMPLE PDF.pdf", "rb")
viewer = SimplePDFViewer(fd)

viewer.render()
img = viewer.canvas.images['Im0']

# this displays ICCBased 4 RelativeColorimetric
print(img.ColorSpace[0], img.ColorSpace[1].N, img.Intent)

pil_image = img.to_Pillow()
pil_image = pil_image.convert("RGB")
inverted = PIL.ImageOps.invert(pil_image)


inverted.save("sample.png")

Подробнее об объектах PDF: изображение (с. 8.9.5) , InlineImage (с. 8.9.7)

1 голос
/ 11 декабря 2019

Надеюсь, это работает: вам, вероятно, нужно использовать другую библиотеку, такую ​​как Pillow:

Вот пример:


    from PIL import Image
    image = Image.open("path_to_image")
    if image.mode == 'CMYK':
        image = image.convert('RGB')
    image.write("path_to_image.jpg")

Ссылка: Преобразование из CMYK в RGB

...