Чи є вкладення приховані в 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 (портал продуктів) надає багатоформатний портал перекладу документів, а на офіційному веб-сайті представлені функції OCR, глосарій і двомовне порівняння. Для команд, які хочуть почати працювати безпосередньо з файлів, цей шлях можна оцінити за допомогою реальних зразків. Будь ласка, використовуйте десенсибілізовані файли, на завантаження яких у вас є дозвіл, і скористайтеся прапорцями в цій статті, щоб переглянути результати. У цій статті не стверджується, що OmniDoc використовує бібліотеки з відкритим кодом або внутрішні алгоритми в статті, і приклади не можуть замінити тестування продуктивності продукту.

📝 Підсумок

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

Спробуйте зараз: завантажте документ, щоб розпочати переклад, зберігаючи вихідний макет

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