مثال عملي كامل متاح على GitHub:
strip-pdf-metadata-dotnet
المقدمة
تنظيف بيانات التعريف في ملفات PDF هو سير عمل GroupDocs.Metadata لـ .NET يقوم بمسح قاموس معلومات 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
تحتاج مشاركات الملفات الخارجية، والتنزيلات متعددة المستأجرين، والأرشيفات المنظمة إلى واجهة برمجة تطبيقات لإزالة البيانات بشكل قابل للتكرار بدلاً من نقرة على سطح المكتب. هذه المقاربة ذات قيمة خاصة لـ:
- بوابات الشركاء: مسح كامل قبل أن يعبر 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.
الطريقة 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);
نقاط رئيسية:
- نداء واحد: سطح صغير للمسارات الخارجية
- سجل العدد: يمكن للمشغلين ملاحظة المدخلات النظيفة مسبقًا مقابل المسحات الكبيرة
- توقع طوابع الأدوات: بعد
Saveقد تظهر قيم Creator/Producer كقيم Tool.Software لمحرك PDF
الأفضل عندما: تنزيلات الشركاء، الروابط العامة، تبادل عبر المستأجرين.
الطريقة 3 – إزالة خصائص نمط المؤلف فقط
عندما لا يزال 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 لكن تسمح بالكلمات المفتاحية.
كيف أثبت إزالة 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 حتى تتمكن من رؤية الفحص، والمسح الكامل، والإزالة الانتقائية، والتحقق في تشغيل وحدة تحكم واحد.
الأخطاء الشائعة
- الاعتماد على أداة تنظيف المتصفح فقط: غالبًا ما يبقى 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 العقدي المضمن، ثم انسخ نفس الأساليب إلى خدمة التحميل الخاصة بك مع تسجيل عدد الحذف.