Библиотека 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