Full working example available on GitHub:
strip-pdf-metadata-dotnet
Вступ
Очищення метаданих PDF — це робочий процес GroupDocs.Metadata для .NET, який видаляє словник Info PDF та поля ідентифікації XMP у C# сервісах. Коли контрактний PDF покидає внутрішній диск, поля Author, Creator, Producer, Keywords та пакети XMP часто залишаються разом із ним. Очищувачі в браузері та швидка перевірка в Acrobat можуть виглядати успішними, хоча XMP все ще містить ім’я оригінального автора. Я зіткнувся з цією проблемою, коли «очищений» чернетка все ще показувала Alice Example у полі Author після того, як партнер відкрив файл у іншому переглядачі.
GroupDocs.Metadata для .NET надає C# сервісам два чітких рівня очищення того ж об’єкта Metadata: Sanitize() для повного видалення виявлених пакетів і RemoveProperties, коли Title і Subject мають залишитися, а ідентифікація особи — ні. У цій статті порівнюються обидва підходи разом із кроками інспекції та перевірки, які роблять результат аудиторським.
Ви отримаєте робочі приклади для .NET 8, правило прийняття рішення щодо очищення для вихідних файлів проти архівних, а також предикат перевірки, який перевіряє Author / Person.Creator замість того, щоб панікувати через відбитки Creator/Producer PDF‑движка після Save.
Чому важливе очищення метаданих PDF
Для зовнішніх спільних файлів, багатокористувацьких завантажень та регульованих архівів потрібен повторюваний API видалення метаданих, а не клік у настільному застосунку. Такий підхід особливо цінний для:
- Портали партнерів: Повне видалення перед тим, як PDF перейде межу довіри
- Пошук записів: Зберегти Title/Subject, видаливши поля типу Author
- Реагування на інциденти: Довести, що Author видалено після помилкового поширення
- CI‑ворота: Припинити збірку, коли перевірка повертає false
Однорядкова політика («видалити метадані») приховує вибір між Sanitize та селективним підходом. Позначення інтенсивності в код‑рев’ю запобігає тихому надмірному видаленню Keywords, які все ще потрібні вашому архіву.
Передумови
- .NET 8 SDK
- GroupDocs.Metadata 26.8.0 (temporary license)
- PDF, який все ще містить поля Info та/або ідентифікаційні поля XMP
- Visual Studio 2022 або VS Code (необов’язково)
Встановлення
Встановіть GroupDocs.Metadata через NuGet:
dotnet add package GroupDocs.Metadata --version 26.8.0
Або відновіть з .csproj зразка проекту. Для необмеженого Save встановіть змінну середовища LIC_METADATA_VALID у папку, що містить GroupDocs.Metadata.Product.Family.lic.
Метод 1 — Інспекція перед очищенням
Почніть з лише‑читального переліку, щоб знати, які поля фактично містить PDF. Інструменти браузера часто пропускають XMP; цей перелік є базовим для порівняння до/після.
using var metadata = new Metadata(inputPath);
var properties = metadata.FindProperties(p =>
p.Tags.Contains(Tags.Person.Creator) ||
p.Tags.Contains(Tags.Tool.Software) ||
p.Tags.Contains(Tags.Content.Title) ||
p.Tags.Contains(Tags.Content.Subject) ||
string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase) ||
string.Equals(p.Name, "Creator", StringComparison.OrdinalIgnoreCase) ||
string.Equals(p.Name, "Producer", StringComparison.OrdinalIgnoreCase) ||
string.Equals(p.Name, "Keywords", StringComparison.OrdinalIgnoreCase));
foreach (var property in properties)
{
Console.WriteLine($"{property.Name} = {property.Value}");
}
Ключові моменти:
- Теги та імена: Поєднуйте перевірки тегів з порівняннями
Author/Keywordsдля виробників, які позначають поля по‑різному - Без зміни: Безпечно для режиму сухого запуску та запитів підтримки
- Спільні фільтри: Пізніше використовуйте ті ж ідеї у предикатах видалення
Метод 2 — Sanitize всіх виявлених метаданих
Використовуйте Sanitize(), коли PDF має залишити без слідів авторства. Виклик очищає розпізнані пакети, включаючи поля словника Info та XMP, якщо API їх виявляє, після чого ви зберігаєте новий файл.
using var metadata = new Metadata(inputPath);
int removed = metadata.Sanitize();
Console.WriteLine(removed);
metadata.Save(outputPath);
Ключові моменти:
- Один виклик: Малий поверхневий код для вихідних шляхів
- Логувати кількість: Оператори можуть розрізнити вже чисті вхідні файли та великі очищення
- Очікувати штампи інструментів: Після
SaveCreator/Producer можуть показувати значення Tool.Software PDF‑движка
Краще підходить: завантаження партнерами, публічні посилання, обмін між орендарями.
Метод 3 — Видалити лише властивості типу author
Коли Title, Subject та Keywords все ще використовуються для пошуку, видаліть ідентифікацію особи за допомогою RemoveProperties замість повного стирання всіх пакетів.
using var metadata = new Metadata(inputPath);
int removed = metadata.RemoveProperties(p =>
p.Tags.Contains(Tags.Person.Creator) ||
p.Tags.Contains(Tags.Person.Editor) ||
string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase) ||
string.Equals(p.Name, "Creator", StringComparison.OrdinalIgnoreCase) ||
string.Equals(p.Name, "Producer", StringComparison.OrdinalIgnoreCase));
Console.WriteLine(removed);
metadata.Save(outputPath);
Ключові моменти:
- Предикат підлягає рев’ю: При код‑рев’ю можна точно побачити, які поля ідентифікації видаляються
- Описові поля залишаються: Title/Subject/Keywords залишаються з цим прикладом фільтра
- Той самий SDK: Не потрібна друга бібліотека для селективного шляху
Краще підходить: внутрішні архіви, циркулюючі чернетки, політики, які забороняють Author, але дозволяють keywords.
Як довести видалення Author після Save?
Відкрийте очищений PDF знову і шукайте лише Author / Person.Creator / Person.Editor. Виведіть True, коли їх не залишилося. Не розглядайте залишкові відбитки Creator/Producer Tool.Software як невдале стирання — Save може переписати їх назвою PDF‑движка. Це розрізнення забезпечує чесність перевірок відповідності в CI та запобігає хибним тривогам, коли движок ставить власні поля інструменту.
using var metadata = new Metadata(inputPath);
var leftovers = metadata.FindProperties(p =>
p.Tags.Contains(Tags.Person.Creator) ||
p.Tags.Contains(Tags.Person.Editor) ||
string.Equals(p.Name, "Author", StringComparison.OrdinalIgnoreCase));
Console.WriteLine(!leftovers.Any());
Ключові моменти:
- Ставте правильне питання: «Чи видалено Author?» а не «Чи порожній Creator?»
- Друге відкриття: Перевірка після
Save, а не лише в пам’яті - CI‑дружній: Одне булеве значення для тестів та логів
Вибір між Sanitize та RemoveProperties
| Питання | Віддати перевагу Sanitize | Віддати перевагу RemoveProperties |
|---|---|---|
| Файл виходить за межі компанії? | Так | Тільки якщо описові поля мають залишитися |
| Пошук в архіві потребує Title? | Ні | Так |
| Політика говорить «без людей у метаданих»? | Будь-який, потім перевірка | Так, з предикатом, орієнтованим на особу |
| Оператор хоче одну кнопку? | Так | Обгорнути у названий маршрут |
strip-pdf-metadata-dotnet — це виконуваний .NET‑демо, який з’єднує всі чотири кроки з Resources/contract-with-metadata.pdf, щоб ви могли побачити інспекцію, Sanitize, селективне видалення та перевірку в одному запуску консолі.
Поширені помилки
- Довіряти лише очищувачу браузера: XMP часто виживає.
- Перевірка імен Creator/Producer: Відбитки движка після
Saveвикликають хибні помилки. - Один предикат назавжди: Переглядайте назви полів ідентифікації, коли з’являються нові виробники.
- Пропуск налаштування ліцензії для Save: Режим оцінки може блокувати необмежені записи; встановіть
LIC_METADATA_VALIDдля повних тестів конвеєра. - Пропуск інспекції: Без попереднього переліку ви не зможете визначити, чи Sanitize видалив 7 полів чи 0, оскільки файл вже був чистим.
У зразку contract-with-metadata.pdf, ліцензований запуск зазвичай виводить Author і Keywords під час інспекції, кількість видалень Sanitize близько 7 та True у перевірці, орієнтованій на Author. Селективне видалення автора виводить меншу кількість (близько 3), тоді як Title і Subject залишаються видимими під час другої інспекції.
Додаткові ресурси
- Випадок використання: Sanitize проти видалення автора для метаданих PDF (.NET)
- Документи: видалити всі виявлені пакети метаданих
- Документи: видалити конкретні властивості метаданих
- GitHub: strip-pdf-metadata-dotnet
- Посилання на API
Висновок
Очищення метаданих PDF у .NET — це не один виклик API з розмитою назвою. Обирайте Sanitize() для зовнішніх стирань, RemoveProperties, коли Title і Subject мають залишитися, і завжди інспектуйте, а потім перевіряйте поля типу Author після Save. Клонуйте репозиторій з прикладами, запустіть його на зразковому PDF‑контракті, а потім скопіюйте ті ж методи у ваш сервіс завантаження з логуванням кількості видалень.