Starý způsob byl bolestivý
Představte si úředníka pro soulad, který má za úkol ověřit, že každá smlouva ve sdíleném disku obsahuje slovo “CONFIDENTIAL” a firemní logo na každé stránce. Současný proces vypadá takto:
- Otevřete soubor ve vieweru.
- Prolistujte každou stránku a hledejte frázi nebo obrázek.
- Poznamenejte si poznámky do tabulky.
- Opakujte pro tisíce PDF, Word souborů a prezentací.
Jedna opomenutá vodoznak může spustit nákladnou revizi a manuální úsilí snadno přesáhne 8 hodin týdně pro malý tým. Navíc se otočený text, rozdělená slova nebo loga uložená jako obrázky často vyhnou lidskému oku, což organizaci vystavuje riziku.
Existuje lepší způsob
GroupDocs.Watermark for .NET odstraňuje všechny kroky hádání. Jeho formát‑agnostický engine dokáže číst více než 100 typů dokumentů, najít textové, obrázkové i stylizované vodoznaky a zpřístupnit veškerá relevantní metadata přes čisté API. Následující tutoriál ukazuje, jak několik stručných úryvků nahradí manuální smyčku automatizovaným, opakovatelným pracovním tokem.
Požadavky
- .NET 6.0 nebo novější.
- GroupDocs.Watermark NuGet balíček (
dotnet add package GroupDocs.Watermark). - (Volitelné) dočasná licence – viz odkaz na konci tohoto článku.
Nový způsob: Automatizovaný audit vodoznaků
Níže projdeme čtyři základní operace. Každý blok je samostatný příklad, který můžete vložit do konzolové aplikace, CI kroku nebo background služby.
Krok 1 – Prohledat všechny vodoznaky
Nejprve potřebujeme kompletní inventář. Metoda Search() vrací kolekci, kde každý záznam obsahuje text (nebo obrázek), umístění, rotaci, číslo stránky a surovou velikost obrázku.
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}");
}
}
Klíčový bod: Smyčka běží za méně než sekundu pro typický 50‑stránkový PDF.
Krok 2 – Ověřit požadovaný textový vodoznak
Politiky souladu často vyžadují konkrétní frázi (např. “CONFIDENTIAL”). TextSearchCriteria s nastavením SkipUnreadableCharacters automaticky zvládá rozdělený nebo otočený text.
using (var wk = new Watermarker(filePath))
{
var crit = new TextSearchCriteria(expectedPhrase);
crit.SkipUnreadableCharacters = true; // ignorovat OCR artefakty
var hits = wk.Search(crit);
bool ok = hits.Count > 0;
Console.WriteLine($" [{(ok ? "PASS" : "FAIL")}] " +
$"'{expectedPhrase}' found {hits.Count} time(s)");
return ok;
}
Metoda vrací true, pokud se fráze objeví alespoň jednou, čímž poskytuje okamžitý stav PASS/FAIL.
Krok 3 – Ověřit firemní logo
Loga jsou rasterové obrázky a jejich vzhled se může mírně lišit kvůli kompresi. ImageDctHashSearchCriteria vytvoří percepční hash referenčního loga a porovná jej s nastavitelnou tolerancí.
using (var wk = new Watermarker(filePath))
{
var crit = new ImageDctHashSearchCriteria(logoPath);
crit.MaxDifference = 0.9; // tolerovat mírné škálování / posun barev
var matches = wk.Search(crit);
bool ok = matches.Count > 0;
Console.WriteLine($" [{(ok ? "PASS" : "FAIL")}] " +
$"logo instances: {matches.Count}");
return ok;
}
I nízkokvalitní kopie loga bude rozpoznána.
Krok 4 – Spustit kompletní zprávu o souladu
Reálné politiky kombinují několik požadavků. První blok kontroluje čtyři formátovací pravidla — přítomnost textu, font, velikost a tučný styl — každé kombinuje TextSearchCriteria s TextFormattingSearchCriteria pomocí .And():
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++;
Páté pravidlo ověřuje pokrytí stránek — vodoznak se musí objevit na každé stránce. Nakonec se výsledek agreguje:
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)");
}
Zpráva je připravena k exportu jako JSON, CSV nebo může být přímo předána do ticketovacího systému.
Vedle sebe: Před vs. Po
| Manuální revize | Automatizovaný audit | |
|---|---|---|
| Čas | Hodiny na dávku | Sekundy na soubor |
| Přesnost | Lidská chyba | Deterministické API |
| Škálovatelnost | Omezená na několik dokumentů | Zpracuje tisíce |
| Požadovaný kód | Žádný (ale pracně) | ~30 řádků C# |
| Výstup | Pouze vizuální kontrola | Strukturovaná PASS/FAIL zpráva |
Rozdíl je nápadný: to, co dříve zabralo celý pracovní den, nyní běží jako background job.
Praktický příklad: Knihovna právních smluv
Právnická firma ukládá 15 000 smluv do sdílené složky. Jejich politika vyžaduje frázi “CONFIDENTIAL – CLIENT XYZ” a firemní pečeť na každé stránce. Integrací výše uvedených úryvků do nočního PowerShell skriptu firma dosáhla:
- 100 % detekce chybějících značek (dříve uniklo 8 %).
- Nula manuálních hodin strávených auditem.
- Auditní stopa uložena do interního SharePoint seznamu pro budoucí regulatorní revize.
// 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);
}
Skript běží bez dozoru a každé ráno odesílá souhrnný e‑mail.
Co dalšího můžete dělat s GroupDocs.Watermark?
Kromě auditu ukázkový projekt demonstruje, jak nahradit a odstranit vodoznaky programově. Níže jsou snímky obrazovky, které ukazují obě operace na reálném PDF:
Další scénáře, které můžete postavit pomocí stejného API:
- Přidat neviditelné sledovací vodoznaky, které embedují unikátní ID pro sledování úniku.
- Hromadně nahradit zastaralá loga v celém archivu.
- Generovat PDF‑připravené certifikáty o souladu po úspěšném auditu.
- Integrovat s Azure Functions nebo AWS Lambda pro serverless zpracování.
Každý scénář používá stejný jádrový API – stačí vyměnit kritéria vyhledávání nebo typ vodoznaku.
Závěr
To, co dříve vyžadovalo tým listovat stránkami, psát poznámky a riskovat opomenuté značky, je nyní několik sekund kódu, který produkuje auditovatelnou PASS/FAIL zprávu. S GroupDocs.Watermark for .NET získáte:
- Úplnou viditelnost každého vodoznaku.
- Spolehlivé detekování textu, stylizovaného textu i log.
- Automatické reportování souladu.
- Možnost programově aktualizovat nebo odstraňovat vodoznaky.
Vyzkoušejte to a proměňte svůj proces kontroly vodoznaků z bolesti hlavy na opakovatelnou službu.
Další kroky
- Vyzkoušejte bezplatnou API zkušební verzi – získejte dočasnou licenci zde: Temp License
- Přečtěte si kompletní dokumentaci pro pokročilé možnosti: Docs
- Prozkoumejte .NET API referenci pro všechny třídy a metody: API Reference
- Naklonujte ukázkový projekt na GitHubu a podívejte se na kompletní konzolovou aplikaci: GitHub Samples
- Ptejte se nebo sdílejte svůj případ na komunitním fóru: Forum