Обработка PDF в Python: автоматизация и парсинг документов

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Программисты и разработчики, изучающие Python
  • Специалисты по обработке и анализу данных
  • Представители бизнеса, заинтересованные в автоматизации документооборота

    Ежедневно мы сталкиваемся с тысячами PDF-документов — от финансовых отчётов до технической документации. Когда объём ручной обработки растёт, наступает момент истины: либо ты автоматизируешь процесс, либо утонешь в рутине. Python с его элегантным синтаксисом и мощными библиотеками превращает кошмар работы с PDF в структурированный танец кода. Готовы отбросить ручную обработку 500-страничных документов и написать скрипт, который сделает это за вас? Давайте погрузимся в арсенал инструментов, который сделает вас властелином PDF-вселенной. 🐍📄

Хотите овладеть Python настолько, чтобы PDF-файлы подчинялись каждой строке вашего кода? Обучение Python-разработке от Skypro — ваш прямой путь к профессиональному уровню программирования. На курсе вы не просто изучите основы, но и погрузитесь в практические задачи по обработке документов, автоматизации процессов и созданию веб-приложений. Получите навыки, за которые платят реальные деньги — от новичка до разработчика за 9 месяцев.

Python для работы с PDF: обзор возможностей и библиотек

PDF (Portable Document Format) — стандарт де-факто для обмена документами в цифровом мире. Несмотря на визуальную простоту, структура PDF достаточно сложна, и без специальных инструментов её программная обработка превращается в настоящий квест.

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

  • PyPDF2/PyPDF4 — базовые операции с PDF: объединение, разделение, извлечение текста и метаданных
  • ReportLab — профессиональное создание PDF-документов с широкими возможностями форматирования
  • Pikepdf — низкоуровневое манипулирование PDF на основе библиотеки QPDF
  • PDFMiner — продвинутое извлечение текста с сохранением структуры и разметки
  • pdfplumber — извлечение данных из таблиц и форм в PDF
  • Borb — современная библиотека с функциями создания, редактирования и анализа PDF

Выбор библиотеки зависит от конкретной задачи, и часто приходится комбинировать несколько для достижения желаемого результата. Рассмотрим ключевые возможности Python при работе с PDF:

Задача Рекомендуемая библиотека Сложность внедрения
Создание простых PDF PyFPDF, ReportLab Низкая
Создание сложных PDF ReportLab, Borb Средняя
Извлечение текста PyPDF2, PDFMiner, pdfplumber Низкая
Работа с таблицами pdfplumber, Camelot Средняя
Манипуляции страницами PyPDF2, pikepdf Низкая
Заполнение форм PyPDF2, pdfrw Средняя
Шифрование/дешифрование pikepdf, PyPDF2 Низкая

При выборе инструментов для работы с PDF через Python следует учитывать:

  • Частоту обновлений библиотеки (некоторые проекты уже не поддерживаются)
  • Скорость работы с большими документами
  • Точность извлечения данных (особенно при работе с нестандартными шрифтами)
  • Совместимость с различными версиями PDF-спецификации

Дмитрий Васильев, Lead Python Developer Однажды мне поручили задачу автоматизировать проверку 200+ технических спецификаций от поставщиков. Все документы были в PDF, и каждый требовал извлечения данных из определённых таблиц и сравнения с эталонными значениями. Вручную это заняло бы недели. Первое решение с PyPDF2 работало ужасно — извлеченный текст терял форматирование, и невозможно было понять, где начинаются и заканчиваются таблицы. Пробовал разные подходы, пока не наткнулся на pdfplumber. Эта библиотека стала настоящим спасением. Написал скрипт, который находил нужные таблицы по ключевым словам в заголовках, извлекал данные и сравнивал с допустимыми диапазонами. На разработку ушло три дня, но в итоге процесс, который занимал у инженеров 30-40 минут на один документ, сократился до нескольких секунд. За месяц экономия составила примерно 150 человеко-часов, а точность проверки повысилась на 27%.

