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