💡 Tam çalışan örnek GitHub’da mevcuttur:
scrub-office-document-pii-dotnet

Eski Yöntem Acı Vericiydi

İş akışı şu şekilde ilerler. Belgeyi açın, Dosya, Bilgi, Sorunları Kontrol Et, Belgeyi İncele, kutucukları işaretleyin, Hepsini Kaldır, yeni bir adla kaydedin, kapatın, bir sonrakini açın. Kırk dosya sonra birisi, Belgeyi İncele’nin aynı zamanda kayıtların indeks anahtarlarını taşıyan Başlığı da sildiğini ve bir saat önce gönderilen kopyanın hâlâ bir SharePoint onaylayıcı kimliği taşıdığını fark eder; çünkü dosya, alanı geri yazan farklı bir uygulamadan kaydedilmişti.

Metadata PII kaldırma, .NET için GroupDocs.Metadata yeteneği olup, Office belgelerindeki kimlik bilgisi içeren özellikleri programlı olarak siler ve ardından geriye ne kaldığını raporlar. Manuel prosedür üç açıdan başarısızdır: birkaç dosyanın ötesine ölçeklenemez, hangi alanların silineceği konusunda “hepsi ya da hiçbiri” yaklaşımını benimser ve neyin kaldırıldığına dair bir kayıt üretmez. Bu makale, aynı işi .NET sürümüyle, bir özellik grubu başına bir seferde gösterir.

İçeride gerçekte ne olduğunu bilmek faydalıdır. Bir inceleme turundan geçmiş bir Word dosyası genellikle kaydeden kişinin Windows hesabından gelen Author ve LastSavedBy, kurumsal şablondan gelen Manager ve Company, bir revizyon sayacı, TotalEditingTime, bir LastPrinted zaman damgası ve yorum dizileri için sayaçlar taşır. Zincire SharePoint eklenirse onaylayıcı kimlikleri, iş akışı yolları, içerik türü URI’ları ve belgenin oluşturulduğu şablon da eklenir. Bunların hiçbiri sayfada görünmez ve hepsi aynı dosyada taşınır.

Daha İyi Bir Yol Var

GroupDocs.Metadata for .NET’teki her şey tek bir özellik arama motoru üzerinden çalışır. RemoveProperties, MetadataProperty üzerinde bir lambda alır, lambda tarafından kabul edilen her özelliği siler ve silinen sayıyı döndürür. FindProperties aynı lambayı yazarak çalıştırmaz. Özellikler ayrıca etiketler taşır, bu yüzden Tags.Person.Creator format ve paketler arasında yazar adı benzeri alanları, üretici uygulamaya göre değişen literal adları eşleştirmek yerine tanımlar.

Bu, tek bir düğme yerine üç temizlik şekli sunar: kimlik alanları için bir etiket geçişi, yorumlar ve revizyonlar gibi aileler için ad geçişleri ve hiçbir şeyin kalmaması gerektiğinde Sanitize(). Üçü de sayı döndürür ve bu sayılar geçişin denetlenebilir olmasını sağlar.

Yeni Yol: Özellik Grubu Başına Bir Koşul

Adım 1 - İsimleri Temizle

Dört etiket kontrolü kimlik grubunu kapsar. Açıklayıcı alanlar dokunulmaz, bu da Document Inspector’ın Hepsini Kaldır seçeneğinden farkıdır:

using (var metadata = new Metadata(inputPath))
{
    if (metadata.FileFormat == FileFormat.Unknown) return 0;
    var affected = metadata.RemoveProperties(p =>
        p.Tags.Contains(Tags.Person.Creator) ||
        p.Tags.Contains(Tags.Person.Editor) ||
        p.Tags.Contains(Tags.Person.Manager) ||
        p.Tags.Contains(Tags.Corporate.Company));
    metadata.Save(outputPath);
    return affected;
}

