Python: уроки, справочник и задачи

PyPDF2: работа с PDF-файлами в Python

Раздел: Работа с файлами в Python · Обновлено 31.10.2026

PyPDF2 - библиотека на чистом Python для чтения и изменения PDF-файлов: с ее помощью достают текст и метаданные, поворачивают, склеивают и разрезают страницы, ставят пароль. Ниже разобраны установка и готовые примеры для каждой операции, а также разница между старыми именами методов вроде PdfFileReader и актуальным API версии 3.x. Отдельно показано, как перенести код на пакет pypdf, в который PyPDF2 влился после окончания развития.

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

PyPDF2
Фото: Maggie McCain / CC BY 2.0, Wikimedia Commons
Содержание статьи
  1. Возможности PyPDF2
  2. Установка модуля
  3. Примеры использования
    1. 1. Извлечение метаданных PDF
    2. 2. Извлечение текста из PDF-страниц
    3. 3. Поворот страниц файла PDF
    4. 4. Объединение файлов PDF
    5. 5. Разделение PDF-файлов на одностраничные файлы
    6. 6. Шифрование и защита PDF-файлов паролем
  4. Старый и новый API PyPDF2
  5. Извлечение изображений из PDF
  6. Переход с PyPDF2 на pypdf
  7. Частые вопросы
    1. Откуда ошибка DeprecationError при вызове PdfFileReader?
    2. Почему extract_text() возвращает пустую строку или кракозябры?
    3. Как открыть PDF, защищенный паролем?
    4. Можно ли редактировать текст внутри PDF?
    5. Чем PyPDF2 отличается от pdfplumber и PyMuPDF?

Возможности PyPDF2

PyPDF2 позволяет выполнять различные операции над PDF-файлами, такие как:

  1. Извлечение метаданных PDF.
  2. Извлечение текста из PDF-страниц.
  3. Поворот страниц файла PDF.
  4. Объединение файлов PDF.
  5. Разделение PDF-файлов на одностраничные файлы.
  6. Извлечение изображений из PDF.

Установка модуля

Для установки PyPDF2 можно воспользоваться pip, выполнив следующую команду:

pip install PyPDF2

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

Раздел включает: извлечение метаданных PDF, извлечение текста из PDF-страниц, поворот страниц файла PDF, объединение файлов PDF, разделение PDF-файлов на одностраничные файлы, шифрование и защита PDF-файлов паролем.

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

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

Пример кода для извлечения метаданных PDF:

import PyPDF2

with open('example.pdf', 'rb') as file:
    pdf = PyPDF2.PdfReader(file)
    metadata = pdf.metadata
    
print(metadata)

В этом примере мы открываем PDF-файл 'example.pdf' в режиме чтения бинарного файла. Затем создаем объект PdfFileReader из файла и через свойство metadata извлекаем метаданные документа. Полученные метаданные могут содержать информацию, такую как название документа, автор, теги и другие свойства, которые были указаны при создании PDF.

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

2. Извлечение текста из PDF-страниц

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

Пример кода для извлечения текста из PDF-страниц:

import PyPDF2

with open('example.pdf', 'rb') as file:
    pdf = PyPDF2.PdfReader(file)
    text = ''
    for page in pdf.pages:
        text += page.extract_text()
    
print(text)

В этом примере мы открываем PDF-файл 'example.pdf' в режиме чтения бинарного файла. Затем создаем объект PdfFileReader из файла и проходим по каждой странице документа. Для каждой страницы мы извлекаем текст методом extract_text() и добавляем его к общему текстовому содержимому.

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

3. Поворот страниц файла PDF

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

Пример кода для поворота страниц файла PDF:

import PyPDF2

with open('example.pdf', 'rb') as file:
    pdf_writer = PyPDF2.PdfWriter()
    pdf_reader = PyPDF2.PdfReader(file)

    for pdf_page in pdf_reader.pages:
        pdf_page.rotate(90)  # Поворот страницы по часовой стрелке на 90 градусов
        pdf_writer.add_page(pdf_page)

    with open('rotated_example.pdf', 'wb') as output_file:
        pdf_writer.write(output_file)

В данном примере мы открываем PDF-файл 'example.pdf' в режиме чтения бинарного файла. Затем создаем объект PdfFileWriter для записи нового PDF-файла с повернутыми страницами и объект PdfFileReader для чтения исходного файла. Далее для каждой страницы в цикле мы поворачиваем страницу на 90 градусов по часовой стрелке методом rotate() и добавляем ее в объект PdfFileWriter. Наконец, сохраняем измененный файл под именем 'rotated_example.pdf'.

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

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

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

Пример кода для объединения файлов PDF:

import PyPDF2

pdf_merger = PyPDF2.PdfMerger()
pdf_merger.append('file1.pdf')
pdf_merger.append('file2.pdf')
pdf_merger.write('merged_files.pdf')
pdf_merger.close()

В данном примере мы создаем объект PdfFileMerger для объединения PDF-файлов. Затем с помощью метода append() добавляем исходные файлы 'file1.pdf' и 'file2.pdf' к объекту PdfFileMerger. После этого вызываем метод write(), чтобы сохранить объединенный документ под именем 'merged_files.pdf'. Наконец, закрываем объект PdfFileMerger.

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

5. Разделение PDF-файлов на одностраничные файлы

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

Пример кода для разделения PDF-файлов на одностраничные файлы:

import PyPDF2