Пошаговый план для смены профессии

Создание PDF-документов с нуля при помощи Python

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

ReportLab — самая мощная и зрелая библиотека для создания PDF в Python. Её условно можно разделить на несколько уровней абстракции:

  • Canvas — низкоуровневый API для прямого размещения элементов на странице
  • Platypus (Page Layout and Typography Using Scripts) — высокоуровневый фреймворк для создания сложных многостраничных документов
  • RML (Report Markup Language) — XML-подобный язык для описания PDF-документов (коммерческая версия)

Рассмотрим пример создания простого PDF-документа с помощью Canvas:

Python
Скопировать код
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors

# Создаем новый PDF-документ
c = canvas.Canvas("hello_world.pdf", pagesize=A4)

# Добавляем текст
c.setFont("Helvetica", 16)
c.drawString(100, 750, "Привет, PDF!")

# Добавляем линию
c.setStrokeColor(colors.blue)
c.line(100, 740, 500, 740)

# Добавляем прямоугольник
c.rect(100, 650, 400, 50, fill=0)

# Сохраняем документ
c.save()

Для более сложных документов с автоматическим форматированием и разбивкой на страницы используется Platypus:

Python
Скопировать код
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors

# Создаем документ
doc = SimpleDocTemplate("complex_document.pdf", pagesize=A4)

# Создаем стили
styles = getSampleStyleSheet()
title_style = styles['Heading1']
normal_style = styles['Normal']

# Создаем элементы
elements = []
elements.append(Paragraph("Отчет о продажах", title_style))
elements.append(Spacer(1, 12))
elements.append(Paragraph("Этот документ содержит информацию о продажах за последний квартал.", normal_style))
elements.append(Spacer(1, 12))

# Создаем таблицу
data = [
['Продукт', 'Январь', 'Февраль', 'Март'],
['Продукт A', '1200', '1500', '1800'],
['Продукт B', '900', '1100', '1300'],
['Продукт C', '1500', '1600', '1400']
]

table = Table(data)
table.setStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.grey),
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('GRID', (0, 0), (-1, -1), 1, colors.black)
])
elements.append(table)

# Создаем PDF
doc.build(elements)

Альтернативные библиотеки для создания PDF:

Библиотека Преимущества Недостатки Оптимальное применение
PyFPDF Простота использования, поддержка кириллицы Ограниченные возможности стилизации Простые отчеты, квитанции
WeasyPrint Конвертация HTML/CSS в PDF Требует внешних зависимостей Веб-страницы, HTML-шаблоны
Borb Современный API, расширенные возможности Меньше документации и примеров Сложные документы с интерактивными элементами
xhtml2pdf Простое преобразование HTML в PDF Ограниченная поддержка CSS Простые HTML-отчеты

При создании PDF-документов важно учитывать:

  • Правильную обработку нелатинских символов (для русского языка требуется установка соответствующих шрифтов)
  • Оптимизацию размера документа (особенно при работе с изображениями)
  • Использование векторной графики вместо растровой, где это возможно
  • Добавление метаданных для улучшения поиска и индексации

Редактирование PDF: извлечение и изменение контента

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

Основные операции редактирования PDF с помощью Python:

  • Манипуляция страницами (удаление, добавление, перестановка)
  • Извлечение текста и изображений
  • Добавление текста, изображений и аннотаций
  • Заполнение форм и полей
  • Редактирование метаданных

Для базовых операций манипуляции страницами отлично подходит PyPDF2:

Python
Скопировать код
from PyPDF2 import PdfReader, PdfWriter

# Открываем исходный PDF
reader = PdfReader("input.pdf")

# Создаем новый PDF для записи
writer = PdfWriter()

# Добавляем страницы в обратном порядке
for page in reversed(reader.pages):
writer.add_page(page)

# Удаляем первую страницу (теперь последнюю в исходном документе)
writer.pages.pop(0)

