Последнее обновление: 29 января 2025

В этой статье мы расскажем вам, как работать с PDF-файлами, используя Python. Для этого мы воспользуемся библиотекой pypdf.
С помощью библиотеки pypdf мы покажем, как выполнить следующие операции в Python:
- Извлечение текста из PDF
- Поворот страниц PDF
- Объединение нескольких PDF
- Разделение PDF на отдельные файлы
- Добавление водяных знаков на страницы PDF
Примечание: Эта статья охватывает множество ценных деталей, так что не стесняйтесь переходить к разделам, которые интересуют вас больше всего! Контент организован для простой навигации, так что вы сможете быстро сосредоточиться на наиболее актуальных для вас темах.

Примеры кода
Вы можете загрузить весь код, использованный в этой статье, по следующей ссылке. Она включает код, входные и выходные файлы.
Установка pypdf
Чтобы установить pypdf, просто выполните следующую команду в своем терминале или командной строке:
pip install pypdf
Примечание: Эта команда чувствительна к регистру.
1. Извлечение текста из PDF файла с использованием Python
from pypdf import PdfReader | |
# Path to the PDF file | |
pdf_file = "pdf-to-extract-text/input.pdf" | |
# Create a PDF reader object | |
reader = PdfReader(pdf_file) | |
# Loop through the pages and extract text | |
for page_number, page in enumerate(reader.pages, start=1): | |
print(f"Page {page_number}:") | |
print(page.extract_text()) | |
print("-" * 50) # Separator for readability |
Объяснение кода
1. Создание объекта чтения PDF
reader = PdfReader(pdf_file)
PdfReader(pdf_file)
загружает PDF файл в объект чтения.- Этот объект позволяет получить доступ к страницам и их содержимому.
2. Перебор страниц
for page_number, page in enumerate(reader.pages, start=1):
reader.pages
возвращает список страниц в PDF.enumerate(..., start=1)
присваивает номер страницы, начиная с 1.
3. Печать извлеченного текста
print(f"Страница {page_number}:")
print(page.extract_text())
print("-" * 50) # Разделитель для удобства чтения
page.extract_text()
извлекает текстовое содержимое из текущей страницы.- Скрипт выводит извлеченный текст вместе с номером страницы.
"-" * 50
печатает строку-разделитель (--------------------------------------------------
) для удобства чтения.
Входной PDF файл, использованный в коде
- Входной файл: Ссылка для загрузки
Выходные данные кода
Page 1: | |
Python Tutorial | |
Release 3.7.0 | |
Guido van Rossum | |
and the Python development team | |
September 02, 2018 | |
Python Software Foundation | |
Email: docs@python.org | |
-------------------------------------------------- | |
Page 2: | |
CONTENTS | |
1 Whetting Y our Appetite 3 | |
2 Using the Python Interpreter 5 | |
2.1 Invoking the Interpreter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |
2.2 The Interpreter and Its Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | |
3 An Informal Introduction to Python 9 | |
3.1 Using Python as a Calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 | |
3.2 First Steps Towards Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 | |
4 More Control Flow T ools 19 | |
4.1 if Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | |
4.2 for Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 | |
4.3 The range() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 | |
4.4 break and continue Statements, andelse Clauses on Loops. . . . . . . . . . . . . . . . . . 21 | |
4.5 pass Statements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | |
4.6 Defining Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 | |
4.7 More on Defining Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |
4.8 Intermezzo: Coding Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |
5 Data Structures 31 | |
5.1 More on Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 | |
5.2 The del statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 | |
5.3 Tuples and Sequences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 | |
5.4 Sets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 | |
5.5 Dictionaries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 | |
5.6 Looping Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 | |
5.7 More on Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | |
5.8 Comparing Sequences and Other Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 | |
6 Modules 43 | |
6.1 More on Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 | |
6.2 Standard Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 | |
6.3 The dir() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 | |
6.4 Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 | |
7 Input and Output 53 | |
7.1 Fancier Output Formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 | |
7.2 Reading and Writing Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 | |
8 Errors and Exceptions 61 | |
i | |
-------------------------------------------------- | |
Page 3: | |
Python Tutorial, Release 3.7.0 | |
Python is an easy to learn, powerful programming language. It has efficient high-level data structures and | |
a simple but effective approach to object-oriented programming. Python’s elegant syntax and dynamic | |
typing, together with its interpreted nature, make it an ideal language for scripting and rapid application | |
development in many areas on most platforms. | |
The Python interpreter and the extensive standard library are freely available in source or binary form for all | |
major platforms from the Python Web site,https://www.python.org/, and may be freely distributed. The | |
same site also contains distributions of and pointers to many free third party Python modules, programs | |
and tools, and additional documentation. | |
The Python interpreter is easily extended with new functions and data types implemented in C or C++ | |
(or other languages callable from C). Python is also suitable as an extension language for customizable | |
applications. | |
This tutorial introduces the reader informally to the basic concepts and features of the Python language | |
and system. It helps to have a Python interpreter handy for hands-on experience, but all examples are | |
self-contained, so the tutorial can be read off-line as well. | |
For a description of standard objects and modules, see library-index. reference-index gives a more formal | |
definition of the language. To write extensions in C or C++, read extending-index and c-api-index. There | |
are also several books covering Python in depth. | |
This tutorial does not attempt to be comprehensive and cover every single feature, or even every commonly | |
used feature. Instead, it introduces many of Python’s most noteworthy features, and will give you a good | |
idea of the language’s flavor and style. After reading it, you will be able to read and write Python modules | |
and programs, and you will be ready to learn more about the various Python library modules described in | |
library-index. | |
The | |
Glossary is also worth going through. | |
CONTENTS 1 | |
-------------------------------------------------- |
2. Поворот страниц PDF, используя Python
from pypdf import PdfReader, PdfWriter | |
# Input and output PDF files | |
input_pdf = "pdf-to-rotate/input.pdf" | |
output_pdf = "pdf-to-rotate/rotated_output.pdf" | |
# Read the PDF | |
reader = PdfReader(input_pdf) | |
writer = PdfWriter() | |
# Rotate the first page 90 degrees clockwise | |
page = reader.pages[0] | |
page.rotate(90) # Rotate 90 degrees clockwise | |
# Add the rotated page to the writer | |
writer.add_page(page) | |
# Add the rest of the pages without modification | |
for i in range(1, len(reader.pages)): | |
writer.add_page(reader.pages[i]) | |
# Write the output to a new PDF file | |
with open(output_pdf, "wb") as file: | |
writer.write(file) | |
print(f"Rotated page saved to {output_pdf}") |
Объяснение кода
Код в целом поворачивает первую страницу на 90° по часовой стрелке и сохраняет измененный PDF без воздействия на другие страницы.
1. Импорт требуемых классов
from pypdf import PdfReader, PdfWriter
PdfReader
: Читает входной PDF.PdfWriter
: Создает новый PDF с изменениями.
2. Определите пути к входным и выходным файлам
input_pdf = "pdf-to-rotate/input.pdf"
output_pdf = "pdf-to-rotate/rotated_output.pdf"
- Скрипт читает из
input.pdf
и сохраняет измененный файл какrotated_output.pdf
.
3. Чтение PDF и создание объекта Writer
reader = PdfReader(input_pdf)
writer = PdfWriter()
reader
загружает существующий PDF.writer
используется для хранения измененных страниц.
4. Поворот первой страницы на 90 градусов
page = reader.pages[0]
page.rotate(90) # Поворот на 90 градусов по часовой стрелке
writer.add_page(page)
- Извлекает первую страницу, поворачивает ее на 90 градусов и добавляет в новый PDF.
5. Добавление оставшихся страниц без изменений
for i in range(1, len(reader.pages)):
writer.add_page(reader.pages[i])
- Перебирает оставшиеся страницы и добавляет их как есть.
6. Сохранение нового PDF
with open(output_pdf, "wb") as file:
writer.write(file)
- Открывает
rotated_output.pdf
в двоичном режиме записи и сохраняет новый PDF.
7. Печать подтверждения
print(f"Повернутая страница сохранена в {output_pdf}")
- Выводит сообщение о успешном сохранении.
Входной PDF, использованный в коде, и его повёрнутый выходной файл
- Входной PDF файл: Ссылка для загрузки
- Выходной повёрнутый PDF файл: Ссылка для загрузки
Скриншот
3. Объединение PDF файлов с использованием Python
Этот скрипт Python демонстрирует, как объединить несколько PDF файлов из директории в один PDF с использованием библиотеки PyPDF.
import os | |
from pypdf import PdfReader, PdfWriter | |
# Directory containing PDF files | |
directory = "pdfs-to-merge" | |
# Output file name | |
output_file = "output-dir/merged_output.pdf" | |
# Ensure the output directory exists | |
os.makedirs(os.path.join(directory, "output-dir"), exist_ok=True) | |
# Create a PdfWriter object | |
writer = PdfWriter() | |
# Iterate over all PDF files in the directory | |
for file_name in sorted(os.listdir(directory)): | |
if file_name.endswith(".pdf"): | |
file_path = os.path.join(directory, file_name) | |
print(f"Adding: {file_name}") | |
# Read the PDF file | |
reader = PdfReader(file_path) | |
# Append all pages to the writer | |
writer.append(reader) | |
# Write the merged PDF to an output file | |
output_path = os.path.join(directory, output_file) | |
with open(output_path, "wb") as output_pdf: | |
writer.write(output_pdf) | |
print(f"Merged PDF saved as: {output_path}") |
Объяснение кода
- Этот скрипт автоматически объединяет все PDF файлы, найденные в указанной директории (
pdfs-to-merge
), в один выходной файл (merged_output.pdf
). - Он обеспечивает существование выходной директории и добавляет страницы каждого PDF в том порядке, в котором они перечислены.
- Он выводит финальный объединенный файл в поддиректорию
output-dir
.
Разбор кода
1. Импорт библиотек
import os
from pypdf import PdfReader, PdfWriter
os
: Используется для взаимодействия с файловой системой, например, для чтения директорий и управления путями к файлам.PdfReader
: Читает содержимое PDF файла.PdfWriter
: Создает и записывает новый PDF файл.
2. Определите директорию и выходной файл
directory = "pdfs-to-merge"
output_file = "output-dir/merged_output.pdf"
directory
: Указывает папку, в которой хранятся PDF файлы.output_file
: Определяет выходной путь и название объединенного PDF.
3. Создание выходной директории, если она не существует
os.makedirs(os.path.join(directory, "output-dir"), exist_ok=True)
- Это гарантирует, что выходная директория существует, и если ее нет, она создается.
4. Создать объект PdfWriter
writer = PdfWriter()
writer
используется для сбора и объединения всех страниц из PDF.
5. Итерация по всем PDF файлам в директории
for file_name in sorted(os.listdir(directory)):
if file_name.endswith(".pdf"):
file_path = os.path.join(directory, file_name)
print(f"Добавление: {file_name}")
- Этот цикл проходит по всем файлам в указанной директории, проверяя, чтобы файлы имели расширение
.pdf
. Он используетsorted()
, чтобы обрабатывать их в алфавитном порядке.
6. Чтение каждого PDF и добавление страниц в Writer
reader = PdfReader(file_path)
writer.append(reader)
- Для каждого PDF
PdfReader
читает файл, а затем все страницы этого PDF добавляются вwriter
.
7. Запись объединенного PDF в выходной файл
output_path = os.path.join(directory, output_file)
with open(output_path, "wb") as output_pdf:
writer.write(output_pdf)
- После сбора всех страниц
writer.write()
записывает объединённый PDF в указанный выходной путь.
8. Печать подтверждения
print(f"Объединенный PDF сохранен как: {output_path}")
- Печатает сообщение о успехе, подтверждающее место сохранения объединённого PDF.
Входные PDF файлы, использованные в коде, и объединённый выходной PDF
- Входные PDF файлы: Ссылка для загрузки
- Объединённый выходной PDF: Ссылка для загрузки
4. Разделение PDF с использованием Python
from pypdf import PdfReader, PdfWriter | |
import os | |
# Input PDF file | |
input_pdf = "pdf-to-split/input.pdf" | |
# Output directory | |
output_directory = "pdf-to-split/output-dir" | |
# Ensure the output directory exists | |
os.makedirs(output_directory, exist_ok=True) | |
# Read the input PDF | |
reader = PdfReader(input_pdf) | |
# Loop through each page and save it as a separate PDF | |
for page_num, page in enumerate(reader.pages): | |
writer = PdfWriter() | |
writer.add_page(page) | |
# Define the output file name | |
output_file = os.path.join(output_directory, f"page_{page_num + 1}.pdf") | |
# Write the page to a new PDF | |
with open(output_file, "wb") as output_pdf: | |
writer.write(output_pdf) | |
print(f"Created: {output_file}") | |
print("PDF splitting complete!") |
Объяснение кода
Вышеуказанный скрипт Python разделяет PDF на отдельные страницы с помощью библиотеки PyPDF. Сначала он проверяет наличие выходной директории, затем считывает входной PDF файл. Скрипт перебирает каждую страницу, создает новый объект PdfWriter и сохраняет каждую страницу как отдельный PDF файл. Выходные файлы называются последовательно (например, page_1.pdf, page_2.pdf) и хранятся в папке output-dir
. В конце скрипт выводит сообщение подтверждения для каждого созданного файла и уведомляет, когда процесс завершен.
Входной PDF и выходные разделенные файлы
- Входной PDF файл: Ссылка для загрузки
- Разделённые выходные файлы: Ссылка для загрузки
5. Добавление водяного знака в PDF с использованием Python
Вы можете добавить водяной знак в PDF, используя библиотеку PyPDF, накладывая PDF с водяным знаком на существующий PDF. Убедитесь, что PDF с водяным знаком содержит только одну страницу, чтобы он правильно применялся к каждой странице основного PDF.
from pypdf import PdfReader, PdfWriter | |
# Paths for the input PDF and watermark PDF | |
input_pdf = "pdf-to-watermark/input.pdf" | |
watermark_pdf = "pdf-to-watermark/watermark.pdf" | |
output_pdf = "pdf-to-watermark/output_with_watermark.pdf" | |
# Read the input PDF and watermark PDF | |
reader = PdfReader(input_pdf) | |
watermark = PdfReader(watermark_pdf) | |
# Create a PdfWriter object for the output PDF | |
writer = PdfWriter() | |
# Ensure the watermark has only one page (it should be one-page PDF) | |
watermark_page = watermark.pages[0] | |
# Loop through each page in the input PDF | |
for page in reader.pages: | |
# Merge the watermark with the current page | |
page.merge_page(watermark_page) | |
# Add the merged page to the writer | |
writer.add_page(page) | |
# Write the output PDF with watermark | |
with open(output_pdf, "wb") as output_file: | |
writer.write(output_file) | |
print(f"Watermarked PDF saved as: {output_pdf}") |
Объяснение кода
Вышеуказанный скрипт Python читает входной PDF, извлекает одностраничный PDF водяного знака, накладывает водяной знак на каждую страницу входного PDF и сохраняет итоговый PDF с водяными знаками.
Разбор кода
Вот краткое объяснение каждой части
1. Импорт необходимых классов
from pypdf import PdfReader, PdfWriter
PdfReader
используется для чтения существующих PDF.PdfWriter
используется для создания и записи нового PDF.
2. Определите пути к файлам
input_pdf = "pdf-to-watermark/input.pdf"
watermark_pdf = "pdf-to-watermark/watermark.pdf"
output_pdf = "pdf-to-watermark/output_with_watermark.pdf"
input_pdf
: Оригинальный PDF, к которому будет добавлен водяной знак.watermark_pdf
: Отдельный одностраничный PDF, выступающий в качестве водяного знака.output_pdf
: Выходной файл, который будет содержать страницы с водяными знаками.
3. Чтение PDF
reader = PdfReader(input_pdf)
watermark = PdfReader(watermark_pdf)
reader
: Читает входной PDF.watermark
: Читает PDF с водяным знаком.
4. Создание объекта Writer
writer = PdfWriter()
- Это будет использовано для создания финального PDF с водяными знаками.
5. Извлечение страницы с водяным знаком
watermark_page = watermark.pages[0]
- Предполагается, что PDF с водяным знаком содержит только одну страницу, которая используется для наложения на все страницы.
6. Перебор страниц входного PDF и наложение водяного знака
for page in reader.pages:
# Совмещение водяного знака и текущей страницы
page.merge_page(watermark_page)
# Добавление объединённой страницы в writer
writer.add_page(page)
- Перебирает каждую страницу из
input_pdf
. merge_page(watermark_page)
накладывает водяной знак поверх текущей страницы.- Добавляет изменённую страницу в
writer
.
7. Сохранение PDF с водяными знаками
with open(output_pdf, "wb") as output_file:
writer.write(output_file)
- Записывает изменённые страницы в новый PDF файл.
8. Печать подтверждения
print(f"PDF с водяным знаком сохранён как: {output_pdf}")
- Выводит путь к выходному файлу для подтверждения.
Входной PDF, PDF с водяным знаком и выходной PDF с водяными знаками
- Входной PDF файл: Ссылка для загрузки
- PDF файл с водяным знаком: Ссылка для загрузки
- Выходной файл с водяным знаком: Ссылка для загрузки
Скриншот
Заключение
В этом руководстве мы изучили основные операции с PDF в Python, включая извлечение текста, поворот страниц, объединение, разделение и добавление водяных знаков. Обладая этими навыками, вы теперь можете создать собственный менеджер PDF и эффективно автоматизировать различные задачи, связанные с PDF.