Der alte Weg war schmerzhaft
Stellen Sie sich einen Compliance‑Beauftragten vor, der die Aufgabe hat, zu überprüfen, dass jeder Vertrag in einem gemeinsamen Laufwerk das Wort “CONFIDENTIAL” und das Firmenlogo auf jeder Seite enthält. Der aktuelle Prozess sieht folgendermaßen aus:
- Öffnen Sie eine Datei in einem Viewer.
- Blättern Sie jede Seite durch und suchen nach dem Ausdruck oder Bild.
- Notieren Sie sich Anmerkungen in einer Tabelle.
- Wiederholen Sie dies für Tausende von PDFs, Word‑Dateien und Präsentationen.
Ein einziges übersehenes Wasserzeichen kann eine kostspielige Überprüfung auslösen, und der manuelle Aufwand übersteigt leicht 8 Stunden pro Woche für ein kleines Team. Außerdem entgehen rotierter Text, geteilte Wörter oder als Bilder gespeicherte Logos häufig dem menschlichen Auge, wodurch die Organisation gefährdet wird.
Es gibt einen besseren Weg
GroupDocs.Watermark for .NET eliminiert jeden Rätsel‑Schritt. Seine formatunabhängige Engine kann mehr als 100 Dokumenttypen lesen, Text‑, Bild‑ und sogar formatierte Wasserzeichen finden und alle relevanten Metadaten über eine saubere API bereitstellen. Das folgende Tutorial zeigt, wie einige knappe Code‑Snippets die manuelle Schleife durch einen automatisierten, wiederholbaren Workflow ersetzen.
Voraussetzungen
- .NET 6.0 oder höher.
- GroupDocs.Watermark NuGet‑Paket (
dotnet add package GroupDocs.Watermark). - (Optional) eine temporäre Lizenz – siehe den Link am Ende dieses Artikels.
Der neue Weg: Automatisierte Wasserzeichen‑Prüfung
Im Folgenden gehen wir die vier Kernoperationen durch. Jeder Block ist ein eigenständiges Beispiel, das Sie in eine Konsolen‑App, einen CI‑Schritt oder einen Hintergrunddienst einbinden können.
Schritt 1 – Alle Wasserzeichen scannen
Zuerst benötigen wir ein vollständiges Inventar. Die Methode Search() gibt eine Sammlung zurück, bei der jeder Eintrag Text (oder Bild), Position, Drehung, Seitennummer und rohe Bildgröße enthält.
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}");
}
}
Wichtiger Hinweis: Die Schleife läuft in weniger als einer Sekunde für ein typisches 50‑seitiges PDF.
Schritt 2 – Erforderliches Text‑Wasserzeichen prüfen
Compliance‑Richtlinien verlangen oft einen bestimmten Ausdruck (z. B. “CONFIDENTIAL”). Das TextSearchCriteria mit SkipUnreadableCharacters verarbeitet geteilten oder rotierten Text automatisch.
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;
}
Die Methode gibt true zurück, wenn der Ausdruck mindestens einmal vorkommt, und liefert Ihnen sofort ein PASS/FAIL‑Signal.
Schritt 3 – Firmenlogo prüfen
Logos liegen als Rasterbilder vor, und ihr Aussehen kann aufgrund von Kompression leicht variieren. ImageDctHashSearchCriteria erzeugt einen perceptual hash des Referenz‑Logos und vergleicht ihn mit einer konfigurierbaren Toleranz.
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;
}
Selbst eine niedrigauflösende Kopie des Logos wird erkannt.
Schritt 4 – Vollständigen Compliance‑Bericht ausführen
Reale Richtlinien kombinieren mehrere Anforderungen. Der erste Block prüft vier Formatierungsregeln — Textvorhandensein, Schriftart, Größe und Fettdruck — wobei jeweils TextSearchCriteria mit TextFormattingSearchCriteria über .And() kombiniert wird:
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++;
Die fünfte Regel prüft die Seitenabdeckung — das Wasserzeichen muss auf jeder Seite erscheinen. Abschließend fasst das Urteil alle Ergebnisse zusammen:
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)");
}
Der Bericht kann als JSON, CSV exportiert oder direkt in ein Ticket‑System eingespeist werden.
Gegenüberstellung: Vorher vs. Nachher
| Manuelle Überprüfung | Automatisierte Prüfung | |
|---|---|---|
| Zeit | Stunden pro Stapel | Sekunden pro Datei |
| Genauigkeit | Anfällig für menschliche Fehler | Deterministische API |
| Skalierbarkeit | Auf wenige Dokumente beschränkt | Verarbeitet Tausende |
| Erforderlicher Code | Keiner (aber arbeitsintensiv) | ~30 Zeilen C# |
| Ausgabe | Nur visuelle Inspektion | Strukturierter PASS/FAIL‑Bericht |
Der Unterschied ist deutlich: Was früher einen vollen Arbeitstag beanspruchte, läuft jetzt als Hintergrundjob.
Praxisbeispiel: Rechtsvertragsbibliothek
Eine Kanzlei speichert 15 000 Verträge in einem gemeinsamen Ordner. Ihre Richtlinie verlangt den Ausdruck “CONFIDENTIAL – CLIENT XYZ” und das Kanzleisiegel auf jeder Seite. Durch die Integration der obigen Snippets in ein nächtliches PowerShell‑Skript erreichte die Kanzlei:
- 100 % Erkennung fehlender Markierungen (zuvor entgingen 8 %).
- Null manuelle Stunden für die Prüfung aufgewendet.
- Ein Audit‑Protokoll, das in einer internen SharePoint‑Liste für zukünftige regulatorische Prüfungen gespeichert wird.
// 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);
}
Das Skript läuft unbeaufsichtigt und sendet jeden Morgen eine Zusammenfassung per E‑Mail.
Was können Sie sonst noch mit GroupDocs.Watermark tun?
Über die Prüfung hinaus zeigt das Beispielprojekt, wie Sie Wasserzeichen programmgesteuert ersetzen und entfernen können. Die Screenshots unten demonstrieren beide Vorgänge an einem echten PDF:
Weitere Szenarien, die Sie mit derselben API erstellen können:
- Unsichtbare Tracking‑Wasserzeichen hinzufügen, die eine eindeutige ID zur Leckverfolgung einbetten.
- Massenhaft veraltete Logos in einem gesamten Archiv ersetzen.
- PDF‑fertige Compliance‑Zertifikate nach erfolgreicher Prüfung erzeugen.
- Integration mit Azure Functions oder AWS Lambda für serverlose Verarbeitung.
Jedes Szenario verwendet dieselbe Kern‑API – einfach die Suchkriterien oder den Wasserzeichentyp austauschen.
Fazit
Was einst ein Team erforderte, das Seiten durchblätterte, Notizen schrieb und das Risiko verpasster Markierungen einging, ist jetzt einige Sekunden Code, die einen auditierbaren PASS/FAIL‑Bericht erzeugen. Mit GroupDocs.Watermark for .NET erhalten Sie:
- Vollständige Sichtbarkeit jedes Wasserzeichens.
- Zuverlässige Erkennung von Text, formatiertem Text und Logos.
- Automatische Compliance‑Berichterstellung.
- Die Möglichkeit, Wasserzeichen programmgesteuert zu aktualisieren oder zu entfernen.
Probieren Sie es aus und verwandeln Sie Ihren Wasserzeichen‑Compliance‑Prozess von einer Kopfschmerz‑Quelle in einen wiederholbaren Service.
Nächste Schritte
- Testen Sie die kostenlose API‑Testversion – erhalten Sie hier eine temporäre Lizenz: Temp License
- Lesen Sie die vollständige Dokumentation für erweiterte Optionen: Docs
- Entdecken Sie die .NET‑API‑Referenz für alle Klassen und Methoden: API Reference
- Klonen Sie das Beispielprojekt auf GitHub, um eine vollständige Konsolen‑App zu sehen: GitHub Samples
- Stellen Sie Fragen oder teilen Sie Ihren Anwendungsfall im Community‑Forum: Forum