# Добавляем страницу из другого документа
other_reader = PdfReader("other.pdf")
writer.add_page(other_reader.pages[0])

# Сохраняем результат
with open("output.pdf", "wb") as output_file:
writer.write(output_file)

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

Python
Скопировать код
# Извлечение текста с помощью PyPDF2
from PyPDF2 import PdfReader

reader = PdfReader("document.pdf")
text = ""
for page in reader.pages:
text += page.extract_text() + "\n"

# Более продвинутое извлечение с помощью pdfminer
from pdfminer.high_level import extract_text

text = extract_text("document.pdf")

# Извлечение с сохранением структуры таблиц с помощью pdfplumber
import pdfplumber

with pdfplumber.open("document.pdf") as pdf:
page = pdf.pages[0]
# Извлечение таблицы
table = page.extract_table()
# Извлечение текста
text = page.extract_text()

Анастасия Петрова, Data Scientist Наша компания ежеквартально получала более 150 финансовых отчетов от региональных офисов. Каждый отчет представлял собой PDF-файл с десятками таблиц. Аналитикам приходилось вручную копировать данные из каждой таблицы в Excel, а затем агрегировать их. Этот процесс занимал около 5 рабочих дней и был подвержен человеческим ошибкам. Я решила автоматизировать этот процесс. Первые попытки использовать PyPDF2 не принесли успеха — извлеченные данные были бессистемными. Переход на pdfplumber кардинально изменил ситуацию. Библиотека прекрасно справлялась с распознаванием таблиц даже в сложно форматированных PDF. Написала скрипт, который анализировал все отчеты, находил в них ключевые таблицы по характерным заголовкам, извлекал данные и объединял их в единый Excel-файл с автоматически сгенерированными графиками. Время обработки сократилось с 5 дней до 20 минут, а точность данных повысилась на 100%, так как исчез человеческий фактор при переносе цифр. Руководство было настолько впечатлено, что внедрило подобные решения для обработки и других типов документов.

Для добавления контента в существующий PDF чаще всего используют комбинацию библиотек. Например, создание нового PDF с добавленным текстом поверх существующего:

Python
Скопировать код
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from io import BytesIO

# Создаем временный PDF с наложением текста
packet = BytesIO()
c = canvas.Canvas(packet, pagesize=letter)
c.drawString(100, 650, "Это добавленный текст!")
c.save()
packet.seek(0)

# Читаем исходный PDF
original_pdf = PdfReader("original.pdf")
watermark = PdfReader(packet)

# Создаем PDF для вывода результата
output = PdfWriter()

# Накладываем текст на каждую страницу
for i in range(len(original_pdf.pages)):
page = original_pdf.pages[i]
page.merge_page(watermark.pages[0])
output.add_page(page)

# Сохраняем результат
with open("output_with_text.pdf", "wb") as output_file:
output.write(output_file)

Если вам необходимо работать с формами PDF, можно использовать следующий подход:

Python
Скопировать код
from PyPDF2 import PdfReader, PdfWriter

# Открываем PDF-форму
reader = PdfReader("form.pdf")
writer = PdfWriter()

# Получаем первую страницу
page = reader.pages[0]
writer.add_page(page)

# Заполняем поля формы
writer.update_page_form_field_values(
writer.pages[0], {
"name": "Иван Иванов",
"email": "ivan@example.com",
"phone": "+7 (999) 123-45-67"
}
)

# Сохраняем заполненную форму
with open("filled_form.pdf", "wb") as output_file:
writer.write(output_file)

Обработка и анализ PDF-документов программно

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

Основные сценарии обработки PDF-документов включают:

  • Массовое извлечение и анализ текстовых данных
  • Парсинг сложных структур (таблиц, списков, форм)
  • Распознавание и классификация документов
  • Автоматическая обработка счетов, договоров и других бизнес-документов
  • Извлечение и анализ метаданных

