نمونهٔ کامل قابل اجرا در گیتهاب موجود است:
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 و انتخابی را پنهان میکند. نامگذاری شدت در بازبینی کد از حذف بیصدا کلیدواژههایی که آرشیو شما هنوز به آنها نیاز دارد، جلوگیری میکند.
پیشنیازها
قبل از شروع، مطمئن شوید که موارد زیر را دارید:
- .NET 8 SDK
- GroupDocs.Metadata 26.8.0 (مجوز موقت)
- یک 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 است تنظیم کنید.
روش ۱ - بازرسی قبل از پاکسازی
با یک فهرست فقط‑خواندنی شروع کنید تا بدانید 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برای تولیدکنندگانی که فیلدها را بهصورت متفاوت برچسب میزنند - بدون تغییر: برای حالتهای dry‑run و تیکتهای پشتیبانی ایمن است
- فیلترهای مشترک: ایدههای مشابه را میتوانید بعداً در پیششرطهای حذف باز استفاده کنید
روش ۲ - پاکسازی تمام متادیتای شناساییشده
زمانی که PDF باید بدون هیچ ردپای نویسندگیای خارج شود، از Sanitize() استفاده کنید. این فراخوان بستههای شناختهشده را پاک میکند، شامل فیلدهای دیکشنری Info و XMP وقتی API آنها را شناسایی کند، سپس فایل جدید را ذخیره میکنید.
using var metadata = new Metadata(inputPath);
int removed = metadata.Sanitize();
Console.WriteLine(removed);
metadata.Save(outputPath);
نکات کلیدی:
- یک فراخوان: سطح تماس کوچک برای مسیرهای خروجی
- ثبت تعداد: اپراتورها میتوانند ورودیهای قبلاً تمیز را از پاکسازیهای بزرگ تشخیص دهند
- انتظار برچسبهای ابزار: پس از
Save، Creator/Producer ممکن است مقادیر Tool.Software موتور PDF را نشان دهند
بهترین زمان استفاده: دانلودهای شریک، لینکهای عمومی، تبادل بین مستاجران.
روش ۳ - حذف فقط ویژگیهای سبک 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 را ممنوع میکنند اما کلیدواژهها را اجازه میدهند.
چگونه پس از Save حذف Author را اثبات کنم؟
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 ۷ فیلد را حذف کرده یا ۰ چون فایل از ابتدا تمیز بوده است.
در نمونهٔ contract-with-metadata.pdf که فراهم شده، یک اجرای دارای مجوز معمولاً Author و Keywords را در بازرسی چاپ میکند، شمارش حذف Sanitize حدود ۷ و True از تأیید متمرکز بر Author میدهد. حذف انتخابی Author شمارش کوچکتری (حدود ۳) چاپ میکند در حالی که Title و Subject در بازرسی دوم قابل مشاهده میمانند.
منابع اضافی
- مورد استفاده: Sanitize در مقابل حذف نویسنده برای متادیتای PDF (.NET)
- مستندات: حذف تمام بستههای متادیتای شناساییشده
- مستندات: حذف ویژگیهای متادیتای خاص
- GitHub: strip-pdf-metadata-dotnet
- مرجع API
نتیجهگیری
پاکسازی متادیتای PDF در .NET تنها یک فراخوان API با نام مبهم نیست. برای پاکسازیهای خروجی Sanitize() را انتخاب کنید، برای مواردی که Title و Subject باید بمانند RemoveProperties را به کار ببرید، و همیشه پس از Save Author‑style فیلدها را بازرسی و تأیید کنید. مخزن نمونه را کلون کنید، آن را روی PDF قراردادی نمونه اجرا کنید، سپس همان روشها را همراه با لاگگیری تعداد حذفها در سرویس بارگذاری خود کپی کنید.