В этом блоге мы узнаем, как обрабатывать PDF-файлы в Python с помощью PyMuPDF, библиотеки, которая предоставляет интерфейс Pythonic для библиотеки MuPDF.

Библиотека MuPDF — это легкое высококачественное средство визуализации PDF, написанное на переносимом коде C. Он разработан, чтобы быть быстрым и эффективным с точки зрения использования памяти, что делает его хорошо подходящим для использования в приложениях, которым необходимо работать с большими PDF-файлами или обрабатывать большое количество PDF-файлов за короткий промежуток времени.

С помощью PyMuPDF мы можем открывать и читать PDF-файлы, извлекать текст и изображения, добавлять текст и изображения в PDF-файлы и выполнять различные другие операции с PDF-файлами. В дополнение к своей основной функциональности PyMuPDF также предоставляет несколько удобных функций, упрощающих работу с PDF-файлами в Python. Например, он включает поддержку закладок, аннотаций и заполнения форм, а также поддержку PDF-файлов, защищенных паролем.

Чтобы начать работу с PyMuPDF, вам необходимо установить библиотеку и ее зависимости. Это можно сделать с помощью pip:

pip install pymupdf

После установки PyMuPDF вы можете начать использовать его в своем коде Python.

Вот наиболее часто используемые примеры,

Открыть файл PDF

Чтобы открыть файл PDF с помощью PyMuPDF, вы можете использовать функцию open модуля fitz. Эта функция принимает путь к файлу PDF в качестве аргумента и возвращает объект Document, представляющий файл PDF.

Вот пример того, как открыть файл PDF с помощью PyMuPDF:

import fitz


# Open the PDF document
doc = fitz.open("document.pdf")

Это откроет файл document.pdf и вернет объект Document, представляющий файл. Затем вы можете использовать различные методы и свойства объекта Document для доступа и управления содержимым файла PDF.

Например, вы можете использовать свойство page_count объекта Document, чтобы получить количество страниц в файле PDF, и вы можете использовать оператор индексации (например, doc[i]), чтобы получить конкретную страницу из файла.

Вы также можете использовать свойство metadata объекта Document для получения метаданных о файле PDF, таких как заголовок, автор и тема.

Извлечь текст из PDF

Чтобы извлечь текст из файла PDF в список с помощью PyMuPDF, вы можете использовать метод get_text объекта Page и добавить извлеченный текст в список.

Вот пример того, как извлечь весь текст из файла PDF и сохранить его в виде списка:

import fitz


# Open the PDF document
doc = fitz.open("document.pdf")

# Create an empty list to store the text
text_list = []

# Iterate over all the pages in the document
for page in doc:
    # Extract the text from the page
    text = page.get_text()

    # Append the text to the list
    text_list.append(text)

# Print the list
print(text_list)

Это позволит извлечь весь текст из файла document.pdf и сохранить его в переменной text_list. Текст с каждой страницы будет сохранен как отдельный элемент в списке.

Вы также можете извлечь текст с определенной страницы, используя оператор индексирования (например, doc[i].get_text()), чтобы получить нужную страницу, а затем вызвать метод get_text на этой странице.

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

Добавить текст в файл PDF

Чтобы добавить текст в файл PDF с помощью PyMuPDF, вы можете использовать метод insert_text объекта Page. Этот метод принимает добавляемый текст, положение текста на странице и размер шрифта в качестве аргументов и добавляет текстовое поле с заданным текстом на страницу в указанной позиции.

Вот пример того, как добавить текстовое поле с текстом на первую страницу документа PDF:

import fitz


# Open the PDF document
doc = fitz.open("document.pdf")

# Get the first page
page = doc[0]

# Set the font size
font_size = 20

# Set the position of the textbox on the page
x = 50
y = 50

# Set the text to be added
text = "This is some text"

# Add the textbox to the page
page.insert_text((x, y), text, fontsize=font_size)

# Save the changes to the PDF
doc.save("modified_document.pdf")

