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


