Извлечение изображений из файла PDF с помощью Python и библиотек Fitz и Pillow
В этом блоге мы узнаем, как читать и извлекать содержимое (как текст, так и изображения), вращать отдельные страницы и разбивать документы на отдельные страницы. В этой статье более подробно рассмотрим извлечение изображений из pdf-файлов с помощью Pillow и библиотеки Fitz.
Приведенный ниже код извлекает изображения из файла PDF с помощью библиотеки fitz
. Сначала он открывает файл PDF с помощью fitz.open()
и перебирает все страницы в PDF с помощью len(pdf_file)
. Для каждой страницы он извлекает все изображения на странице с помощью page.get_images()
и перебирает их с помощью enumerate()
. Затем он извлекает байты изображения с помощью pdf_file.extract_image(xref)
и загружает их в изображение PIL с помощью Image.open(io.BytesIO(image_bytes))
. Наконец, он сохраняет изображение на диск с помощью image.save()
с именем файла, основанным на исходном имени файла, номере страницы и номере изображения.
Также обратите внимание, что fitz
и pillow
не является встроенной библиотекой Python, поэтому вам может потребоваться установить ее отдельно, используя pip install PyMuPDF Pillow
.
import os
import pandas as pd
from PIL import Image
from io import BytesIO
import fitz
import io
file = 'useR_PrecTemp.pdf'
print(file)
target_name = f"{file}"
print(target_name)
pdf_file = fitz.open(file)
# print ("number of pages: %i" % doc.pageCount)
# page1 = doc.load_page(0)
# page1text = page1.get_text("text")
# print(page1text)
for page_index in range(len(pdf_file)):
# get the page itself
page = pdf_file[page_index]
image_list = page.get_images()
# printing number of images found in this page
if image_list:
print(f"[+] Found a total of {len(image_list)} images in page {page_index}")
else:
print("[!] No images found on page", page_index)
for image_index, img in enumerate(page.get_images(), start=1):
# get the XREF of the image
xref = img[0]
# extract the image bytes
base_image = pdf_file.extract_image(xref)
image_bytes = base_image["image"]
# get the image extension
#image_ext = base_image["ext"]
# load it to PIL
image = Image.open(io.BytesIO(image_bytes))
# save it to local disk
image.save(f"{target_name}_{page_index+1}_{image_index}.jpeg")
Вы получите вывод, как показано ниже:
Этот код способен определить общее количество изображений, присутствующих на каждой странице файла PDF. Более того, он предназначен для сохранения каждого из этих изображений с их исходными именами файлов и соответствующим номером страницы, на которой они были обнаружены.
Каждый разработчик в своей жизни встречается с тем, что приходится конвертировать изображения PNG в изображение JPG. Приглагаем вам создать один такой скрипт, который преобразует изображения из одного формата файла (типа изображения) в другой - всего за 6 строк кода.
Не малую часть работы составляет также передача данных из одного сервиса в другой без потери качества. Задача тривиальна и требует решения. Нам поможет Python Flask: отправляем файлы и данные формы из одного сервиса в другой.