Eski Yöntem Acı Vericiydi
Bir uyumluluk görevlisinin, paylaşılan bir sürücüdeki her sözleşmenin “CONFIDENTIAL” kelimesini ve şirket logosunu her sayfada taşıdığını doğrulama göreviyle karşı karşıya olduğunu hayal edin. Mevcut süreç şu şekildedir:
- Bir dosyayı görüntüleyicide açın.
- Her sayfayı dolaşarak ifadeyi veya görüntüyü arayın.
- Notları bir elektronik tabloya kaydedin.
- Binlerce PDF, Word dosyası ve sunum için tekrarlayın.
Tek bir kaçırılan filigran, maliyetli bir incelemeyi tetikleyebilir ve manuel çaba, küçük bir ekip için haftada 8 saat kolayca aşabilir. Ayrıca, döndürülmüş metin, bölünmüş kelimeler veya görüntü olarak kaydedilmiş logolar genellikle insan gözünden kaçar ve organizasyonu savunmasız bırakır.
Daha İyi Bir Yöntem Var
GroupDocs.Watermark for .NET, her tahmin adımını ortadan kaldırır. Format‑bağımsız motoru, 100’den fazla belge türünü okuyabilir, metin, görüntü ve hatta biçimlendirilmiş filigranları bulabilir ve ilgili tüm meta verileri temiz bir API aracılığıyla ortaya çıkarır. Aşağıdaki öğretici, birkaç özlü kod parçacığının manuel döngüyü otomatik, tekrarlanabilir bir iş akışıyla nasıl değiştirdiğini gösterir.
Önkoşullar
- .NET 6.0 veya üzeri.
- GroupDocs.Watermark NuGet paketi (
dotnet add package GroupDocs.Watermark). - (İsteğe bağlı) geçici bir lisans – bu makalenin sonundaki bağlantıya bakın.
Yeni Yöntem: Otomatik Filigran Denetimi
Aşağıda dört temel işlemi adım adım inceleyeceğiz. Her blok, bir konsol uygulamasına, CI adımına veya arka plan hizmetine ekleyebileceğiniz bağımsız bir örnektir.
Adım 1 – Tüm Filigranları Tara
İlk olarak tam bir envantere ihtiyacımız var. Search() yöntemi, her bir girişin metin (veya görüntü), konum, dönüş, sayfa numarası ve ham görüntü boyutunu içerdiği bir koleksiyon döndürür.
using (var wk = new Watermarker(filePath))
{
var all = wk.Search();
Console.WriteLine($"Found {all.Count} watermark(s) in " +
$"'{Path.GetFileName(filePath)}':");
int i = 0;
foreach (var wm in all)
{
Console.WriteLine($" #{++i}: {(wm.Text ?? "[image]")} ");
Console.WriteLine($" Page {wm.PageNumber}, " +
$"Pos X={wm.X}, Y={wm.Y}, Rot={wm.RotateAngle}°");
Console.WriteLine($" Size {wm.Width}×{wm.Height}");
if (wm.ImageData != null)
Console.WriteLine($" Image bytes {wm.ImageData.Length}");
}
}
Önemli nokta: Döngü, tipik bir 50 sayfalık PDF için bir saniyeden kısa sürede çalışır.
Adım 2 – Gerekli Metin Filigranını Doğrula
Uyumluluk politikaları genellikle belirli bir ifadeyi (ör. “CONFIDENTIAL”) talep eder. SkipUnreadableCharacters özelliğine sahip TextSearchCriteria, bölünmüş veya döndürülmüş metni otomatik olarak işler.
using (var wk = new Watermarker(filePath))
{
var crit = new TextSearchCriteria(expectedPhrase);
crit.SkipUnreadableCharacters = true; // ignore OCR artefacts
var hits = wk.Search(crit);
bool ok = hits.Count > 0;
Console.WriteLine($" [{(ok ? "PASS" : "FAIL")}] " +
$"'{expectedPhrase}' found {hits.Count} time(s)");
return ok;
}
Yöntem, ifade en az bir kez göründüğünde true döndürür ve size anında GEÇİLDİ/KALDIRILDI bayrağı verir.
Adım 3 – Şirket Logosunu Doğrula
Logolar raster görüntüler olarak bulunur ve sıkıştırma nedeniyle görünüşleri biraz değişebilir. ImageDctHashSearchCriteria, referans logonun algısal bir karmasını oluşturur ve yapılandırılabilir bir toleransla eşleştirir.
using (var wk = new Watermarker(filePath))
{
var crit = new ImageDctHashSearchCriteria(logoPath);
crit.MaxDifference = 0.9; // tolerate moderate scaling / colour shift
var matches = wk.Search(crit);
bool ok = matches.Count > 0;
Console.WriteLine($" [{(ok ? "PASS" : "FAIL")}] " +
$"logo instances: {matches.Count}");
return ok;
}
Logonun düşük çözünürlüklü bir kopyası bile tanınacaktır.
Adım 4 – Tam Uyum Raporu Çalıştır
Gerçek dünya politikaları birkaç gereksinimi birleştirir. İlk blok, metin varlığı, yazı tipi, boyut ve kalın stil gibi dört biçimlendirme kuralını kontrol eder — her biri TextSearchCriteria ile TextFormattingSearchCriteria‘yi .And() aracılığıyla birleştirir:
using (var wk = new Watermarker(filePath))
{
int passed = 0, failed = 0;
var txtCrit = new TextSearchCriteria(expectedPhrase);
bool hasText = wk.Search(txtCrit).Count > 0;
Console.WriteLine($" [{(hasText ? "PASS" : "FAIL")}] Text present");
if (hasText) passed++; else failed++;
var fontCrit = new TextFormattingSearchCriteria { FontName = expFont };
bool hasFont = wk.Search(txtCrit.And(fontCrit)).Count > 0;
Console.WriteLine($" [{(hasFont ? "PASS" : "FAIL")}] Font {expFont}");
if (hasFont) passed++; else failed++;
var sizeCrit = new TextFormattingSearchCriteria { MinFontSize = minSize };
bool hasSize = wk.Search(txtCrit.And(sizeCrit)).Count > 0;
Console.WriteLine($" [{(hasSize ? "PASS" : "FAIL")}] Size >= {minSize}");
if (hasSize) passed++; else failed++;
var boldCrit = new TextFormattingSearchCriteria { FontBold = true };
bool hasBold = wk.Search(txtCrit.And(boldCrit)).Count > 0;
Console.WriteLine($" [{(hasBold ? "PASS" : "FAIL")}] Bold formatting");
if (hasBold) passed++; else failed++;
Beşinci kural, sayfa kapsamını doğrular — filigran her sayfada görünmelidir. Son olarak, karar tüm sonuçları toplar:
var perPage = wk.Search(txtCrit);
var pages = new HashSet<int>();
foreach (var wm in perPage)
if (wm.PageNumber.HasValue) pages.Add(wm.PageNumber.Value);
var allPages = wk.Search();
int max = 0;
foreach (var wm in allPages)
max = Math.Max(max, wm.PageNumber ?? 0);
bool full = max > 0 && pages.Count == max;
Console.WriteLine($" [{(full ? "PASS" : "FAIL")}] " +
$"Pages covered {pages.Count}/{max}");
if (full) passed++; else failed++;
string verdict = failed == 0 ? "COMPLIANT" : "NON-COMPLIANT";
Console.WriteLine($"\nResult: {verdict} " +
$"({passed} passed, {failed} failed)");
}
Rapor, JSON, CSV olarak dışa aktarılmaya ya da doğrudan bir bilet sistemine beslenmeye hazırdır.
Yan‑Yana: Önce vs. Sonra
| Manuel İnceleme | Otomatik Denetim | |
|---|---|---|
| Zaman | Parti başına saatler | Dosya başına saniyeler |
| Doğruluk | İnsan hatasına açık | Deterministik API |
| Ölçeklenebilirlik | Birkaç belgeyle sınırlı | Binlerce belgeyi işleyebilir |
| Gerekli kod | Yok (ancak iş gücü yoğun) | ~30 satır C# |
| Çıktı | Yalnızca görsel inceleme | Yapılandırılmış GEÇİLDİ/KALDIRILDI raporu |
Kontrast çarpıcı: bir zamanlar tam bir iş gününü dolduran şey şimdi bir arka plan işi olarak çalışıyor.
Gerçek Dünya Örneği: Hukuki Sözleşme Kütüphanesi
Bir hukuk firması, paylaşılan bir klasörde 15 000 sözleşme depolar. Politikaları, her sayfada “CONFIDENTIAL – CLIENT XYZ” ifadesi ve firmanın mührünü gerektirir. Yukarıdaki kod parçacıklarını gece çalışan bir PowerShell betiğine entegre ederek firma şunları başardı:
- %100 tespit eksik işaretlerin (önceden %8 kaçıyordu).
- Sıfır manuel saat denetim için harcandı.
- Gelecek düzenleyici incelemeler için iç bir SharePoint listesine kaydedilen bir denetim izi.
// Example of the nightly job entry point
var folder = @"\\fileserver\Contracts";
foreach (var pdf in Directory.GetFiles(folder, "*.pdf", SearchOption.AllDirectories))
{
// reuse the methods from steps 1‑4
ScanAll(pdf);
VerifyText(pdf, "CONFIDENTIAL – CLIENT XYZ");
VerifyLogo(pdf, @"C:\Logos\firm-seal.png");
RunReport(pdf);
}
Betik, gözetimsiz çalışır ve her sabah bir özet e‑posta gönderir.
GroupDocs.Watermark ile Başka Ne Yapabilirsiniz?
Denetimin ötesinde, örnek proje filigranları programlı olarak değiştirme ve kaldırma nasıl yapılacağını gösterir. Aşağıdaki ekran görüntüleri gerçek bir PDF üzerinde her iki işlemi de gösterir:
Aynı API ile oluşturabileceğiniz diğer senaryolar:
- Görünmez izleme filigranları ekleyin; sızıntı takibi için benzersiz bir kimlik gömer.
- Tüm arşivde eski logoları toplu olarak değiştirin.
- Başarılı bir denetim sonrası PDF’ye hazır uyumluluk sertifikaları oluşturun.
- Azure Functions veya AWS Lambda ile sunucusuz işleme entegre edin.
Her senaryo aynı temel API’yi kullanır – sadece arama kriterlerini veya filigran tipini değiştirmeniz yeterlidir.
Sonuç
Bir zamanlar bir ekibin sayfaları çevirmesini, not almasını ve işaretleri kaçırma riskini gerektiren şey, şimdi birkaç saniyelik kod ile denetlenebilir bir GEÇİLDİ/KALDIRILDI raporu üretiyor. GroupDocs.Watermark for .NET ile şunları elde edersiniz:
- Her filigranın tam görünürlüğü.
- Metin, biçimlendirilmiş metin ve logoların güvenilir tespiti.
- Otomatik uyumluluk raporlaması.
- Filigranları programlı olarak güncelleme veya kaldırma yeteneği.
Sonraki Adımlar
- Ücretsiz API denemesini deneyin – geçici lisansı buradan alın: Temp License
- Gelişmiş seçenekler için tam dokümantasyonu okuyun: Docs
- Tüm sınıflar ve yöntemler için .NET API referansını keşfedin: API Reference
- GitHub’da örnek projeyi klonlayın ve tam bir konsol uygulamasını görün: GitHub Samples
- Sorular sorun veya kullanım senaryonuzu topluluk forumunda paylaşın: Forum