Есть ли в PDF-файле скрытые вложения? Инвентаризация встроенных файлов перед доставкой с помощью pypdf

В PDF-файл могут быть встроены вложения, а вложения с одним и тем же именем могут соответствовать нескольким частям контента. Инвентаризация с помощью pypdf перед доставкой: назначьте независимый идентификатор каждому вложению в порядке извлечения, оставьте исходное имя в качестве метаданных, не записывайте на диск, не выполняйте, не позволяйте клиентам получать посылку с недостающими деталями.

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

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

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

Как подсчитать вложения PDF перед доставкой? Вывод в одно предложение

Используйте pypdf, чтобы присвоить независимый идентификатор каждому вложению в порядке извлечения. Исходное имя сохраняется только в виде метаданных и не записывается непосредственно на диск. Исключения проверяются вручную согласно форме принятия.

твоя ситуацияРекомендуемые практикипричина
В PDF-файле могут быть вложения с таким же именем.Назначайте независимые идентификаторы в порядке извлечения, сохраняйте весь контент.Вложения с одинаковым именем сохраняются в виде списка. Написание напрямую по имени перезапишет друг друга.
Имя файла содержит ../ или разделитель пути.Удалите структуру каталогов и используйте в качестве метаданных только имя файла.Прямая запись может потерпеть неудачу и даже создать угрозу безопасности.
Имеется много вложений или существует шифрование или подписи.Приостановите автоматизированный процесс и передайте его специальному рецензенту.Если имеется более 20 вложений или имеется шифрование или подписи, автоматические результаты требуют подтверждения вручную.
Перед поставкой необходимо подтвердить комплектностьПроверка по позициям по форме приемкиАвтоматическое извлечение не может заменить ручную проверку перед доставкой.

Почему вложение с таким же именем автоматически теряет файлы?

При обработке PDF-файлов со встроенными файлами наиболее скрытой проблемой является не ошибка, а отсутствие файлов после «успешного» выполнения процесса.

  • При циклическом переборе reader.attachments и записи непосредственно на диск с исходным именем, если в PDF-файл встроены два файла с именем report.xlsx, последний перезапишет предыдущий.
  • Если имя файла содержит символы ../ или зарезервированные системой, запись может завершиться неудачей и даже вызвать угрозу безопасности.

— В официальном документе pypdf указано, что имена вложений могут содержать любые символы, а вложения с тем же именем хранятся в виде списка.

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

Создайте проверяемые входные данные о границах, используя синтетические образцы

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

  1. Обычный файл data.csv;
  2. data.csv с тем же названием, что и первый, но с другим содержанием;
  3. Имя файла содержит ..\secret.txt с характеристиками обхода пути.

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

Запустите пример безопасного извлечения и очистки имен файлов.

См. список импорта для зависимостей. Код создает входные данные в памяти, не записывает на диск и не выполняет содержимое вложения.

from io import BytesIO
from pypdf import PdfReader, PdfWriter
writer = PdfWriter()
writer.add_blank_page(width=200, height=200)
writer.add_attachment("data.csv", b"row-one")
writer.add_attachment("data.csv", b"row-two")
writer.add_attachment("../secret.txt", b"synthetic secret")
out = BytesIO()
writer.write(out)
out.seek(0)
reader = PdfReader(out)
records = []
for name, contents in reader.attachments.items():
    for content in contents:
        records.append({"id": len(records), "source_name": name, "bytes": content})
assert len(records) == 3
assert len({r["id"] for r in records}) == 3
assert {r["bytes"] for r in records if r["source_name"] == "data.csv"} == {b"row-one", b"row-two"}
assert any(r["source_name"] == "../secret.txt" for r in records)

Следует отметить, что этот код является лишь логической демонстрацией и не представляет собой полного охвата всех функций вложений pypdf. При производстве также необходимо учитывать такие ситуации, как потоковое чтение больших файлов и аномалии кодирования.

📊 Сравнение ядра

упражнятьсяВложение с тем же названиемИмя файла содержит разделитель путииллюстрировать
Запись непосредственно на диск с оригинальным именемПоследнее покрывает первоеЗапись может завершиться сбоем и даже вызвать угрозу безопасности.Легко потерять файлы незаметно
Назначайте независимые идентификаторы в порядке извлечения.Храните каждое вложение отдельноИсходное имя используется только как метаданные и не используется для записи пути.Оригинальное название все еще можно проследить

🎯 Какой метод подходит вам?

Если вам нужно проверить только небольшое количество обычных вложений

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

Если PDF-файл, который вы обрабатываете, может содержать вложения с тем же именем

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

Если вложений более 20 или имеется шифрование или подпись

Приостановите автоматизированный процесс и передайте его специальному рецензенту.

❓ Часто задаваемые вопросы (FAQ)

1. Почему одноимённый вложение нельзя записать напрямую на диск?

Файлы, написанные позже, перезапишут файлы, написанные ранее, что приведет к бесшумной потере содержимого.

2. Какие риски несет ../ в имени файла?

Прямая запись может дать сбой и даже вызвать угрозу безопасности. В статье рекомендуется отказаться от структуры каталогов и сохранить в качестве метаданных только имена файлов.

3. Содержимое вложения пустое или очень маленькое. Вы все еще хотите сохранить его?

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

4. Может ли этот код охватывать все функции вложений pypdf?

не могу. Это всего лишь логическая демонстрация, и такие ситуации, как исключения при потоковом чтении и кодировании больших файлов, необходимо рассматривать отдельно.

Критерии приемки и границы ручной проверки

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

Наблюдайте за явлениямиАвтоматическая обработкаРучная проверка
Несколько вложений с одинаковым именемДобавьте префикс серийного номера и сохраните весь контент.Подтвердите, является ли это итерацией версии или неправильным внедрением.
Имя файла содержит разделитель путиУдалите структуру каталогов и возьмите только имя файла.Проверьте, не планируется ли скрыть вредоносную полезную нагрузку
Содержимое вложения пусто или очень маленькое.Записаться, все равно сохранить файлОпределите, является ли это заполнителем или поврежден
Искаженные или непечатаемые символы в имени файла.Заменить подчеркиванием, сохранить индексВозврат исходной семантики подтверждения метаданных PDF
Тип вложения не соответствует расширениюПронюхать по содержимому или оставить как естьИспользование определяется экспертами в предметной области

Эта таблица подходит для проверки на уровне демонстрации кода. Сквозной эффект также необходимо сочетать с бизнес-контекстом. Например, отсутствие вложений к контракту может быть более серьезным, чем неправильное имя файла. Если количество вложений превышает 20 или имеется шифрование или подписи, автоматизированный процесс следует приостановить и передать на проверку специальному лицу.

Дальнейшее чтение

Следующий шаг

  • Добавление тестовых случаев синтетического вложения в конвейер CI;
  • Запустите сценарий извлечения очистки на выборке исторических документов доставки, чтобы установить базовый уровень целостности вложений;
  • Если обнаружены системные потери, отдайте приоритет конфликтам имен, а не проблемам с сетью или разрешениями.

Как совместить перевод документа перед сдачей

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

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

📝 Резюме

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

Попробуйте сейчас: загрузите документ, чтобы начать перевод, сохранив исходный макет.

Обновлено 2026-11-14