with open('example.pdf', 'rb') as file:
    pdf = PyPDF2.PdfReader(file)
    for page_num, page in enumerate(pdf.pages):
        pdf_writer = PyPDF2.PdfWriter()
        pdf_writer.add_page(page)
        with open(f'page_{page_num + 1}.pdf', 'wb') as output_file:
            pdf_writer.write(output_file)

В данном примере мы открываем PDF-файл 'example.pdf' в режиме чтения бинарного файла. Затем создаем объект PdfFileReader из файла и в цикле проходим по каждой странице документа. Для каждой страницы создаем новый объект PdfFileWriter, добавляем текущую страницу методом add_page(), а затем сохраняем эту страницу в отдельный PDF-файл. Имя каждого созданного файла формируется на основе номера страницы, например, 'page_1.pdf', 'page_2.pdf' и так далее.

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

6. Шифрование и защита PDF-файлов паролем

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

Пример кода для шифрования и защиты PDF-файла паролем:

import PyPDF2

input_pdf = 'example.pdf'
output_pdf = 'encrypted_example.pdf'
password = 'secure_password'

pdf_writer = PyPDF2.PdfWriter()

with open(input_pdf, 'rb') as file:
    pdf_reader = PyPDF2.PdfReader(file)
    
    for page in pdf_reader.pages:
        pdf_writer.add_page(page)
        
    pdf_writer.encrypt(user_password=password)

    with open(output_pdf, 'wb') as output_file:
        pdf_writer.write(output_file)

В данном примере мы открываем исходный PDF-файл 'example.pdf' в режиме чтения бинарного файла. Создаем объект PdfFileWriter для записи зашифрованного PDF-файла. Затем для каждой страницы добавляем ее к объекту PdfFileWriter. С помощью метода encrypt() устанавливаем парольную защиту для файла с указанием пароля secure_password.

После завершения процесса шифрования и защиты файл сохраняется под именем 'encrypted_example.pdf'. Теперь для открытия этого файла требуется ввод пароля, который мы указали при шифровании.

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

Старый и новый API PyPDF2

В версии 3.0 методы в стиле camelCase удалены: вызов PdfFileReader или getPage() завершается исключением DeprecationError. Код из старых статей придется переписать по таблице соответствий.

Было (1.x)Стало (3.x и pypdf)
PdfFileReader(f)PdfReader(f)
PdfFileWriter()PdfWriter()
PdfFileMerger()PdfMerger() в PyPDF2, в pypdf вместо него PdfWriter.append()
getNumPages()len(reader.pages)
getPage(i)reader.pages[i]
getDocumentInfo()reader.metadata
extractText()page.extract_text()
addPage(p)writer.add_page(p)
rotateClockwise(90)page.rotate(90)

Объект PdfReader принимает не только открытый файл, но и путь в виде строки или Path, поэтому конструкция with open(...) для чтения необязательна:

from PyPDF2 import PdfReader

reader = PdfReader("example.pdf")
print(len(reader.pages))       # число страниц
print(reader.metadata.title)    # заголовок из свойств документа
print(reader.is_encrypted)      # True, если файл под паролем

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

Начиная с версии 3.0 у страницы есть свойство images: список встроенных картинок, у каждой есть имя и байты содержимого. Их можно сразу записать на диск:

from PyPDF2 import PdfReader

reader = PdfReader("example.pdf")
for num, page in enumerate(reader.pages, start=1):
    for image in page.images:
        with open(f"p{num}_{image.name}", "wb") as out:
            out.write(image.data)

Если PDF получен сканированием, текста в нем нет, есть только картинки страниц, и extract_text() вернет пустую строку. Такие изображения передают в OCR, например в pytesseract.

Переход с PyPDF2 на pypdf

Разработка PyPDF2 остановлена на версии 3.0.1, все исправления выходят в пакете pypdf с тем же API. Для переноса проекта обычно хватает двух шагов: поставить новый пакет через pip и заменить строку импорта.

# pip install pypdf
from pypdf import PdfReader, PdfWriter

writer = PdfWriter()
for name in ["file1.pdf", "file2.pdf"]:
    writer.append(name)          # склейка без PdfMerger
writer.write("merged_files.pdf")

Документация актуальной библиотеки: pypdf.readthedocs.io.

Частые вопросы

Ответы на вопросы, которые чаще всего возникают при работе с PyPDF2.

Откуда ошибка DeprecationError при вызове PdfFileReader?

Установлена PyPDF2 версии 3.x, а код написан под 1.x. Замените PdfFileReader на PdfReader, getPage(i) на pages[i] и остальные имена по таблице выше. Откатываться на старую версию не стоит: в ней много неисправленных ошибок разбора файлов.

Почему extract_text() возвращает пустую строку или кракозябры?

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

Как открыть PDF, защищенный паролем?

Проверьте reader.is_encrypted и вызовите reader.decrypt("пароль") до обращения к страницам. Для шифрования AES-256 дополнительно нужен пакет cryptography или pycryptodome.

Можно ли редактировать текст внутри PDF?

Нет, PyPDF2 работает со страницами целиком: копирует, поворачивает, накладывает одну на другую, меняет метаданные. Чтобы добавить надпись, ее рисуют на отдельной странице (например, через reportlab) и накладывают методом merge_page().

Чем PyPDF2 отличается от pdfplumber и PyMuPDF?

PyPDF2 и pypdf не требуют компиляции и хорошо подходят для операций со страницами и файлами. pdfplumber точнее извлекает таблицы и координаты текста, PyMuPDF быстрее и умеет рендерить страницы в изображения.