Это добавит текстовое поле с текстом «Это какой-то текст» на первую страницу файла document.pdf в позиции (50, 50) с размером шрифта 20. Измененная страница будет сохранена в новый файл с именем modified_document.pdf.

При необходимости вы можете настроить положение, размер шрифта и другие параметры форматирования текстового поля. Вы также можете добавить текст на несколько страниц, повторив описанные выше шаги для каждой страницы.

Поворот страниц в документе PDF

Чтобы повернуть страницы в документе PDF с помощью PyMuPDF, вы можете использовать метод set_rotate объекта Page. Этот метод принимает угол в качестве аргумента и поворачивает страницу на этот угол. Вы можете использовать метод get_rotate, чтобы получить значение поворота текущей страницы.

Вот пример того, как повернуть все страницы в документе PDF на 90 градусов:

import fitz


# Open the PDF document
doc = fitz.open("document.pdf")

# Iterate over all the pages in the document
for page in doc:
    # Rotate the page by 90 degrees
    page.set_rotation(90)

# Save the changes to the PDF
doc.save("rotated_document.pdf")

Это повернет все страницы в файле document.pdf на 90 градусов и сохранит повернутые страницы в новый файл с именем rotated_document.pdf. Вы можете указать любой угол от 0 до 360 для поворота страниц.

Извлечение изображений из файла PDF

Чтобы извлечь изображения из файла PDF с помощью PyMuPDF, вы можете использовать метод get_pixmap объекта Page. Этот метод возвращает объект Pixmap, представляющий изображение. Затем вы можете сохранить это изображение в файл, используя метод save объекта Pixmap.

Вот пример того, как извлечь все изображения из файла PDF и сохранить их в файлы изображений:

import fitz

# Open the PDF document
doc = fitz.open("document.pdf")

# Iterate over all the pages in the document
for i in range(doc.page_count):
    # Get the current page
    page = doc[i]

    # Extract all the images on the page
    for img in page.get_images():
        # Get the image data
        pix = fitz.Pixmap(doc, img)

        # Save the image to a file
        pix.save("image{}.png".format(i))

        # Free the memory used by the Pixmap object
        pix = None

При этом все изображения будут извлечены из файла document.pdf и сохранены в виде файлов изображений с такими именами, как image0.png, image1.png и т. д. Изображения будут сохранены в том же формате, что и в файле PDF.

Объединить два PDF-файла

Чтобы объединить два PDF-файла с помощью метода insert_pdf PyMuPDF, вы можете использовать следующий код:

import fitz


# Open the first PDF document
doc1 = fitz.open('document1.pdf')

# Open the second PDF document
doc2 = fitz.open('document2.pdf')

# Insert the second document into the first document
doc1.insert_pdf(doc2)

# Save the merged PDF
doc1.save('merged.pdf')

Это создаст новый файл PDF с именем merged.pdf, содержащий страницы из document1.pdf и document2.pdf. Страницы из document2.pdf будут добавлены в конец document1.pdf.

Удалить страницу из PDF

Чтобы удалить страницу из PDF с помощью PyMuPDF, вы можете использовать метод delete_page объекта Document. Вот пример того, как удалить вторую страницу PDF:

import fitz


# Open the PDF document
doc = fitz.open('document.pdf')

# Delete the second page
doc.delete_page(1)

# Save the modified PDF
doc.save('modified.pdf')

Это создаст новый файл PDF с именем modified.pdf с удаленной второй страницей. Обратите внимание, что нумерация страниц начинается с нуля, поэтому для удаления второй страницы необходимо указать индекс 1.

Если вы хотите удалить сразу несколько страниц, вы можете передать список индексов страниц в метод delete_pages.

Как видите, PyMuPDF — это мощная и простая в использовании библиотека для работы с файлами PDF в Python. Если вам нужно извлечь текст и изображения из PDF-файлов или добавить и изменить содержимое в существующих PDF-файлах, PyMuPDF поможет вам.

Документация PyMuPDF — отличный ресурс, доступ к которому вы можете получить здесь. Если вы хотите увидеть больше примеров, вы можете изучить их здесь.