Рассмотрим сценарий извлечения таблиц из финансового отчета:

Python
Скопировать код
import pdfplumber
import pandas as pd

def extract_tables_from_pdf(pdf_path, pages=None):
"""
Извлекает все таблицы из указанных страниц PDF-документа.

:param pdf_path: путь к PDF-файлу
:param pages: список номеров страниц (если None, обрабатываются все страницы)
:return: список DataFrame с таблицами
"""
all_tables = []

with pdfplumber.open(pdf_path) as pdf:
# Если страницы не указаны, обрабатываем все
if pages is None:
pages = range(len(pdf.pages))
else:
# Преобразуем в 0-based индексы
pages = [p-1 for p in pages]

for i in pages:
if i >= len(pdf.pages):
continue

page = pdf.pages[i]
tables = page.extract_tables()

for table in tables:
# Преобразуем таблицу в DataFrame
df = pd.DataFrame(table[1:], columns=table[0])

# Очистка и преобразование типов данных
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)

# Можно добавить информацию о странице
df['source_page'] = i + 1

all_tables.append(df)

return all_tables

# Пример использования
tables = extract_tables_from_pdf("financial_report.pdf", pages=[5, 6, 7])

# Объединение всех таблиц
combined_data = pd.concat(tables, ignore_index=True)

# Сохранение в Excel
combined_data.to_excel("extracted_tables.xlsx", index=False)

Для извлечения структурированной информации из счетов или договоров можно использовать комбинацию инструментов обработки PDF и регулярных выражений:

Python
Скопировать код
import re
import pdfplumber

def extract_invoice_data(pdf_path):
"""
Извлекает ключевые данные из счета-фактуры.

:param pdf_path: путь к PDF-файлу со счетом
:return: словарь с извлеченными данными
"""
invoice_data = {
"invoice_number": None,
"date": None,
"total_amount": None,
"vendor": None,
"line_items": []
}

with pdfplumber.open(pdf_path) as pdf:
# Обычно информация о счете на первой странице
first_page_text = pdf.pages[0].extract_text()

# Извлечение номера счета (пример шаблона)
invoice_match = re.search(r'Счет[:\s-]*№?\s*([A-Za-z0-9\-\/]+)', first_page_text, re.IGNORECASE)
if invoice_match:
invoice_data["invoice_number"] = invoice_match.group(1).strip()

# Извлечение даты (формат ДД.ММ.ГГГГ)
date_match = re.search(r'Дата[:\s]*(\d{2}[.]\d{2}[.]\d{4})', first_page_text, re.IGNORECASE)
if date_match:
invoice_data["date"] = date_match.group(1)

# Извлечение суммы
amount_match = re.search(r'Итого[:\s]*(\d+[.,]\d{2})', first_page_text, re.IGNORECASE)
if amount_match:
invoice_data["total_amount"] = amount_match.group(1).replace(',', '.')

# Извлечение информации о поставщике
vendor_match = re.search(r'Поставщик[:\s]*(.*?)(?:\n|\r|\s{2,}|$)', first_page_text, re.IGNORECASE)
if vendor_match:
invoice_data["vendor"] = vendor_match.group(1).strip()

# Извлечение позиций счета из таблицы
for page in pdf.pages:
tables = page.extract_tables()
for table in tables:
# Пропускаем заголовок таблицы
for row in table[1:]:
# Предполагаем структуру таблицы: Наименование, Количество, Цена, Сумма
if len(row) >= 4 and any(row): # Проверяем, что строка не пустая
item = {
"description": row[0],
"quantity": row[1],
"price": row[2],
"amount": row[3]
}
invoice_data["line_items"].append(item)

return invoice_data

# Пример использования
invoice_data = extract_invoice_data("invoice.pdf")
print(f"Счет №{invoice_data['invoice_number']} от {invoice_data['date']}")
print(f"Сумма: {invoice_data['total_amount']}")
print(f"Поставщик: {invoice_data['vendor']}")
print("\nПозиции счета:")
for item in invoice_data["line_items"]:
print(f"- {item['description']}: {item['quantity']} x {item['price']} = {item['amount']}")

