💡 Tam çalışan örnek GitHub’da mevcuttur:
office-metadata-pii-cleanup-nodejs
Giriş
Bir yükleme uç noktası, bir çalışan tarafından gönderilen bir DOCX dosyasını alır ve bir müşteri talebine kaydeder. Metin doğru, ancak özellikler değil: dosya, taslağını hazırlayan kişiyi, son kaydettiği meslektaşı, kurumsal şablondan departman yöneticisini ve SharePoint’ten geldiği için onaylayanı adlandırır.
Bir metadata temizleyici, dosya depolanmadan önce bu özellikleri silen küçük bir betiktir ve ardından kendi çalışmasını kontrol eder. Bu öğreticide, GroupDocs.Metadata kullanarak Node.js’te dört adımda bir tanesini oluşturacağız: etiketle özellikleri seçmek, isimle seçmek, seçicilik işe yaramadığında her şeyi silmek ve geriye kalanları doğrulamak. Her adım birkaç satırdır ve tamamlanmış betik yüz satırın altındadır.
Metadata Temizliğinin Önemi Nedir?
Veri, kimse seçmeden birikir. Word, her kayıtta işletim sistemi hesabından Author ve LastSavedBy yazar, bir revizyon sayacı tutar, TotalEditingTime izler ve LastPrinted kaydeder. Belge sunucuları, kontrol akışı yolları, onaylayıcı kimlikleri ve içerik türü URI’larını giriş sırasında ekler. Bu bilgiler belge okunurken ya da yazdırılırken görünmez, bu yüzden bir okuma hatasını asla yakalamaz.
Bunu elle değil Node.js ile yapmanın nedeni, bir betiğin sayısal geri bildirim vermesidir: her kaldırma çağrısı kaç özellik sildiğini raporlar ve bu sayı bir loga yazılabilir, bir testte doğrulanabilir veya belgenin ait olduğu kayda eklenebilir.
İkinci bir neden de vardır; toplu iş çalıştırılana kadar bu daha belirgindir. Manuel temizlik, dosyayı işleyen kişi tarafından dosya başına bir kez karar verilir, bu yüzden aynı tür belgeyi temizleyen iki kişi farklı sonuçlar üretir. Bir betik kuralı tek bir yerde sabitler: aynı dört etiket, aynı alt dize listeleri, kuyruk üç dosya tutsa da üç bin dosya tutsa da aynı şekilde uygulanır.
Önkoşullar
Paket, Java üzerinden Node.js olduğundan, makinede Java çalışma zamanı ile birlikte Node gereklidir.
Kurulum
npm install @groupdocs/groupdocs.metadata
Örnek proje, sürüm 26.7’yi sabitler ve nan paketini ^2.22.0 olarak ayarlayan bir overrides girdisi ekler; bu, yerel bağlayıcının mevcut Node sürümlerinde derlenmesini sağlar. Lisans dosyası olmadan kütüphane değerlendirme modunda çalışır; bu, burada anlatılan tüm adımları takip etmek için yeterlidir.
Adım 1 – Özellikleri Anlamına Göre Seçme
Özellik adları formatlar ve paketler arasında farklılık gösterir, bu yüzden ilk kural etiketlere göre eşleşir. ContainsTagSpecification bir etiket alır ve o etiketi taşıyan herhangi bir özelliği eşleştirir; .or() ise spesifikasyonları tek bir yapı içinde birleştirir.
const T = groupdocs.Tags;
const spec = new groupdocs.ContainsTagSpecification(T.getPerson().getCreator())
.or(new groupdocs.ContainsTagSpecification(T.getPerson().getEditor()))
.or(new groupdocs.ContainsTagSpecification(T.getPerson().getManager()))
.or(new groupdocs.ContainsTagSpecification(T.getCorporate().getCompany()));
const affected = metadata.removeProperties(spec);
metadata.save(outputPath);
Temel noktalar:
- Dört etiket, kimlik grubunu kapsar: oluşturucu, düzenleyici, yönetici ve kurumsal şirket alanı.
- Başlık, Konu ve Anahtar Kelimeler dokunulmaz; böylece bunları anahtar alan olarak kullanan bir kayıt indeksi çalışmaya devam eder.
removePropertiesbir boolean yerine etkilenen sayıyı döndürür.
Bütün işlemi try/finally içinde metadata.close() ile finally bloğunda sarın. Bağlayıcı dosyayı o ana kadar açık tutar; aksi takdirde bir döngü tutamaç sayısını tüketir.
Adım 2 – Özellikleri İsimle Seçme
Yorum dizileri, revizyon sayacı ve sunucu alanları etiket taşımaz. Bunlar için WithNameSpecification(needle, false) adı içinde needle geçen herhangi bir özelliği eşleştirir ve dört satırlık bir oluşturucu her alt dize için bir zincir oluşturur:
let spec = null;
for (const needle of needles) {
const s = new groupdocs.WithNameSpecification(needle, false /* fullMatch */);
spec = spec ? spec.or(s) : s;
}
return spec;
Üç geçiş, farklı listelerle aynı oluşturucuyu yeniden kullanır. Yorumlar ilk olarak işlenir:
const affected = metadata.removeProperties(
nameContainsSpec(['Comment', 'Reviewer', 'Reviewed']));
metadata.save(outputPath);
Düzenleme zaman çizelgesi, genellikle unutulan grup olup belgenin nasıl üretildiğini tanımlar:
const affected = metadata.removeProperties(nameContainsSpec([
'Revision', 'TrackedChange', 'LastPrinted', 'TotalEditingTime', 'EditTime',
]));
metadata.save(outputPath);
SharePoint geçişi aynı çağrıyı Server, Workflow, Approver, ContentType ve Template ile yapar. Alt dize eşleştirme kasıtlıdır: CommentsCount gibi bir ismi Comment ile aynı anda yakalar ve format başına tam isim listesi tutmaya gerek kalmaz.
Adım 3 – Seçicilik Yardımcı Olmadığında Her Şeyi Silme
Kuruluş dışına çıkan kopya için bir çağrı dört geçişi yerine geçer:
const affected = metadata.sanitize();
metadata.save(outputPath);
sanitize() kütüphanenin algıladığı tüm metadata paketlerini temizler; özel OOXML bölümleri de dahildir ve sayısı genellikle hedeflenen geçişlerin toplamını aşar. Ayrıca Başlık ve Konu’yu da alır; bu yüzden bir inceleme döngüsünden ziyade sınırda kullanılmalıdır.
Adım 4 – Doğrulama, Çünkü Sessiz Bir Kaçırma Başarı Gibi Görünür
Tarama, findProperties aracılığıyla aynı spesifikasyonları yeniden kullanır; bu okuma yapar, yazma yapmaz. Sonuç bir Java koleksiyonudur, bu yüzden indeksle dolaşılır:
const props = metadata.findProperties(tagSpec.or(nameSpec));
for (let i = 0; i < props.getCount(); i++) {
const p = props.get_Item(i);
const val = p.getValue && p.getValue();
const value = val ? String(val.getRawValue ? val.getRawValue() : val) : '';
if (!value || value === '0' || value === '0.0') continue;
leaks.push(`${p.getName()}=${value}`);
}
Boş ve sıfır filtrelemesi yerinde bir adımdır. Ben, revizyon sayacının 0‘a temizlendiği bir çalışmadan sonra bu filtreyi ekledim; tarama, hayatta kalan bir özellik olarak bunu doğru bir şekilde raporladı.
Tam Çalışan Örnek
Depo, altı fonksiyonu index.js içinde birleştirir; lisansı uygular, her geçişi resources/pii-sample.docx üzerinde çalıştırır, her çıktı dosyasının varlığını doğrular ve sonunda sızıntı listesinin boş olduğunu teyit eder. Başarısız bir doğrulama, sıfır olmayan bir kodla çıkar; böylece bütün süreç CI içinde bir kontrol olarak çalışır, sadece okunacak bir demo değil.
Kendi sürümünüzde kopyalamanız gereken bir detay: her geçiş aynı kaynak dosyayı okur ve ayrı bir çıktı yazar; temizlenmiş bir dosyayı bir sonrakine zincirlemez. Bu, etkilenen sayıları bağımsız tutar; böylece yorum geçişi için log satırı, kimlik kuralı çalıştıktan sonra geriye ne kaldığını değil, yorum kuralının ne bulduğunu gösterir.
Hedeflenmiş Bir Geçişi sanitize() yerine Ne Zaman Çalıştırmalıyım?
Belge hâlâ kullanımda iken. İnceleyenler arasında dolaşan dosyalar, arama ve sınıflandırma için Başlık, Konu ve Anahtar Kelimelere güvenir; sanitize() bu üçünü kişisel verilerle birlikte kaldırır. İş birliği sırasında kimlik ve yorum geçişlerini çalıştırın, tanımlayıcı alanları koruyun ve tam temizlemeyi gerçekten dışarı çıkan kopya için saklayın.
Gerçek Dünya Uygulamaları
Yükleme İşleyicisi
Bir Express rotası, ek dosyayı depolamaya yazmadan önce temizler, etkilenen sayıları talebe kaydeder ve sızıntı listesi boş değilse yüklemeyi reddeder.
Gece Export İşi
Bir çalışan, export klasörünü dolaşır, kimlik ve sunucu geçişlerini uygular ve bir belge hâlâ PII rapor ediyorsa işi başarısız sayar; sadece bir uyarı loglamaz.
Yayına Öncesi Kapı
Bir build adımı, dokümantasyon eklerini sürümden önce temizler; çünkü bu dosyalarda metadata korunmasına ihtiyaç yoktur, sanitize() kullanılır.
En İyi Uygulamalar ve İpuçları
- Orijinali ihtilaf çözümü için korumak amacıyla her zaman yeni bir yola yazın.
- Özellikle döngülerde
finallybloğunda metadata nesnesini kapatın. - Batch işlerde spesifikasyonları
.or()ile birleştirin; bir açık ve bir kaydetme, dört ayrı işlemden daha iyidir. - Her geçiş için etkilenen sayıyı loglayın, sıfırları da dahil; böylece tanınmayan bir format görünür hâle gelir.
Yaygın Sorunların Çözümü
Etkilenen sayısı, kirli olduğunu bildiğiniz bir belgede sıfır
Giriş formatının tanındığını kontrol edin; okunamayan bir dosya da temiz bir dosya gibi sıfır döndürür.
Sızıntı kontrolü, az önce kaldırdığınız özellikleri rapor ediyor
Tarama, giriş yolunu değil, kaydedilmiş çıktı yolunu kullandığından emin olun. Tarama, verilen dosyayı okur.
Word’de yorum balonları hâlâ görünüyor
Yorum metni belge gövdesinde bulunur, metadata paketinde değil. GroupDocs.Metadata yorumla ilgili özellikleri temizler; balonların kendisini kaldırmak için Aspose.Words gibi bir içerik düzenleme kütüphanesi gerekir.
Sonuç
Dört adım, altı fonksiyon, ne yaptığını raporlayan tek bir betik. Etiket spesifikasyonları kimlik grubunu formatlar arasında yönetir, isim spesifikasyonları sınıflandırılamayan aileleri kapsar, sanitize() sınırı ele alır ve sızıntı taraması tüm süreci bir kontrol hâline getirir. Depoyu klonlayın, gerçek bir inceleme turundan geçmiş bir belge üzerinde çalıştırın ve pipeline’ınızın hangi geçişlere ihtiyacı olduğuna karar vermeden önce sayıları inceleyin.