💡 Full working example available on GitHub:
office-metadata-pii-cleanup-nodejs
Introduction
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 iyi, ancak özellikler değil: dosya, tasarlayan kişiyi, son kaydeden meslektaşı, kurumsal şablondan departman yöneticisini ve SharePoint’ten geldiği için onaylayan kişiyi 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 içinde 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 geride ne kaldığını doğrulamak. Her adım birkaç satırdır ve tamamlanmış betik yüz satırın altındadır.
Why Metadata Sanitization Matters
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‑in sırasında iş akışı yolları, onaylayıcı kimlikleri ve içerik‑türü URI’ları ekler. Bu bilgiler belge okunurken ya da yazdırılırken görünmez, bu yüzden bir okuma hatası asla yakalanmaz.
Bunu elle değil Node.js ile yapmanın nedeni, bir betiğin sayısal sonuçlar döndürmesidir: 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 az belirgindir. Manuel temizlik, dosyayı işleyen kişi tarafından 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‑dizi listeleri, kuyruk üç dosya tutsa da üç bin dosya tutsa da aynı şekilde uygulanır.
Prerequisites
Paket, Java üzerinden Node.js çalıştırır; bu yüzden makinede Node ile birlikte bir Java çalışma zamanı bulunmalıdır.
Installation
npm install @groupdocs/groupdocs.metadata
Örnek proje, sürüm 26.7’ye kilitlenir ve nan paketini ^2.22.0 olarak ayarlayan bir overrides girdisi ekler; bu, mevcut Node sürümlerinde yerel bağlamanın 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.
Step 1 - Select properties by what they mean
Ö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 bu 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);
Key points:
- Dört etiket, kimlik grubunu kapsar: creator, editor, manager ve corporate company alanı.
- Title, Subject ve Keywords dokunulmaz; böylece bunlar üzerine kurulu 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 kapatın. Bağlayıcı dosyayı o ana kadar açık tutar; aksi takdirde bir döngü dosya tanıtıcılarını tüketir.
Step 2 - Select properties by name
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 builder, her alt‑dizi 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ı builder’ı 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‑dizi eşleşmesi kasıtlıdır: CommentsCount gibi isimleri Comment ile aynı anda yakalar, format başına tam isim listesi tutmaya gerek kalmaz.
Step 3 - Wipe everything when selectivity stops helping
Kuruluş dışına gönderilen 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 parçaları dahil, ve sayısı genellikle hedeflenen geçişlerin toplamını aşar. Ayrıca Title ve Subject’ı da alır; bu yüzden bir inceleme döngüsünden ziyade sınırda kullanılmalıdır.
Step 4 - Verify, because a silent miss looks like success
Tarama, findProperties aracılığıyla aynı spesifikasyonları yeniden kullanır; bu okuma‑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 filtresi yerinde bir seçimdir. Bu filtreyi, 0 olarak temizlenmiş bir revizyon sayacının tarama sırasında hayatta kalan bir özellik gibi raporlanmasını önlemek için ekledim.
Complete Working Example
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‑dışı 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 raporu, kimlik kuralı çalıştıktan sonra kalanları değil, yorum kuralının bulduklarını gösterir.
When should I run a targeted pass instead of sanitize()?
Belge hâlâ kullanımda iken. İnceleme yapanlar arasında dolaşan dosyalar, arama ve sınıflandırma için Title, Subject ve Keywords’e güvenir; sanitize() bu üçünü kişisel verilerle birlikte siler. İş 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ı gönderilen kopya için saklayın.
Real-World Applications
Upload handler
Bir Express rotası, ek dosyayı depolamadan önce temizler, etkilenen sayıları ticket’a kaydeder ve sızıntı listesi boş değilse yüklemeyi reddeder.
Nightly export job
Bir işçi, dışa aktarma 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.
Pre‑publication gate
Bir build adımı, yayın öncesi dokümantasyon eklerini sanitize() ile temizler; çünkü bu dosyalarda metadata’nın korunması gerekmez.
Best Practices and Tips
- Orijinali ihtilaf çözümü için saklamak amacıyla her zaman yeni bir yola yazın.
- Döngülerde özellikle
finallybloğunda metadata nesnesini kapatın. - Batch işlerde spesifikasyonları
.or()ile birleştirin; bir açma‑kaydetme dört kez açmaktan daha iyidir. - Her geçişte etkilenen sayıyı loglayın, sıfırları da dahil; tanınmayan bir format böylece fark edilir.
Troubleshooting Common Issues
The affected count is zero on a document you know is dirty
Girdi formatının tanındığını kontrol edin; okunamayan bir dosya da temiz bir dosya gibi sıfır döndürür.
The leak check reports properties you just removed
Tarama yolunu kaydedilen çıktı yoluna yönlendirin, giriş yoluna değil. Tarama, verilen dosyayı okur.
Comment balloons are still visible in Word
Yorum metni belge gövdesinde bulunur, metadata paketinde değil. GroupDocs.Metadata yorum‑ile‑ilişkili özellikleri temizler; balonları kaldırmak için Aspose.Words gibi bir içerik‑düzenleme kütüphanesi gerekir.
Conclusion
Dört adım, altı fonksiyon, ne yaptığını raporlayan bir betik. Etiket spesifikasyonları kimlik grubunu formatlar arasında yönetir, isim spesifikasyonları etiketlerin sınıflandırmadığı aileleri kapsar, sanitize() sınırı temizler ve sızıntı taraması tüm süreci bir kontrol haline 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.
Additional Resources
- Complete Node.js sample project on GitHub
- Step-by-step use case guide
- Removing metadata properties
- GroupDocs.Metadata for Node.js documentation
- API reference
- Free support forum