Для более продвинутого анализа PDF-документов можно использовать комбинацию библиотек обработки PDF и инструментов машинного обучения:

Тип анализа Библиотеки Python Применение
Классификация документов scikit-learn, PyPDF2/pdfplumber Автоматическое определение типа документа (счет, договор, акт)
Извлечение именованных сущностей spaCy, NLTK, pdfminer Поиск имен, организаций, дат, сумм в тексте документа
Оптическое распознавание символов pytesseract, pdf2image Обработка отсканированных PDF-документов
Поиск аномалий pandas, numpy, PyPDF2 Обнаружение необычных значений в финансовых документах
Извлечение графиков и диаграмм matplotlib, pytesseract, opencv-python Анализ визуальных данных из отчетов

Практические решения типовых задач с PDF в Python

В этом разделе мы рассмотрим готовые решения для самых востребованных задач при работе с PDF-документами. Эти примеры можно использовать как основу для своих проектов, адаптируя их под конкретные требования. 🔧

Задача 1: Объединение нескольких PDF-файлов в один документ

Python
Скопировать код
from PyPDF2 import PdfReader, PdfWriter
import os

def merge_pdfs(directory, output_filename):
"""
Объединяет все PDF-файлы из указанной директории в один документ.

:param directory: директория с PDF-файлами
:param output_filename: имя выходного файла
"""
# Создаем объект для записи
pdf_writer = PdfWriter()

# Получаем список всех PDF-файлов в директории
pdf_files = [f for f in os.listdir(directory) if f.endswith('.pdf')]
pdf_files.sort() # Сортировка файлов по имени

# Добавляем все страницы из каждого файла
for pdf_file in pdf_files:
pdf_path = os.path.join(directory, pdf_file)
pdf_reader = PdfReader(pdf_path)
for page in pdf_reader.pages:
pdf_writer.add_page(page)

# Сохраняем результат
with open(output_filename, 'wb') as out_file:
pdf_writer.write(out_file)

print(f"Объединение завершено. Создан файл '{output_filename}'")

# Пример использования
merge_pdfs("./documents", "combined_document.pdf")

Задача 2: Создание PDF-отчета на основе данных из CSV-файла

Python
Скопировать код
import pandas as pd
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer
from reportlab.lib.styles import getSampleStyleSheet

def create_sales_report(csv_file, output_pdf):
"""
Создает PDF-отчет о продажах на основе данных из CSV-файла.

:param csv_file: путь к CSV-файлу с данными
:param output_pdf: имя выходного PDF-файла
"""
# Загружаем данные из CSV
data = pd.read_csv(csv_file)

# Создаем PDF-документ
doc = SimpleDocTemplate(output_pdf, pagesize=letter)
elements = []

# Добавляем стили
styles = getSampleStyleSheet()
title_style = styles["Heading1"]
subtitle_style = styles["Heading2"]
normal_style = styles["Normal"]

# Заголовок отчета
elements.append(Paragraph("Отчет о продажах", title_style))
elements.append(Spacer(1, 12))

# Общая информация
elements.append(Paragraph(f"Период: {data['Date'].min()} – {data['Date'].max()}", subtitle_style))
elements.append(Paragraph(f"Общая сумма продаж: {data['Amount'].sum():,.2f} руб.", normal_style))
elements.append(Paragraph(f"Количество транзакций: {len(data)}", normal_style))
elements.append(Spacer(1, 24))

# Создаем таблицу продаж по категориям
elements.append(Paragraph("Продажи по категориям", subtitle_style))
category_sales = data.groupby('Category')['Amount'].agg(['sum', 'count']).reset_index()
category_sales.columns = ['Категория', 'Сумма продаж', 'Количество продаж']
category_sales['Сумма продаж'] = category_sales['Сумма продаж'].apply(lambda x: f"{x:,.2f} руб.")