FileFormat.Unknown kontrolü, sıfırın dürüst kalmasını sağlayan korumadır: olmasaydı okunamayan bir dosya ve temiz bir dosya çağırıcıya aynı görünürdü.

Adım 2 - Çevresindeki Aileleri Temizle

Yorumlar, revizyonlar ve sunucu alanları etiket taşımaz, bu yüzden koşul isimleriyle eşleşir. Düzenleme zaman çizelgesi en sık unutulan gruptur ve bir belgenin nasıl üretildiğini söyleyen grup budur:

using (var metadata = new Metadata(inputPath))
{
    if (metadata.FileFormat == FileFormat.Unknown) return 0;
    var affected = metadata.RemoveProperties(p =>
        p.Name != null && (
            p.Name.Contains("Revision") ||
            p.Name.Contains("TrackedChange") ||
            p.Name.Contains("LastPrinted") ||
            p.Name.Contains("TotalEditingTime") ||
            p.Name.Contains("EditTime")));
    metadata.Save(outputPath);
    return affected;
}

Alt dize eşleştirme kasıtlıdır: CommentsCount ile Comment, TotalEditingTime ile EditTime aynı anda yakalanır, format başına tam ad listesi tutmaya gerek kalmaz. SharePoint geçişi aynı çağrıya Server, Workflow, Approver, ContentType ve Template eklenerek yapılır.

Adım 3 - Her Şeyi Sil, Sonra Sonucu Kontrol Et

Güven sınırında, tek bir çağrı dört geçişi yerine geçirir:

using (var metadata = new Metadata(inputPath))
{
    if (metadata.FileFormat == FileFormat.Unknown) return 0;
    var affected = metadata.Sanitize();
    metadata.Save(outputPath);
    return affected;
}

Ardından manuel prosedürün karşılığı olmayan kısım gelir. Doğrulama taraması, kaldırma koşullarını FindProperties aracılığıyla yeniden kullanır ve hayatta kalanları iki listeye ayırır:

foreach (var p in props)
{
    var value = p.InterpretedValue?.ToString() ?? p.Value?.ToString() ?? string.Empty;
    if (string.IsNullOrWhiteSpace(value)) continue;
    if (value == "0" || value == "0.0") continue;

    var entry = $"{p.Name}={value}";
    var name = p.Name ?? string.Empty;
    if (name.StartsWith("Comment") || name.StartsWith("Revision"))
        report.ContentLevelLeaks.Add(entry);
    else
        report.MetadataLeaks.Add(entry);
}

MetadataLeaks boş olmalıdır; aksi takdirde dosya temizlenmiş sayılmaz. ContentLevelLeaks bilgilendirme amaçlıdır: Word yorumları ve izlenen değişiklik yazarları word/document.xml içinde bulunur, bu da gövde içeriğidir ve bu alanların temizlenmesi bir metadata API’si yerine Aspose.Words gibi bir içerik‑düzenleme kütüphanesi gerektirir.

Neden Her Şeyde Sanitize() Çağırmıyorsunuz?

Çünkü çoğu belge hâlâ kullanımda. Sanitize() tespit edilen her paketi temizler; bu da Başlık, Konu ve Anahtar Kelimeler gibi kayıt sistemi ve arama indeksi tarafından kullanılan alanları da siler. Dosya dahili olarak dolaşırken hedefli geçişleri kullanın, açıklayıcı metadata’nın çalışmasını sürdürün ve organizasyondan dışarı çıkan kopya için tam temizlemeyi ayırın.

Yan Yana: Önce ve Sonra

Manuel denetim GroupDocs.Metadata for .NET
Seçicilik Hepsini Kaldır, açıklayıcı alanlar dahil özellik grubu başına bir koşul
Kapsam iletişim kutusunun gösterdiği alanlar kütüphanenin tespit ettiği her paket, özel OOXML bölümleri dahil
Kayıt yok işlem başına döndürülen etkilenen sayısı
Doğrulama yeniden aç ve bak FindProperties taramasıyla metadata ve içerik‑seviyesi listeler
200 dosyalık toplu işlem 200 tıklama bir döngü, beş işlem, dosya başına bir log satırı

