PDF — это не только текст: добавление и извлечение вложенных файлов с помощью Python
Полный отчёт по проекту часто включает не только основной документ PDF, но и таблицы Excel с расчётами, исходные изображения или дополнительные пояснения. Если отправлять эти файлы отдельно, получателю придётся скачивать и упорядочивать их по одному, рискуя упустить какой-либо материал.
Вложения PDF предлагают другой способ организации: сопутствующие файлы можно встроить непосредственно в PDF и передать вместе с основным документом. Например, к финансовому отчёту можно приложить исходную книгу Excel, к руководству пользователя — файлы примеров, а к договору — дополнительные материалы.
В этой статье рассмотрим, как с помощью Spire.PDF for Python выполнить две операции: добавить вложения в PDF и извлечь их из документа.
Чем вложения PDF отличаются от содержимого страниц?
PDF с вложениями можно представить как документ со встроенной папкой для материалов: страницы отображают основной текст, а вложения хранят сопутствующие файлы.
При этом встраивание вложений отличается от вставки изображений и добавления гиперссылок:
Таким образом, добавление файла Excel в качестве вложения не преобразует его листы в страницы PDF . После извлечения получатель по-прежнему сможет открыть и отредактировать исходную книгу в Excel.
Поддержка вложений зависит от программы просмотра. Для работы с ними рекомендуется использовать настольные приложения с панелью вложений, например Adobe Acrobat. Некоторые встроенные средства просмотра PDF в браузерах могут не отображать доступ к вложенным файлам.
Подготовка среды
Spire.PDF for Python — библиотека для создания и обработки PDF. В этой статье мы используем её интерфейсы для работы с вложениями, чтобы напрямую обращаться к файлам внутри PDF, без ручного добавления или экспорта через программу просмотра.
Сначала установите библиотеку:
pip install Spire.PDF
Импортируйте необходимые модули:
from spire.pdf import *
from spire.pdf.common import *
Следующие примеры показывают добавление и извлечение вложений. Перед запуском замените пути к файлам на актуальные пути на вашем компьютере.
1. Добавление вложений в PDF
Предположим, у нас есть отчёт в формате PDF, вместе с которым нужно передать исходные данные Report.xlsx и изображение Logo.png. Если встроить их как вложения, получателю достаточно сохранить один PDF, чтобы иметь и основной документ, и оба сопутствующих файла.
Процесс состоит из четырёх шагов:
Загрузить целевой PDF.
Создать объекты вложений на основе внешних файлов.
Добавить вложения в коллекцию документа.
Сохранить новый PDF с вложениями.
Пример кода
from spire.pdf import *
from spire.pdf.common import *
# Создать объект PDF-документа
doc = PdfDocument()
# Загрузить целевой PDF
doc.LoadFromFile("Input.pdf")
# Создать объекты вложений на основе внешних файлов
attachment_one = PdfAttachment("Report.xlsx")
attachment_two = PdfAttachment("Logo.png")
# Добавить вложения в PDF
doc.Attachments.Add(attachment_one)
doc.Attachments.Add(attachment_two)
# Сохранить как новый PDF-файл
doc.SaveToFile("Attachments.pdf")
# Освободить ресурсы
doc.Close()
Пояснение к коду и проверка результата
PdfAttachment("Report.xlsx") создаёт объект вложения на основе указанного файла. Затем вызов doc.Attachments.Add() добавляет его в текущий PDF. Для добавления других файлов можно создать дополнительные объекты вложений и включить их в коллекцию.
Вложения не занимают место на страницах и не изменяют вёрстку основного документа. После сохранения страницы файла Attachments.pdf могут выглядеть точно так же, как в исходном документе. Однако в программе просмотра с поддержкой вложений встроенные файлы будут доступны на панели «Вложения» или «Прикреплённые файлы».
В примере используются разные имена входного и выходного файлов. Поэтому исходный Input.pdf сохраняется, а результат с добавленными вложениями записывается в Attachments.pdf.
Также следует учитывать размер документа: поскольку PDF содержит сами данные вложений, большие книги Excel или изображения высокого разрешения могут заметно увеличить его объём. При отправке по электронной почте или загрузке в информационную систему учитывайте ограничения на размер файлов.
2. Извлечение вложений из PDF
Если после получения PDF с вложениями нужно отредактировать книгу Excel, упорядочить изображения или передать материалы другой программе, вложения можно извлечь в отдельные файлы.
Для этого не требуется анализировать страницы PDF или применять OCR. Программа напрямую читает коллекцию вложений документа и записывает содержащиеся в ней данные на диск.
Порядок действий:
Загрузить PDF с вложениями.
Получить коллекцию вложений документа.
Перебрать вложения, прочитав имена файлов и данные.
Сохранить каждое вложение в указанную папку.
Пример кода
from spire.pdf import *
from spire.pdf.common import *
# Создать объект PDF-документа
doc = PdfDocument()
# Загрузить PDF-файл
doc.LoadFromFile("Attachments.pdf")
# Получить коллекцию вложений документа
collection = doc.Attachments
# Перебрать вложения
if collection.Count > 0:
for i in range(collection.Count):
# Получить конкретное вложение
attachment = collection.get_Item(i)
# Получить имя файла и данные вложения
fileName = attachment.FileName
data = attachment.Data
# Сохранить файл в указанную папку
data.Save("Output\\" + fileName)
doc.Close()
Пояснение к коду и проверка результата
doc.Attachments возвращает коллекцию вложений документа, а collection.Count — количество вложений в ней. Если вложений нет, пример пропускает операцию сохранения.
При переборе get_Item(i) получает вложение по индексу, FileName предоставляет имя файла, а Data.Save(path) записывает данные вложения по указанному пути.
После обработки PDF из предыдущего примера в выходной папке появятся Report.xlsx и Logo.png. Их можно открыть в соответствующих приложениях, больше не обращаясь к программе просмотра PDF.
На что обратить внимание при извлечении
Прежде всего — на выходную папку. Пример предполагает, что Output уже существует. В реальном проекте её можно автоматически создать перед извлечением с помощью Python-функции os.makedirs().
Ещё один момент — совпадающие имена файлов. В разных PDF могут находиться вложения с одинаковым именем, например Report.xlsx. При сохранении в общую папку они могут перезаписать друг друга. Для пакетного извлечения рекомендуется создавать отдельную подпапку для каждого PDF. Если одноимённые вложения находятся внутри одного документа, к именам можно добавлять индекс.
Также следует обрабатывать имена сохраняемых файлов. При работе с PDF из внешних источников можно использовать os.path.basename(), чтобы получить только имя файла вложения, а затем объединить его с целевой папкой. Это позволяет не использовать содержащуюся в имени вложения информацию о пути напрямую при сохранении.
Часто задаваемые вопросы
Вопрос 1. Почему после добавления вложений страницы PDF не изменились?
Вложения хранятся внутри документа и не относятся к содержимому, отображаемому непосредственно на страницах. Откройте панель вложений в программе просмотра, которая поддерживает эту функцию.
Вопрос 2. Нужно ли отправлять исходные файлы отдельно после добавления вложений?
Если вложения сохранены внутри PDF, получатель сможет извлечь их из документа. Тем не менее перед отправкой желательно открыть выходной файл и проверить, что все необходимые вложения добавлены.
Вопрос 3. Извлечение вложений и извлечение изображений из PDF — это одно и то же?
Нет. Извлечение вложений означает получение самостоятельных файлов, встроенных в PDF. Извлечение изображений со страниц — получение графических ресурсов, используемых на этих страницах. Изображение, видимое на странице PDF, не обязательно входит в коллекцию вложений.
Вопрос 4. Можно ли обрабатывать несколько PDF в пакетном режиме?
Да. Достаточно поместить логику обработки одного PDF в цикл перебора файлов. При пакетном извлечении рекомендуется создавать отдельные выходные папки по именам PDF, чтобы легче определять источник вложений и избегать конфликтов имён.
Итоги
Вложения PDF позволяют объединить основной документ и сопутствующие материалы: страницы сохраняют удобную для чтения вёрстку, а исходные книги Excel, изображения и дополнительные файлы хранятся вместе с ними.
С помощью Spire.PDF for Python можно добавлять вложения через PdfAttachment и doc.Attachments.Add(), а также перебирать doc.Attachments, сохраняя имеющиеся вложения в отдельные файлы. При практическом использовании основное внимание стоит уделить совместимости программ просмотра, размеру документа и обработке папок и имён файлов при извлечении.














