Обзор PyPDF2: возможности, ограничения и переход на pypdf
PyPDF2 — не программа для чтения PDF с окнами, панелями и кнопками, а Python-библиотека, которую встраивали в скрипты, серверные приложения и конвейеры обработки документов. Это различие особенно важно сегодня: последняя версия PyPDF2 3.0.1 вышла 31 декабря 2022 года, после чего проект был официально продолжен под именем pypdf. Поэтому PyPDF2 имеет смысл рассматривать как совместимый слой для старого кода и воспроизводимых окружений, а не как библиотеку, с которой разумно начинать новый проект в 2026 году.
| Параметр | PyPDF2 |
|---|---|
| Тип | Библиотека Python для чтения, анализа и изменения PDF |
| Последняя версия | 3.0.1, опубликована 31 декабря 2022 года |
| Текущий статус | Снят с активной разработки; официальный преемник — pypdf |
| Разработчики | Проект, выросший из pyPdf; в разные периоды поддерживался Phaseit и сообществом py-pdf |
| Платформы | ОС-независимый пакет Python; wheel версии 3.0.1 имеет тег py3-none-any |
| Требование версии Python | Python 3.6 и новее для ветки PyPDF2 2.x–3.x |
| Основной формат | PDF на чтение и запись; не является офисным конвертером или OCR-системой |
| Интерфейс | Python API: PdfReader, PdfWriter, PageObject, Transformation и связанные классы |
| Лицензия | BSD 3-Clause |
| Цена и учётная запись | Бесплатно, открытый исходный код; регистрация и подписка не требуются |
Скачать PyPDF2
Новейшая версия для Виндовс, macOS и Линукс. Удобный редактор PDF под российские реалии.
Актуальный для самого PyPDF2 дистрибутив — версия 3.0.1 на Python Package Index. На PyPI сохранены исходный архив PyPDF2-3.0.1.tar.gz и универсальный wheel pypdf2-3.0.1-py3-none-any.whl. Для воспроизведения старого проекта безопаснее брать пакет из официального индекса и фиксировать точную версию в отдельном виртуальном окружении, а не скачивать случайные архивы, бинарники или форки с сайтов-агрегаторов.
Команда установки исторически выглядит как python -m pip install PyPDF2. Для проекта, где важна повторяемость, лучше указывать python -m pip install PyPDF2==3.0.1. Такой способ не делает библиотеку современной: он лишь гарантирует, что в окружение попадёт последняя опубликованная версия именно старого пакета. Официальная документация PyPDF2 прямо помечает проект как deprecated и рекомендует pypdf.
Для нового кода правильный путь получения другой: создать изолированное окружение и установить pypdf. На 12 сентября 2026 года ветка pypdf продолжает развиваться, тогда как PyPDF2 обновлений не получает. Это важно не только для новых функций, но и для исправлений совместимости, безопасности и работы с проблемными PDF.
Что такое PyPDF2
PyPDF2 — свободная pure-Python библиотека для программной работы с PDF. Она умеет читать структуру документа, получать страницы и метаданные, извлекать текст, объединять и разделять страницы, обрезать и трансформировать их, добавлять данные и параметры просмотра, читать и записывать формы и аннотации, а также применять парольную защиту. Работа идёт внутри Python-процесса: собственного графического окна, файлового менеджера, визуального редактора страниц и режима «открыть документ и читать» у библиотеки нет.
История названия часто вызывает путаницу. В 2005 году появился pyPdf. В конце 2011 года возник PyPDF2 как форк, ориентированный на более широкий набор встречающихся на практике PDF. Позднее существовали отдельные PyPDF3 и PyPDF4, но они не являются «новыми редакциями» PyPDF2. В 2022 году активная разработка PyPDF2 возобновилась, а в конце того же года проект был перенесён обратно в pypdf — теперь в нижнем регистре и без цифры. Именно pypdf является прямым официальным продолжением.
Ещё одна важная граница — OCR. PyPDF2 извлекает уже существующий текстовый слой PDF. Если страница представляет собой только изображение скана, библиотека не распознает символы. Для такой задачи нужен OCR-инструмент; на сайте можно отдельно посмотреть обзор ABBYY FineReader. Если же скан ранее прошёл OCR и невидимый текстовый слой уже записан в PDF, PyPDF2 может попытаться извлечь именно этот слой.
Основные функции PyPDF2
Чтение структуры PDF, текста и метаданных
Базовый объект PdfReader принимает путь, файловый объект или другой поток с методами чтения и позиционирования. Через reader.pages код получает последовательность страниц; метаданные документа доступны отдельно. При инициализации считываются таблицы перекрёстных ссылок, поэтому открытие сложного PDF само по себе может занимать заметное время.
Метод PageObject.extract_text() извлекает текстовые операторы из потока содержимого. Можно ограничивать ориентацию текста и подключать visitor-функции, которые вызываются для текстовых фрагментов и операторов. Это позволяет, например, отбрасывать колонтитулы по координатам. Однако PDF хранит текст прежде всего как инструкции отрисовки, а не как логическую структуру документа, поэтому порядок абзацев, таблицы, формулы, сноски и многоколоночная вёрстка могут восстанавливаться неоднозначно.
Объединение, вставка и разбиение страниц
PdfWriter может получать страницы из одного или нескольких PdfReader и записывать новый PDF. Методы append и merge позволяют присоединять целый документ или выбранный диапазон, а add_page и insert_page — работать точечно. Для практического разбиения достаточно прочитать исходный PDF, создать новый writer для нужного набора страниц и записать результат в отдельный файл.
Обрезка, масштабирование, поворот и трансформации
PageObject предоставляет геометрические поля mediabox, cropbox, trimbox, bleedbox и artbox, а также операции вращения, масштабирования и применения матриц трансформации. Это не визуальное редактирование мышью: координаты и параметры задаются из кода. Такой подход хорошо подходит для повторяемой пакетной обработки, но требует понимания системы координат PDF и различий между физическим размером страницы и областью отображения.
Обрезка в PDF часто означает изменение границ видимой области, а не физическое удаление всех объектов за её пределами. Поэтому после такой операции файл следует проверить в независимом просмотрщике, особенно если документ передаётся наружу и скрытое содержимое имеет значение.
Штампы, водяные знаки и наложение содержимого
PyPDF2 реализует типичный сценарий штампа или водяного знака через объединение содержимого страниц. Для штампа дополнительная страница накладывается поверх исходной, для водяного знака — используется как фоновый слой. Практически это означает, что подготовленный PDF со штампом выступает источником графики и текста, а PyPDF2 отвечает за совмещение потоков содержимого.
Аннотации, вложения и формы
В ветке 3.x можно читать аннотации PDF, обходя массив /Annots страницы, и создавать ряд аннотаций через AnnotationBuilder. Документация демонстрирует свободный текст, текстовую заметку, линию и другие типы. PdfWriter также умеет прикреплять произвольные файлы как вложения к PDF.
Для форм PdfReader предоставляет получение текстовых полей, а PdfWriter — обновление значений полей на странице. Это полезно для серверного заполнения шаблонных форм. Но PDF-формы бывают существенно сложнее простого набора AcroForm-полей, поэтому результат обязательно нужно открывать в целевом просмотрщике и проверять, действительно ли значения видны и сохранились так, как ожидает получатель.
Пароли и шифрование
PyPDF2 умеет зашифровать выходной PDF и открыть защищённый документ при наличии правильного пароля. В базовой установке поддерживается RC4, а для работы с AES документация требует дополнительную crypto-зависимость. Это принципиальный момент при развёртывании: код, который успешно работает с обычным PDF, может не обработать AES-файл в минимальной установке.
Извлечение изображений и работа с ресурсами
Через свойство PageObject.images можно получать изображения страницы. Для этого требуется Pillow, то есть extra image. В документации PyPDF2 3.x отдельно оговорено, что inline images на тот момент не входили в этот механизм. Поэтому нельзя обещать, что вызов images извлечёт абсолютно всю графику из любого PDF.
Уменьшение размера
Документация описывает несколько подходов: повторная запись документа может устранить часть дублирования, можно удалить изображения, а content streams страниц можно сжать с помощью FlateDecode. При этом compress_content_streams отмечен как CPU-intensive. Результат зависит от структуры исходного файла, поэтому любые проценты экономии из отдельных примеров документации нельзя переносить на произвольные документы.
Потоки, BytesIO и серверные сценарии
Reader и Writer не ограничены локальными путями. PyPDF2 может читать и записывать file-like объекты, включая BytesIO. Это позволяет встроить библиотеку в веб-приложение, очередь задач или сервис, где PDF приходит как набор байтов и результат сразу отправляется дальше без промежуточного пользовательского интерфейса.
Интерфейс и удобство использования
У PyPDF2 нет графического интерфейса. Его «рабочие зоны» — это объекты API. PdfReader отвечает за чтение и доступ к структуре, PdfWriter собирает и записывает результат, PageObject представляет страницу, Transformation описывает геометрические преобразования, а generic-объекты дают доступ к более низкому уровню PDF. Такой интерфейс естественен для разработчика, но неудобен пользователю, который ожидает открыть файл, увидеть миниатюры страниц и нажать «Объединить».
Нужно учитывать и смену API между поколениями. В ветке 2.x старые имена PdfFileReader, PdfFileWriter и PdfFileMerger были заменены на PdfReader, PdfWriter и PdfMerger; множество методов перевели на PEP 8-совместимые имена. Код из старых статей и ответов на форумах поэтому может содержать устаревшие вызовы. Для PyPDF2 3.0.1 ориентироваться следует на документацию 3.x, а при модернизации — уже на pypdf.
Отсутствие GUI одновременно является преимуществом. Операции легко повторять для тысяч файлов, параметры можно хранить в конфигурации, а результат — проверять автоматически. Там, где сотруднику нужна ручная работа с одной-двумя страницами, визуальный инструмент обычно быстрее; например, PDFsam Basic решает типичные задачи объединения и разделения без написания Python-кода.
Поддерживаемые форматы и совместимость
Основной и фактически профильный формат PyPDF2 — PDF. Библиотека читает PDF, создаёт новые PDF на основе страниц и объектов, записывает изменения обратно в PDF. Она не заявлена как конвертер DOCX, XLSX, PPTX, EPUB или изображений в редактируемые офисные документы. Отдельные изображения можно извлекать из PDF при наличии Pillow, но это не делает PyPDF2 универсальным медиаконвертером.
Совместимость с версиями PDF не следует описывать как «полная». В документации 3.x перечислены версии PDF вплоть до 2.0 и прямо сказано, что некоторые операции могут работать с PDF 2.0 без поддержки всех его возможностей. В таблице функций CMaps и AES помечены как поддерживаемые, а для ряда возможностей — object streams, cross-reference streams, optional content groups и некоторых других — документация не даёт такой же однозначной отметки. Для архивных, инженерных и сложных издательских файлов это существенное ограничение.
Текстовая совместимость зависит не только от версии PDF, но и от шрифтов, CMap, ToUnicode и способа генерации документа. В 2022 году в PyPDF2 было заметно улучшено извлечение текста для не-ASCII алфавитов, включая русский, китайский, японский, корейский и арабский. Это не отменяет фундаментального ограничения: библиотека читает структуру PDF, а не восстанавливает логическую разметку исходного документа.
Если задача заключается именно в визуальном чтении PDF на рабочем столе, PyPDF2 нельзя считать прямым конкурентом Sumatra PDF. Sumatra PDF — Windows-просмотрщик с окнами, навигацией, поиском и поддержкой разных форматов документов, тогда как PyPDF2 — программный компонент. Для сравнения с традиционными просмотрщиками уместнее также смотреть Adobe Acrobat Reader или Foxit Reader.
Производительность и стабильность
PyPDF2 — pure-Python решение, поэтому его сильная сторона не в нативном рендеринге, а в переносимом программном доступе к структуре PDF. PdfReader при открытии читает таблицы перекрёстных ссылок; документация предупреждает, что это может занять время. Для больших и внутренне сложных файлов потребление памяти и длительность операции определяются не только размером файла на диске, но и количеством объектов, потоков, страниц и связей между ними.
Режим strict=False выбран по умолчанию, чтобы библиотека могла терпимо относиться к PDF, которые не идеально следуют спецификации. В этом режиме PyPDF2 пытается продолжить работу и пишет предупреждения. При strict=True несоответствия могут приводить к исключениям. Для пакетного конвейера это полезная развилка: строгий режим удобен для контроля качества входа, нестрогий — для best-effort обработки разнородного архива.
Извлечение текста остаётся одной из наиболее чувствительных операций. Даже корректный PDF может не содержать информации о том, где заканчивается абзац, какая колонка идёт первой или как устроена таблица. В сложных документах координаты visitor-функций тоже могут оказаться неточными. Поэтому текстовый результат нужно оценивать по типу документа, а не считать буквальной реконструкцией его визуальной структуры.
Главный фактор стабильности в 2026 году уже организационный: PyPDF2 не получает исправлений. Если встречается новый проблемный файл, несовместимость с современной версией Python или дефект в шифровании, решение в старом пакете не появится. Для эксплуатации нового сервиса это весомее, чем историческая зрелость API.
Лицензирование и версии
PyPDF2 распространяется бесплатно с открытым исходным кодом по BSD 3-Clause. Эта разрешительная лицензия допускает использование и модификацию при соблюдении условий лицензии. У продукта нет платной редакции, пробного срока, тарифа по страницам, обязательной регистрации или встроенной подписки. Расходы возникают на стороне проекта: разработка, тестирование, сопровождение окружения и, при необходимости, инфраструктура.
Версия 3.0.1 на PyPI — последняя опубликованная версия пакета PyPDF2. Метаданные PyPI указывают Python 3.6+ и статус OS Independent. Наличие на PyPI классификатора Production/Stable не означает, что проект сейчас поддерживается: более поздняя официальная документация прямо сообщает о прекращении обновлений PyPDF2 и переходе на pypdf.
pypdf не является другой коммерческой редакцией PyPDF2. Это продолжение того же семейства с изменённым именем пакета и импорта. В changelog перехода указано, что pypdf 3.1.0 отличался от PyPDF2 3.0.0 прежде всего названием пакета; дальнейшие выпуски pypdf уже получали новые функции и исправления. На 12 сентября 2026 года на PyPI доступен pypdf 6.18.1, требующий Python 3.9 или новее.
Системные требования
Python и операционная система
Для PyPDF2 2.0 и новее, включая 3.0.1, официальная документация указывает Python 3.6+. PyPI классифицирует пакет как OS Independent, а wheel 3.0.1 имеет тег py3-none-any. Практически это означает, что сама библиотека не требует отдельной сборки под Windows, macOS или Linux, если на системе есть совместимый интерпретатор Python.
Дополнительные зависимости
Минимальная установка рассчитана на базовую работу с PDF. Для AES-шифрования и расшифрования документация предлагает PyPDF2[crypto], для извлечения изображений — PyPDF2[image] с Pillow, а PyPDF2[full] устанавливает все заявленные дополнительные зависимости. Эти варианты нужно фиксировать в окружении так же явно, как сам PyPDF2.
Отдельной видеокарты, браузера, Java Runtime или фонового сервиса для ядра PyPDF2 не заявлено. Свободное место и память определяются Python-окружением, зависимостями и документами, которые обрабатывает приложение. Формальных минимальных значений RAM и диска в документации PyPDF2 3.x нет, поэтому указывать их в виде вымышленных цифр некорректно.
Хронология развития и поддержки
2005–2010. Mathieu Fenniak развивал pyPdf как инструментарий для разбиения, объединения, анализа страниц, обрезки и шифрования PDF. Последним выпуском исходной ветки на PyPI стал pyPdf 1.13 в 2010 году.
2011–2016. При поддержке Phaseit появился PyPDF2 — форк pyPdf, который стремился лучше разбирать встречающиеся «в природе» PDF, отклоняющиеся от спецификации. В этот период закрепилось имя, под которым библиотека стала массово известна.
2018–2022. Отдельно существовали PyPDF3 и PyPDF4. Они не заменили PyPDF2 и не должны рассматриваться как последовательные официальные поколения одного продукта.
2022. Martin Thoma и другие участники сообщества возобновили активную поддержку PyPDF2. Ветку быстро модернизировали: появился новый PEP 8-совместимый API, типизация, улучшения извлечения текста, шифрования, производительности и устойчивости к нестандартным PDF.
Конец 2022 года и далее. Проект вернулся к имени pypdf. PyPDF2 3.0.1 стал финальным выпуском старого package name, а дальнейшая разработка перешла в pypdf. Поэтому вопрос «какая новая версия PyPDF2 вышла после 3.0.1» поставлен неверно: новые версии выходят уже как pypdf.
Карта критических зависимостей
| Зависимость | Когда нужна | Что произойдёт без неё | Как снизить риск |
|---|---|---|---|
| Совместимый Python | Всегда | Пакет не установится или код окажется вне проверенного диапазона | Зафиксировать версию Python в окружении |
| pip или другой менеджер пакетов | При установке и удалении | Усложняется воспроизводимое развёртывание | Использовать отдельный venv и requirements |
| PyPDF2 3.0.1 | Только для legacy-кода | Импорт PyPDF2 отсутствует | Пиновать точную версию, не рассчитывать на обновления |
| crypto-extra | AES | Часть зашифрованных PDF не обработается | Установить PyPDF2[crypto] и протестировать реальные файлы |
| Pillow | Извлечение изображений | PageObject.images не сможет выполнить требуемую декодировку | Установить PyPDF2[image] |
| OCR-движок | Сканы без текстового слоя | Текст из изображения не появится | Добавить отдельный OCR-этап до извлечения текста |
| Сетевой SDK | S3 и иные удалённые хранилища | PyPDF2 сам не подключится к облаку | Разделить хранение и PDF-обработку на разные компоненты |
Преимущества и недостатки PyPDF2
Плюсы и минусы
• Простой Python API для типовых операций с PDF без запуска внешней настольной программы.
• Pure-Python архитектура и универсальный wheel, не привязанный к одной ОС.
• Чтение и запись страниц, объединение, вставка, обрезка, поворот и трансформации.
• Извлечение текста и метаданных без рендеринга страницы в изображение.
• Поддержка форм, аннотаций, вложений, штампов и ряда параметров PDF.
• Работа с file-like объектами и BytesIO удобна для серверных и бездисковых конвейеров.
• Разрешительная BSD 3-Clause лицензия и отсутствие платной редакции.
• Существующий legacy-код можно воспроизводить, зафиксировав PyPDF2 3.0.1 и окружение.
Минусы
• Проект прекращён: исправления и новые возможности выходят только в pypdf.
• Нет графического интерфейса, поэтому библиотека не подходит как обычный PDF-просмотрщик.
• Нет OCR; страницы-сканы без текстового слоя не распознаются.
• Извлечение текста не восстанавливает гарантированно таблицы, колонки и логическую структуру.
• Поддержка всех возможностей PDF 2.0 не заявлена, а для ряда функций документация 3.x оставляет статус неопределённым.
• AES и извлечение изображений требуют дополнительных зависимостей.
• Результат сложных операций с формами, аннотациями и геометрией нужно проверять в независимом просмотрщике.
• Для нового проекта зависимость от неподдерживаемого пакета создаёт долгосрочный риск сопровождения.
Сравнение с аналогами
| Инструмент | Тип и статус | Сильная сторона | Интерфейс | Когда выбирать |
|---|---|---|---|---|
| PyPDF2 3.0.1 | Архивная Python-библиотека | Совместимость с существующим кодом PyPDF2 | Python API | Поддержка legacy-проекта с зафиксированным окружением |
| pypdf | Активно развиваемый официальный преемник | Тот же класс задач с современными исправлениями и развитием | Python API | Новый Python-проект, которому нужны структурные операции с PDF |
| pikepdf | Активная Python-библиотека поверх qpdf | Низкоуровневая работа, создание, манипуляция и ремонт PDF, линейризация | Python API с нативной зависимостью qpdf | Нужен более тесный доступ к объектной модели и возможностям qpdf |
| PyMuPDF | Активная библиотека на базе MuPDF | Рендеринг страниц, извлечение текста и изображений, работа с несколькими форматами | Python API | Нужен быстрый рендеринг, визуальная геометрия или широкая работа со страницей |
| Sumatra PDF | Активный Windows-просмотрщик | Чтение и навигация по документам в GUI | Настольное приложение и командные инструменты | Человеку нужно открывать и читать файлы, а не встраивать PDF API в Python |
Главная альтернатива PyPDF2 — pypdf, потому что это прямой преемник, а не независимый конкурент. Для миграции с PyPDF2 3.0.x концепция Reader/Writer остаётся знакомой, но новый код следует сверять с текущей документацией pypdf, а не механически копировать примеры 2022 года.
pikepdf уместен, когда важны возможности qpdf, ремонт и более непосредственная работа с внутренними PDF-объектами. PyMuPDF сильнее там, где PDF нужно не только структурно изменить, но и отрендерить, измерить или обработать как визуальный документ. У PyMuPDF при этом другая модель лицензирования: открытая версия распространяется под GNU AGPLv3, для проприетарных приложений предлагается коммерческая лицензия; этот фактор нужно учитывать до выбора библиотеки.
С Sumatra PDF сравнение корректно только по задаче. PyPDF2 автоматизирует PDF внутри кода; Sumatra PDF помогает пользователю читать документы и работает только в Windows. Если нужен ручной редактор, а не API, имеет смысл смотреть в сторону PDF-XChange Editor. Это принципиально другой класс продукта, поэтому сравнивать их по числу кнопок или «удобству интерфейса» бессмысленно.
Инструкция по установке
Установка PyPDF2 3.0.1 для старого проекта
1. Убедитесь, что проект действительно импортирует PyPDF2 и не рассчитан уже на pypdf. Проверьте requirements-файл, lock-файл и исходный код.
2. Создайте отдельное виртуальное окружение командой python -m venv .venv. Оно изолирует зависимости проекта от системного Python.
3. Активируйте окружение подходящим для вашей оболочки способом либо вызывайте Python из каталога окружения напрямую.
4. Установите фиксированную версию: python -m pip install PyPDF2==3.0.1. Если проект работает с AES, используйте соответствующий extra; если извлекает изображения — image или full.
5. Проверьте импорт командой python -c «import PyPDF2; print(PyPDF2.__version__)». Ожидаемый результат для зафиксированного окружения — 3.0.1.
6. Запустите тесты проекта на реальных PDF, включая зашифрованные, формы и нестандартные документы, если они входят в рабочий поток.
7. Сохраните точную конфигурацию зависимостей. Это особенно важно, потому что PyPDF2 больше не будет выпускать исправления под изменившуюся среду.
Первый запуск API
Отдельного приложения после установки не появляется. Практический «первый запуск» — успешный импорт модулей и чтение тестового PDF. Минимальная проверка состоит из создания PdfReader для известного корректного файла, получения len(reader.pages) и сравнения числа страниц с ожидаемым. После этого можно отдельно проверить запись копии через PdfWriter.
Для нового проекта вместо PyPDF2
Создайте отдельный venv и устанавливайте pypdf, а не PyPDF2. На дату подготовки обзора текущий pypdf требует Python 3.9+. Импорт в новом коде выглядит как from pypdf import PdfReader, PdfWriter. При переносе старого приложения сначала добейтесь прохождения тестов после изменения импорта, затем обновляйте остальной код по актуальному migration guide.
Безопасное удаление
Если PyPDF2 установлен через pip, стандартная команда удаления — python -m pip uninstall PyPDF2; на Windows также допустим вызов через py -m pip. Перед удалением проверьте, не зависит ли от пакета другое приложение в том же окружении. В изолированном venv безопаснее удалить всё окружение целиком и пересоздать его по зафиксированному requirements, чем вручную чистить каталоги site-packages.
Контроль перед сохранением и передачей
• Записывайте результат в новый файл, пока исходник не прошёл проверку.
• Сверяйте число и порядок страниц до и после операции.
• Проверяйте открытие результата минимум в одном независимом PDF-просмотрщике.
• Для форм убедитесь, что значения действительно видны, а не только присутствуют в объектной структуре.
• Для защищённых файлов проверяйте открытие пользовательским паролем и ожидаемые разрешения.
• После обрезки или наложения просматривайте проблемные страницы при большом масштабе.
• При извлечении текста отдельно контролируйте таблицы, колонки, переносы и символы вне ASCII.
• Не заменяйте оригинал до завершения автоматической и визуальной проверки.
Практические кейсы
Объединение нескольких PDF в заданном порядке
Цель. Собрать договор, приложение и акт в один файл без ручного открытия редактора.
Подготовка. Убедитесь, что все входные документы открываются и не требуют неизвестных паролей. Заранее задайте порядок файлов списком, а выходной путь сделайте отличным от исходных.
1. Создайте PdfWriter.
2. Для каждого входного PDF вызовите append либо прочитайте его через PdfReader и добавьте нужные страницы.
3. Запишите writer в новый файл.
4. Откройте результат в независимом просмотрщике и проверьте число страниц, порядок разделов и переходы по закладкам, если они были важны.
Ограничение. Связанные объекты, формы и навигационные структуры могут вести себя сложнее, чем обычные страницы. Для юридически значимого пакета недостаточно проверить только количество страниц.
Выделение диапазона страниц в отдельный документ
Цель. Отдать подрядчику только техническое приложение из большого PDF.
Подготовка. Определите диапазон по индексам, учитывая, что Python обычно считает с нуля. Сначала сопоставьте индекс и визуальный номер страницы, особенно если в документе есть титульные листы или римская нумерация.
1. Откройте исходник через PdfReader.
2. Создайте PdfWriter и добавьте только нужные reader.pages.
3. Запишите новый файл.
4. Проверьте первую и последнюю страницу результата и отсутствие лишних разделов.
Ограничение. Простое выделение страниц не является гарантированной санитарной очисткой чувствительных данных: вложения, метаданные и другие связанные объекты нужно проверять отдельно.
Извлечение текста из цифрового PDF
Цель. Получить текст для полнотекстового поиска, предварительной классификации или проверки наличия ключевых фраз.
Подготовка. Сначала убедитесь, что текст в документе вообще выделяется в просмотрщике. Если страница — только изображение, добавьте OCR-этап до PyPDF2.
1. Откройте документ через PdfReader.
2. Для каждой страницы вызовите extract_text().
3. Храните границы страниц явно, чтобы позже можно было сопоставить найденный фрагмент с исходником.
4. Проверьте несколько страниц с таблицами, колонками, кириллицей и специальными символами.
Ограничение. Результат не является DOCX или семантическим HTML. Порядок элементов может отличаться от визуального чтения, а таблицы часто требуют отдельного парсера.
Заполнение простой PDF-формы
Цель. Подставить значения в заранее подготовленные поля формы на сервере.
Подготовка. Считайте названия полей через get_form_text_fields() и сохраните их как часть шаблона. Не ориентируйтесь только на подписи, которые видны пользователю.
1. Прочитайте шаблон через PdfReader.
2. Добавьте нужную страницу в PdfWriter.
3. Передайте словарь полей в update_page_form_field_values для соответствующей страницы writer.
4. Запишите файл и откройте его в целевом PDF-просмотрщике.
Ограничение. Сложные формы, XFA и нестандартная логика могут не укладываться в этот простой сценарий. Видимое отображение полей необходимо проверять, а не предполагать.
Защита выходного документа паролем
Цель. Сформировать копию PDF, которая открывается по паролю.
Подготовка. Определите, какой режим шифрования нужен получателю. Для AES установите crypto-extra до запуска обработки.
1. Прочитайте исходный документ.
2. Скопируйте его страницы в PdfWriter.
3. Вызовите encrypt() с пользовательским паролем и при необходимости владельческим паролем и флагами разрешений.
4. Запишите файл под новым именем.
5. Проверьте открытие правильным паролем и отказ при неправильном.
Ограничение. PDF-разрешения на печать или копирование не заменяют серверные права доступа, шифрование диска и контроль распространения файла.
Навигатор по сбоям
| Симптом | Что проверить | Вероятная причина | Безопасное действие |
|---|---|---|---|
| ImportError или ModuleNotFoundError | Какой Python выполняет скрипт и где установлен пакет | PyPDF2 установлен в другое окружение | Запускать python -m pip из того же интерпретатора, которым выполняется код |
| AES-файл не открывается | Есть ли crypto-extra и верен ли пароль | Нет дополнительной криптографической зависимости или неподдерживаемый случай | Установить PyPDF2[crypto], затем повторить на копии |
| Скан даёт пустой текст | Выделяется ли текст в просмотрщике | В PDF нет текстового слоя | Пропустить файл через OCR и только затем извлекать текст |
| Текст перемешан | Колонки, таблицы, сложная геометрия | PDF не хранит логический порядок чтения | Применить специализированный экстрактор или правила по координатам |
| Файл открывается с предупреждением | Режим strict и журнал сообщений | PDF отклоняется от спецификации | Сравнить strict=False и strict=True, сохранить исходник и проверить результат |
| Выход неожиданно большой | Что клонируется вместе со страницами | Перенесены связанные объекты или дубли | Проанализировать структуру, исключить ненужные поля, не удаляя оригинал |
| После обновления Python код сломался | Версию интерпретатора и пакет | PyPDF2 больше не тестируется на новых средах | Воспроизвести старый venv или мигрировать на pypdf |
Паспорт обратимости операций
| Операция | Что сохраняется | Что может измениться | Как обеспечить обратимость |
|---|---|---|---|
| Объединение | Исходные файлы, если writer пишет в новый путь | Порядок страниц и часть навигационной структуры результата | Не перезаписывать входы; хранить список порядка |
| Разбиение | Оригинал | Контекст документа, закладки и связанные объекты в отдельных частях | Сохранять исходный PDF и карту диапазонов |
| Обрезка | Объекты страницы могут физически остаться в PDF | Видимая область страницы | Сохранять исходник; не считать crop средством удаления секретных данных |
| Наложение штампа | Исходный контент страницы | Поток содержимого и визуальный слой | Писать новый файл и хранить исходный штамп отдельно |
| Заполнение формы | Шаблон при записи в новый файл | Значения полей и их визуальное представление | Хранить исходный шаблон и словарь данных |
| Шифрование | Содержимое при корректной записи | Доступ без пароля и набор разрешений | Не удалять незашифрованный мастер-файл до проверки доступа |
| Извлечение текста | PDF не меняется | Только внешний текстовый результат | Хранить номер страницы и координаты, если они используются |
Часто задаваемые вопросы
PyPDF2 и pypdf — это две параллельно поддерживаемые библиотеки?
Нет. PyPDF2 прекращён, а pypdf является официальным продолжением проекта. Для нового кода нужно выбирать pypdf.
Можно ли установить PyPDF2 3.0.1 сегодня?
Да, пакет и файлы версии 3.0.1 остаются на PyPI. Но доступность архива не означает активную поддержку. Для legacy-проекта версию лучше жёстко фиксировать.
Нужен ли интернет для обработки PDF?
Нет, если файлы и зависимости уже находятся локально. PyPDF2 работает внутри Python-процесса. Интернет понадобится только вашему приложению, если оно получает документы из сети, обращается к облачному хранилищу или устанавливает пакеты из индекса.
Может ли PyPDF2 распознать отсканированный договор?
Нет, если в PDF есть только изображения страниц. Сначала нужен OCR. Если текстовый слой уже создан другим OCR-инструментом, PyPDF2 может извлечь его как обычный PDF-текст.
Конвертирует ли PyPDF2 PDF в Word?
Нет. Он может извлечь текст и манипулировать PDF-объектами, но не восстанавливает DOCX с исходными стилями, таблицами и макетом.
Поддерживает ли PyPDF2 цифровые подписи?
PyPDF2 3.x не позиционируется как библиотека для полноценного создания криптографических PDF-подписей. В официальной таблице поддержки для этой задачи отдельно упоминается специализированный pyHanko. Не следует путать парольное шифрование с цифровой подписью.
Почему после установки нет ярлыка PyPDF2?
Потому что это библиотека Python, а не настольное приложение. Её вызывают из кода. Если нужен просмотр PDF двойным щелчком, выбирайте Sumatra PDF или другой GUI-просмотрщик.
Можно ли продолжать PyPDF2 на Python 2.7?
Не с веткой 2.x–3.x. Python 2.7 поддерживали более старые поколения PyPDF2. Для современного проекта такой стек не следует считать актуальным.
Что важнее при миграции: переименовать импорт или обновить весь код?
Для перехода с PyPDF2 3.0.x на ранний pypdf изменение имени пакета было основным шагом, но к 2026 году pypdf ушёл далеко вперёд. Поэтому практическая миграция должна включать тесты, проверку deprecation-изменений и актуальной версии Python, а не только замену строки импорта.
Как визуально проверить результат автоматической обработки?
Используйте независимый просмотрщик. Для ручной инспекции страниц подойдёт Sumatra PDF; если нужна полноценная правка содержимого, потребуется редактор класса Adobe Acrobat Pro или другой аналогичный инструмент.
Вывод
PyPDF2 3.0.1 остаётся полезным объектом сопровождения: он понятен, переносим, умеет выполнять широкий набор структурных операций с PDF и часто встречается в существующем Python-коде. Если нужно воспроизвести старое приложение, разумная стратегия — отдельный venv, жёстко зафиксированная версия 3.0.1, полный набор тестовых PDF и запись результатов в новые файлы.
Для нового проекта PyPDF2 выбирать не стоит. Официальный путь развития — pypdf, который получает актуальные исправления и работает с современным стеком Python. pikepdf лучше рассматривать для задач, где важны возможности qpdf и более низкоуровневая модель PDF, PyMuPDF — когда нужен рендеринг и визуальная работа со страницей, а Sumatra PDF — когда конечному пользователю прежде всего требуется быстро открыть и прочитать документ.