# Преобразуем DataFrame в список для таблицы
category_data = [category_sales.columns.tolist()] + category_sales.values.tolist()

# Создаем таблицу
table = Table(category_data)
table.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.grey),
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
('BOTTOMPADDING', (0, 0), (-1, 0), 12),
('GRID', (0, 0), (-1, -1), 1, colors.black)
]))
elements.append(table)
elements.append(Spacer(1, 24))

# Топ продавцов (если есть такие данные)
if 'Salesperson' in data.columns:
elements.append(Paragraph("Топ-5 продавцов", subtitle_style))
top_sales = data.groupby('Salesperson')['Amount'].sum().nlargest(5).reset_index()
top_sales.columns = ['Продавец', 'Сумма продаж']
top_sales['Сумма продаж'] = top_sales['Сумма продаж'].apply(lambda x: f"{x:,.2f} руб.")

top_data = [top_sales.columns.tolist()] + top_sales.values.tolist()

top_table = Table(top_data)
top_table.setStyle(TableStyle([
('BACKGROUND', (0, 0), (-1, 0), colors.grey),
('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
('BOTTOMPADDING', (0, 0), (-1, 0), 12),
('GRID', (0, 0), (-1, -1), 1, colors.black)
]))
elements.append(top_table)

# Сохраняем PDF
doc.build(elements)
print(f"Отчет сохранен в файл {output_pdf}")

# Пример использования
create_sales_report("sales_data.csv", "sales_report.pdf")

Задача 3: Извлечение и обработка данных из PDF-формы

Python
Скопировать код
from PyPDF2 import PdfReader
import re
import json

def extract_form_data(pdf_path, output_json=None):
"""
Извлекает данные из заполненной PDF-формы и сохраняет их в JSON-файл.

:param pdf_path: путь к PDF-файлу с заполненной формой
:param output_json: путь для сохранения JSON (если None, данные только возвращаются)
:return: словарь с извлеченными данными
"""
# Открываем PDF
pdf = PdfReader(pdf_path)

# Словарь для хранения данных
form_data = {}

# Извлекаем данные из полей формы, если они есть
if pdf.get_form_text_fields():
form_data = pdf.get_form_text_fields()
else:
# Если форма не интерактивная, пытаемся извлечь данные из текста
text = ""
for page in pdf.pages:
text += page.extract_text() + "\n"

# Пример извлечения данных с помощью регулярных выражений
# (нужно адаптировать под конкретную форму)
patterns = {
"name": r"Имя[:\s]+(.*?)(?:\n|\r|$)",
"email": r"Email[:\s]+([\w\.-]+@[\w\.-]+\.\w+)",
"phone": r"Телефон[:\s]+(\+?[0-9\s\-\(\)]+)",
"address": r"Адрес[:\s]+(.*?)(?:\n|\r|$)",
}

for field, pattern in patterns.items():
match = re.search(pattern, text, re.IGNORECASE)
if match:
form_data[field] = match.group(1).strip()

# Сохраняем данные в JSON-файл, если указан путь
if output_json:
with open(output_json, 'w', encoding='utf-8') as f:
json.dump(form_data, f, ensure_ascii=False, indent=4)
print(f"Данные формы сохранены в {output_json}")

return form_data

# Пример использования
form_data = extract_form_data("application_form.pdf", "form_data.json")
print("Извлеченные данные:")
for key, value in form_data.items():
print(f"{key}: {value}")

Задача 4: Добавление водяных знаков и защита PDF-документа

Python
Скопировать код
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from io import BytesIO
import os

def add_watermark_and_protect(input_pdf, output_pdf, watermark_text, password):
"""
Добавляет водяной знак на каждую страницу PDF и защищает документ паролем.

:param input_pdf: путь к исходному PDF-файлу
:param output_pdf: путь для сохранения защищенного PDF
:param watermark_text: текст водяного знака
:param password: пароль для защиты документа
"""
# Создаем водяной знак в отдельном PDF
packet = BytesIO()
c = canvas.Canvas(packet, pagesize=letter)

# Настраиваем прозрачность и шрифт
c.setFillColorRGB(0.5, 0.5, 0.5, alpha=0.3) # Серый цвет с прозрачностью
c.setFont("Helvetica", 48)

# Добавляем текст по диагонали
c.saveState()
c.translate(300, 400)
c.rotate(45)
c.drawString(0, 0, watermark_text)
c.restoreState()

c.save()
packet.seek(0)

# Читаем водяной знак в объект PDF
watermark = PdfReader(packet)
watermark_page = watermark.pages[0]

# Открываем исходный PDF
original = PdfReader(input_pdf)
output = PdfWriter()

# Применяем водяной знак к каждой странице
for i in range(len(original.pages)):
page = original.pages[i]
page.merge_page(watermark_page)
output.add_page(page)

# Шифруем документ
output.encrypt(password)

# Сохраняем защищенный PDF
with open(output_pdf, "wb") as file:
output.write(file)

print(f"Документ с водяным знаком сохранен как {output_pdf} и защищен паролем")

# Пример использования
add_watermark_and_protect("confidential_document.pdf", "protected_document.pdf", 
"КОНФИДЕНЦИАЛЬНО", "secure123")

Задача 5: Автоматическое извлечение изображений из PDF-документа

Python
Скопировать код
from PyPDF2 import PdfReader
import fitz # PyMuPDF
import io
from PIL import Image
import os

def extract_images_from_pdf(pdf_path, output_dir):
"""
Извлекает все изображения из PDF-документа и сохраняет их в указанную директорию.

:param pdf_path: путь к PDF-файлу
:param output_dir: директория для сохранения извлеченных изображений
:return: список путей к сохраненным изображениям
"""
# Создаем директорию для сохранения, если она не существует
if not os.path.exists(output_dir):
os.makedirs(output_dir)

# Извлекаем изображения с помощью PyMuPDF
saved_images = []
pdf_document = fitz.open(pdf_path)

# Счетчик для именования файлов
image_count = 0

for page_num in range(pdf_document.page_count):
page = pdf_document.load_page(page_num)
image_list = page.get_images(full=True)

for img_index, img_info in enumerate(image_list):
xref = img_info[0]
base_image = pdf_document.extract_image(xref)
image_bytes = base_image["image"]
image_extension = base_image["ext"]

# Открываем изображение с помощью PIL
image = Image.open(io.BytesIO(image_bytes))

# Пропускаем слишком маленькие изображения (часто это иконки или декоративные элементы)
if image.width < 50 or image.height < 50:
continue

# Формируем имя файла
image_filename = f"{os.path.basename(pdf_path).replace('.pdf', '')}_{image_count}.{image_extension}"
image_path = os.path.join(output_dir, image_filename)

# Сохраняем изображение
image.save(image_path)
saved_images.append(image_path)
image_count += 1

print(f"Сохранено изображение {image_path}")

pdf_document.close()

return saved_images

# Пример использования
extracted_images = extract_images_from_pdf("document_with_images.pdf", "extracted_images")
print(f"Всего извлечено {len(extracted_images)} изображений")

Python-инструменты для работы с PDF — настоящая магия в руках тех, кто знает их потенциал. От простого чтения документов до сложного анализа с применением машинного обучения — библиотеки PyPDF2, ReportLab, pdfplumber открывают безграничные возможности для автоматизации. Не бойтесь экспериментировать и комбинировать различные инструменты. Помните: самые элегантные решения рождаются на стыке разных технологий. Превратите многочасовую обработку PDF в секундное выполнение скрипта — и вы почувствуете, как Python меняет не только ваш код, но и отношение к рутинным задачам.

Загрузка...