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

Заголовок - Работа с PDF файлами в Python

В этой статье мы расскажем вам, как работать с PDF-файлами, используя Python. Для этого мы воспользуемся библиотекой pypdf.

С помощью библиотеки pypdf мы покажем, как выполнить следующие операции в Python:

  • Извлечение текста из PDF
  • Поворот страниц PDF
  • Объединение нескольких PDF
  • Разделение PDF на отдельные файлы
  • Добавление водяных знаков на страницы PDF

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

Иллюстрация - Работа с PDF файлами в Python

Примеры кода

Вы можете загрузить весь код, использованный в этой статье, по следующей ссылке. Она включает код, входные и выходные файлы.

Установка 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 с использованием Python

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

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 и выходные разделенные файлы

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 с водяным знаком с использованием Python

Заключение

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