Есть ли в PDF-файле скрытые вложения? Инвентаризация встроенных файлов перед доставкой с помощью pypdf
В PDF-файл могут быть встроены вложения, а вложения с одним и тем же именем могут соответствовать нескольким частям контента. Инвентаризация с помощью pypdf перед доставкой: назначьте независимый идентификатор каждому вложению в порядке извлечения, оставьте исходное имя в качестве метаданных, не записывайте на диск, не выполняйте, не позволяйте клиентам получать посылку с недостающими деталями.
В PDF-файл могут быть вложения. Если они не проверяются перед доставкой, пакет документов, который получает клиент, может отсутствовать. Эта статья предназначена для разработчиков и специалистов по доставке документов, которым необходимо извлекать или проверять встроенные PDF-файлы в пакетном режиме. В нем объясняется, почему вложения с одинаковыми именами и ненормальными именами файлов могут привести к потере файлов без уведомления, а также как использовать pypdf для безопасного подсчета вложений.
Прочитав это, вы сможете сделать три вещи: назначить уникальный идентификатор каждому вложению, сохранить исходное имя в качестве метаданных, а не записывать его непосредственно на диск, и использовать форму принятия, чтобы различать случаи, которые могут обрабатываться автоматически, и те, которые требуют проверки вручную.
Все примеры в этой статье представляют собой синтетические образцы, и код прошел выборочную проверку в изолированной среде, но это не является гарантией всех реальных файлов или эффектов продукта. Пожалуйста, сохраняйте оригиналы, прежде чем обращаться с важными документами.
Как подсчитать вложения PDF перед доставкой? Вывод в одно предложение
Используйте pypdf, чтобы присвоить независимый идентификатор каждому вложению в порядке извлечения. Исходное имя сохраняется только в виде метаданных и не записывается непосредственно на диск. Исключения проверяются вручную согласно форме принятия.
| твоя ситуация | Рекомендуемые практики | причина |
|---|---|---|
| В PDF-файле могут быть вложения с таким же именем. | Назначайте независимые идентификаторы в порядке извлечения, сохраняйте весь контент. | Вложения с одинаковым именем сохраняются в виде списка. Написание напрямую по имени перезапишет друг друга. |
Имя файла содержит ../ или разделитель пути. | Удалите структуру каталогов и используйте в качестве метаданных только имя файла. | Прямая запись может потерпеть неудачу и даже создать угрозу безопасности. |
| Имеется много вложений или существует шифрование или подписи. | Приостановите автоматизированный процесс и передайте его специальному рецензенту. | Если имеется более 20 вложений или имеется шифрование или подписи, автоматические результаты требуют подтверждения вручную. |
| Перед поставкой необходимо подтвердить комплектность | Проверка по позициям по форме приемки | Автоматическое извлечение не может заменить ручную проверку перед доставкой. |
Почему вложение с таким же именем автоматически теряет файлы?
При обработке PDF-файлов со встроенными файлами наиболее скрытой проблемой является не ошибка, а отсутствие файлов после «успешного» выполнения процесса.
- При циклическом переборе
reader.attachmentsи записи непосредственно на диск с исходным именем, если в PDF-файл встроены два файла с именемreport.xlsx, последний перезапишет предыдущий. - Если имя файла содержит символы
../или зарезервированные системой, запись может завершиться неудачей и даже вызвать угрозу безопасности.
— В официальном документе pypdf указано, что имена вложений могут содержать любые символы, а вложения с тем же именем хранятся в виде списка.
Следовательно, любая несанкционированная логика пакетного извлечения будет ненадежной при обнаружении нестандартных PDF-файлов.
Создайте проверяемые входные данные о границах, используя синтетические образцы
Чтобы проверить надежность логики извлечения, необходимо создать контролируемые синтетические образцы, а не полагаться на производственные файлы неизвестного происхождения. В примере предполагается, что PDF-файл содержит три вложения:
- Обычный файл
data.csv; data.csvс тем же названием, что и первый, но с другим содержанием;- Имя файла содержит
..\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 или имеется шифрование или подписи, автоматизированный процесс следует приостановить и передать на проверку специальному лицу.
Дальнейшее чтение
- Официальная документация pypdf Handle Attachments
- Спецификация PDF 2.0, раздел 14.13 (связанные файлы)
Следующий шаг
- Добавление тестовых случаев синтетического вложения в конвейер CI;
- Запустите сценарий извлечения очистки на выборке исторических документов доставки, чтобы установить базовый уровень целостности вложений;
- Если обнаружены системные потери, отдайте приоритет конфликтам имен, а не проблемам с сетью или разрешениями.
Как совместить перевод документа перед сдачей
Декомпозиция файлов, шифрование или обработка вложений являются частью подготовки к доставке, и перевод не может заменить эти проверки. После сохранения исходной копии и списка обработки оцените порядок страниц, ссылки и целостность содержания перевода.
OmniDoc (портал продуктов) предоставляет многоформатный портал для перевода документов, а на официальном сайте представлены функции оптического распознавания символов, глоссария и двуязычного сравнения. Для команд, которые хотят начать работать непосредственно с файлами, этот путь можно оценить на реальных примерах. Используйте десенсибилизированные файлы, на загрузку которых у вас есть разрешение, и используйте элементы проверки в этой статье, чтобы просмотреть результаты. В этой статье не утверждается, что OmniDoc использует библиотеки с открытым исходным кодом или внутренние алгоритмы, описанные в статье, и примеры не могут заменить тестирование производительности продукта.
📝 Резюме
Ключом к подсчету вложений PDF перед доставкой является присвоение независимого идентификатора каждому вложению, сохранение исходного имени в качестве метаданных и проведение ручной проверки на предмет исключений. Проверьте процесс сначала на синтетических образцах, а затем на реальных документах.
Попробуйте сейчас: загрузите документ, чтобы начать перевод, сохранив исходный макет.


