PyPDF2 – обработка PDF

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

PDF — один из самых популярных форматов для электронных документов. Однако манипуляции с ним, такие как объединение, разделение, шифрование или извлечение текста, требуют надёжных инструментов. В Python одной из самых популярных и устойчивых библиотек для работы с PDF является PyPDF2.

PyPDF2 позволяет разработчику читать, редактировать и создавать PDF-файлы, а также получать метаданные, управлять страницами, добавлять защиту и даже встраивать водяные знаки. Это мощный инструмент как для автоматизации документооборота, так и для интеграции с другими сервисами.

Основная часть

Установка

pip install PyPDF2

Чтение PDF

from PyPDF2 import PdfReader
reader = PdfReader("example.pdf")
print(len(reader.pages))
print(reader.pages[0].extract_text())

Извлечение текста со всех страниц

for page in reader.pages:
    print(page.extract_text())

Объединение файлов

from PyPDF2 import PdfMerger
merger = PdfMerger()
merger.append("file1.pdf")
merger.append("file2.pdf")
merger.write("merged.pdf")
merger.close()

Разделение страниц

from PyPDF2 import PdfWriter, PdfReader
reader = PdfReader("example.pdf")
writer = PdfWriter()

writer.add_page(reader.pages[0])
with open("page1.pdf", "wb") as f:
    writer.write(f)

Добавление водяного знака

reader = PdfReader("document.pdf")
watermark = PdfReader("watermark.pdf")
writer = PdfWriter()

for page in reader.pages:
    page.merge_page(watermark.pages[0])
    writer.add_page(page)

with open("watermarked.pdf", "wb") as f:
    writer.write(f)

Шифрование PDF

writer = PdfWriter()
reader = PdfReader("example.pdf")
for page in reader.pages:
    writer.add_page(page)

writer.encrypt("userpass", owner_pwd="adminpass", use_128bit=True)
with open("protected.pdf", "wb") as f:
    writer.write(f)

Извлечение метаданных

reader = PdfReader("example.pdf")
info = reader.metadata
print(info.author)
print(info.title)

Удаление страниц

reader = PdfReader("example.pdf")
writer = PdfWriter()

for i in range(len(reader.pages)):
    if i != 2:  # Удаляем третью страницу
        writer.add_page(reader.pages[i])

with open("no_third_page.pdf", "wb") as f:
    writer.write(f)

Работа с закладками и оглавлением

reader = PdfReader("example.pdf")
bookmarks = reader.outline
print(bookmarks)

Сравнение с другими библиотеками

Библиотека Чтение Запись Шифрование Водяные знаки Извлечение текста
PyPDF2 Да Да Да Да Частично
PyMuPDF Да Да Нет Да Да
PDFPlumber Да Нет Нет Нет Да (глубоко)

Лучшие практики

  • Используйте PdfMerger для объединения

  • Проверяйте корректность шифрования

  • Удаляйте временные файлы после обработки

  • Используйте extract_text() с fallback-функциями при плохом OCR


Примеры использования

  • Автоматизация документооборота

  • Обработка счетов и контрактов

  • Генерация отчетов с водяными знаками

  • Архивация PDF-документов с шифрованием

Полный список функций и методов библиотеки PyPDF2 для Python, сгруппированных по категориям


Работа с PDF-файлами

Функция Описание
PdfReader(file) Загружает PDF-файл для чтения. Можно передать путь или файл-объект.
PdfWriter() Создаёт новый объект для записи PDF.
reader.pages Список всех страниц PDF-файла.
reader.metadata Возвращает метаданные (автор, тема, заголовок и т.д.).
reader.get_page(n) Получает страницу по индексу (устаревший метод, предпочтительнее reader.pages[n]).
writer.write(stream) Сохраняет PDF в поток (файл, BytesIO и т.д.).

Извлечение текста и информации

Функция Описание
page.extract_text() Извлекает текст с указанной страницы.
page.mediabox Размеры страницы (границы, ширина, высота).
page.rotation Угол поворота страницы (0, 90, 180, 270).
reader.is_encrypted Проверяет, зашифрован ли файл.
reader.decrypt(password) Пытается расшифровать файл. Возвращает 0, 1 или 2 в зависимости от успеха.

Манипуляции со страницами

Функция Описание
writer.add_page(page) Добавляет одну страницу в итоговый документ.
writer.add_blank_page(width, height) Создаёт пустую страницу заданного размера.
writer.insert_page(page, index) Вставляет страницу в указанное место.
writer.remove_links() Удаляет гиперссылки со всех страниц (требуется ручная реализация).
writer.merge_page(page) Накладывает одну страницу на другую (используется для водяных знаков).

Объединение и разделение PDF

Функция Описание
PdfMerger() Класс для объединения нескольких PDF-файлов.
merger.append(file) Добавляет PDF-файл в конец.
merger.merge(position, file) Вставляет файл в заданную позицию.
merger.write(filename) Сохраняет объединённый PDF в файл.
merger.close() Закрывает объект и освобождает ресурсы.
merger.pages Возвращает список всех страниц объединённого файла.

Метаданные и защита

Функция Описание
writer.add_metadata({...}) Добавляет или изменяет метаданные документа.
writer.encrypt(user_pwd, owner_pwd=None, ...) Шифрует файл, задавая пароли пользователя и владельца.
writer.set_page_layout(layout) Устанавливает отображение страниц (например, SinglePage, TwoColumnLeft).
writer.set_page_mode(mode) Устанавливает режим открытия PDF (outline, fullscreen и др.).

Пример простого копирования PDF

python
from PyPDF2 import PdfReader, PdfWriter reader = PdfReader("input.pdf") writer = PdfWriter() for page in reader.pages: writer.add_page(page) with open("output.pdf", "wb") as f: writer.write(f)

Заключение

PyPDF2 — мощный инструмент для работы с PDF в Python. Несмотря на ограниченную поддержку некоторых функций (например, слабое извлечение текста из отсканированных PDF), библиотека успешно справляется с большинством задач по обработке, защите и генерации PDF-документов. Она отлично подходит для автоматизации рутинных процессов и интеграции с другими Python-решениями.