Освоение разделения PDF в Python: от отдельных страниц до извлечения произвольных диапазонов
Сталкивались ли вы когда-нибудь с такой ситуацией: вы получаете PDF-отчёт на сотни страниц, пытаетесь переслать его коллеге, но вложение в письме превышает допустимый размер и отклоняется? Или вам нужна только конкретная глава, но приходится вручную извлекать её постранично из сотен страниц? Эти «громоздкие» файлы всегда доставляют головную боль при обмене, печати или архивировании. Решение на самом деле довольно простое — просто разделите PDF на несколько меньших файлов по требованию, и проблема решена.
В этой статье мы покажем, как использовать библиотеку Spire.PDF for Python для реализации двух основных режимов разделения с минимальным количеством кода: разделение на одностраничные PDF-файлы одним нажатием и гибкое разделение по произвольным диапазонам страниц .
Предварительные требования: настройка окружения и импорт библиотеки
Spire.PDF for Python — это профессиональный компонент для работы с PDF, который работает полностью независимо от внешних программ, таких как Adobe Acrobat, что делает его идеальным для интеграции в серверы или автоматизированные скрипты.
Команда установки:
pip install Spire.PDF
После установки импортируйте необходимые модули в начале файла с кодом, чтобы приступить к работе.
Режим 1: Разделение каждой страницы на отдельные одностраничные PDF-файлы
Если ваша бизнес-задача требует сохранить каждую страницу многодесятистраничного контракта, тендерной документации или электронной книги как отдельный PDF-файл, метод Split() является самым удобным выбором.
from spire.pdf.common import *
from spire.pdf import *
# 1. Инициализация и загрузка исходного PDF-документа
doc = PdfDocument()
doc.LoadFromFile("Sample.pdf")
# 2. Разделение: сохранение каждой страницы как независимого одностраничного PDF-файла
# {0} — это заполнитель номера страницы; второй параметр 1 указывает, что нумерация начинается с 1
doc.Split("Output/SplitDocument-{0}.pdf", 1)
# 3. Освобождение ресурсов
doc.Close()
Пояснение метода:
Полная сигнатура метода Split() — Split(string fileName, int startNumber), и его функция заключается в строго фиксированном разделении каждой страницы PDF на независимый одностраничный PDF-файл — это поведение нельзя изменить с помощью параметров.
Два параметра означают следующее:
fileName : Путь для выходного файла и шаблон имени. {0} внутри является заполнителем, который будет автоматически заменён фактическим номером страницы при сохранении.
startNumber : Задаёт начальный номер для заполнителя {0}. Он влияет только на нумерацию в имени файла и не имеет отношения к логике разделения .
Режим 2: Разделение по требованию путём выбора диапазонов страниц
Иногда нам не нужно разделять каждую страницу, а хочется разбить PDF на логические части. Например: Часть 1 (обложка) , Часть 2 (основной текст, главы 1–3) , Часть 3 (приложение) .
В этом случае мы можем создать несколько объектов PdfDocument и использовать метод InsertPageRange() для точного извлечения определённых страниц из исходного документа.
from spire.pdf.common import *
from spire.pdf import *
# Загрузка исходного документа
doc = PdfDocument()
doc.LoadFromFile("Sample.pdf")
# Создание трёх пустых PDF-объектов для хранения разделённого содержимого
newDoc_1 = PdfDocument()
newDoc_2 = PdfDocument()
newDoc_3 = PdfDocument()
# 1. Извлечение страницы 1 (обложка)
# Примечание: индексы страниц начинаются с 0, поэтому страница 1 соответствует индексу 0
newDoc_1.InsertPage(doc, 0)
# 2. Извлечение страниц со 2 по 4 (начало основного текста)
# Параметры InsertPageRange: (исходный_документ, начальный_индекс, конечный_индекс)
newDoc_2.InsertPageRange(doc, 1, 3)
# 3. Извлечение страниц с 5 по последнюю (оставшаяся часть)
# doc.Pages.Count получает общее количество страниц; вычитание 1 даёт индекс последней страницы
newDoc_3.InsertPageRange(doc, 4, doc.Pages.Count - 1)
# Сохранение трёх разделённых документов по отдельности
newDoc_1.SaveToFile("Output1/Split-1.pdf")
newDoc_2.SaveToFile("Output1/Split-2.pdf")
newDoc_3.SaveToFile("Output1/Split-3.pdf")
# Закрытие всех объектов документа для освобождения памяти
doc.Close()
newDoc_1.Close()
newDoc_2.Close()
newDoc_3.Close()
Правила индексации страниц (очень важно):
В Spire.PDF нумерация страниц следует общепринятому в программировании соглашению — начиная с 0 . То есть doc.Pages[0] представляет первую страницу PDF. Понимание этого критически важно для точного извлечения диапазонов:
InsertPage(doc, 0): вставляет страницу 1.
InsertPageRange(doc, 1, 3): вставляет страницы со 2 по 4 включительно.
InsertPageRange(doc, 4, doc.Pages.Count - 1): начинается со страницы 5 и до физической последней страницы.
Преимущество такого подхода к разделению — его исключительная гибкость: вы можете комбинировать страницы по любым правилам или даже извлекать страницы из разных исходных файлов и объединять их в новый PDF (используя возможность InsertPage работать с разными документами).
Расширение: Разделение по фиксированным группам страниц
Стоит отметить, что метод Split() не может выполнить требование «объединять каждые N страниц в один PDF» (например, объединять каждые 2 страницы в один файл). Если вам требуется такое групповое разделение, необходимо использовать InsertPageRange в цикле для ручной реализации:
# Пример: объединение каждых 2 страниц в один PDF
group_size = 2
for i in range(0, doc.Pages.Count, group_size):
new_doc = PdfDocument()
end_index = min(i + group_size - 1, doc.Pages.Count - 1)
new_doc.InsertPageRange(doc, i, end_index)
new_doc.SaveToFile(f"Output/Group-{i // group_size + 1}.pdf")
new_doc.Close()
Рекомендации по выбору между двумя режимами
Заключение
Как показано в приведённых примерах, с помощью Spire.PDF for Python мы можем выполнять сложные задачи по разделению PDF, используя всего лишь чуть более десятка строк основного кода. Будь то пакетная обработка архивных файлов или интеграция функциональности управления документами в систему, это решение может значительно сэкономить время разработки.
Надеемся, эта статья поможет вам эффективно решать задачи по разделению PDF! Если вы столкнётесь с другими проблемами на практике, не стесняйтесь изучать их дальше.