Davranışı değiştiren satır kayıttır. Her geçiş bir sayı döndürdüğünde, temizleme bir adım olarak hatırlanmaz, bir veri haline gelir; testte bir eşik, denetim tablosunda bir alan, gece işi başarısız eden bir koşul olur. Bu, manuel bir rutinin hiçbir disiplin seviyesinde üretemeyeceği satırdır.

Gerçek Dünya Örneği: Gönderim Öncesi Kanca

Bir destek portalı, personelin belgeyi müşteri taleplerine eklemesine izin verir. Ek işleyicisi artık kimlik geçişi ve sunucu geçişini dosya depolanmadan önce çalıştırır, her iki sayıyı da talebe kaydeder ve kaydedilen kopyada sızıntı kontrolü yapar. Boş olmayan bir metadata‑sızıntı listesi, hatalı özelliği adlandıran bir mesajla yüklemeyi reddeder; böylece dosyayı ekleyen kişi sorunu hemen görür, müşteriye ulaşmadan önce.

Bu kancayı pratik yapan iki detay vardır. Geçişler yeni bir yola yazar, böylece orijinal personelin kendi depolama alanında kalır ve otomatik bir adım hiçbir şeyi yok etmez. Sayılar ise ekin yanına talep kaydına konur; bu da “bu belgede ne kaldırıldı” sorusunun bir sayı olarak saklanması demektir, pipeline’ın genellikle ne yaptığına dair bir varsayım değil.

İlk kez bu kontrolü gerçek bir şablonda denediğimde, Manager değerinin kimlik geçişi tarafından saniyeler önce kaldırıldığını ve kurumsal şablonun kaydetme sırasında hemen geri yazdığını gördüm. Kaldırma çağrısı belgelenen şekilde çalışıyordu; sorun çevresindeki pipeline’daydı ve sadece geri okuma bunu ortaya çıkardı.

GroupDocs.Metadata ile Başka Ne Yapabilirsiniz?

Aynı koşul motoru okunur. Bir belgenin iki sürümü arasındaki özellikleri karşılaştırmak, sahiplik değişikliklerini ve inceleme süreci dışındaki yeniden yazarları ortaya çıkarır; ayrıca metadata temizleme genel bakışı etkileşimli bir aracın hâlâ bir API‑güdümlü geçişin yanında nerede durduğunu açıklar. Etiket sistemi formatları kapsadığı için burada yazılan kimlik koşulu, PDF, görüntü ve ses dosyalarına da değişiklik yapmadan uygulanabilir.

Bu taşınabilirlik planlamaya değerdir. MetadataProperty üzerine bir lambda olarak yazılan temizlik kuralı sıradan C#’dır, bu yüzden ortak bir kütüphanede yaşatılabilir, fixture belgelerle birim test edilebilir ve ihtiyacı olan herhangi bir hizmet tarafından uygulanabilir: bir dışa aktarma uç noktası, zamanlanmış kayıt işi veya sürüm öncesi dokümantasyon eklerini temizleyen bir derleme adımı. Kurallar tek bir yerde kalır; sadece çağrı noktaları değişir.

Sonuç

Dört hedefli geçiş, bir tam temizleme, bir doğrulama taraması. Bu set, Office belgeleri için pratik aralığı kapsar: dosya dolaşımdayken açıklayıcı metadata’yı tutun, dışarı çıkarken her şeyi temizleyin ve her iki durumda da sonucu kanıtlayın. Örneği klonlayın, gerçek bir inceleme turundan geçmiş bir belgeye çalıştırın ve etkilenen sayıları okuyun. Genellikle beklenenden daha yüksek olur; bu da asıl amacın kendisidir.

Ek Kaynaklar