Cara Lama Menyakitkan

Bayangkan seorang petugas kepatuhan yang ditugaskan untuk memverifikasi bahwa setiap kontrak di drive bersama memuat kata “CONFIDENTIAL” dan logo perusahaan pada setiap halaman. Proses saat ini terlihat seperti ini:

  1. Buka file di penampil.
  2. Lihat setiap halaman mencari frasa atau gambar.
  3. Catat catatan dalam spreadsheet.
  4. Ulangi untuk ribuan PDF, file Word, dan presentasi.

Satu watermark yang terlewat dapat memicu tinjauan yang mahal, dan upaya manual dengan mudah melebihi 8 hours per week untuk tim kecil. Selain itu, teks yang diputar, kata yang terpisah, atau logo yang disimpan sebagai gambar sering lolos dari mata manusia, meninggalkan organisasi dalam risiko.

Ada Cara yang Lebih Baik

GroupDocs.Watermark for .NET menghilangkan semua langkah tebakan. Mesin yang tidak tergantung format ini dapat membaca lebih dari 100 jenis dokumen, menemukan teks, gambar, bahkan watermark yang bergaya, dan menampilkan semua metadata relevan melalui API yang bersih. Tutorial berikut menunjukkan bagaimana beberapa potongan kode singkat menggantikan loop manual dengan alur kerja otomatis yang dapat diulang.

Prasyarat

  • .NET 6.0 atau lebih baru.
  • GroupDocs.Watermark NuGet package (dotnet add package GroupDocs.Watermark).
  • (Opsional) lisensi sementara – lihat tautan di akhir artikel ini.

Cara Baru: Audit Watermark Otomatis

Di bawah ini kami menjelaskan empat operasi inti. Setiap blok adalah contoh mandiri yang dapat Anda masukkan ke dalam aplikasi konsol, langkah CI, atau layanan latar belakang.

Langkah 1 – Pindai Setiap Watermark

Pertama kita memerlukan inventaris lengkap. Metode Search() mengembalikan koleksi di mana setiap entri berisi teks (atau gambar), lokasi, rotasi, nomor halaman, dan ukuran gambar mentah.

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}");
    }
}

Poin penting: Loop berjalan dalam kurang dari satu detik untuk PDF 50‑halaman tipikal.

Langkah 2 – Verifikasi Watermark Teks yang Diperlukan

Kebijakan kepatuhan sering kali menuntut frasa spesifik (misalnya “CONFIDENTIAL”). TextSearchCriteria dengan SkipUnreadableCharacters menangani teks yang terpisah atau diputar secara otomatis.

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;
}

Metode mengembalikan true ketika frasa muncul setidaknya sekali, memberikan Anda bendera PASS/FAIL secara instan.

Langkah 3 – Verifikasi Logo Perusahaan

Logo tersimpan sebagai gambar raster, dan penampilannya dapat sedikit bervariasi karena kompresi. ImageDctHashSearchCriteria membuat hash perseptual dari logo referensi dan mencocokkannya dengan toleransi yang dapat dikonfigurasi.

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;
}

Bahkan salinan logo beresolusi rendah akan dikenali.

Langkah 4 – Jalankan Laporan Kepatuhan Lengkap

Kebijakan dunia nyata menggabungkan beberapa persyaratan. Blok pertama memeriksa empat aturan format — keberadaan teks, font, ukuran, dan gaya tebal — masing-masing menggabungkan TextSearchCriteria dengan TextFormattingSearchCriteria melalui .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++;

Aturan kelima memverifikasi cakupan halaman — watermark harus muncul di setiap halaman. Akhirnya, keputusan mengagregasi semua hasil:

    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)");
}

Laporan siap diekspor sebagai JSON, CSV atau langsung dimasukkan ke dalam sistem tiket.


Perbandingan: Sebelum vs. Sesudah

Manual Review Automated Audit
Waktu Jam per batch Detik per file
Akurasi Rentan kesalahan manusia API deterministik
Skalabilitas Terbatas pada beberapa dokumen Menangani ribuan
Kode yang dibutuhkan Tidak ada (tetapi memakan tenaga) ~30 baris C#
Output Hanya inspeksi visual Laporan PASS/FAIL terstruktur

Kontrasnya mencolok: apa yang dulu memakan waktu penuh hari kerja kini berjalan sebagai pekerjaan latar belakang.


Contoh Dunia Nyata: Perpustakaan Kontrak Hukum

Sebuah firma hukum menyimpan 15 000 kontrak di folder bersama. Kebijakan mereka mengharuskan frasa “CONFIDENTIAL – CLIENT XYZ” dan segel firma pada setiap halaman. Dengan mengintegrasikan potongan kode di atas ke dalam skrip PowerShell malam hari, firma tersebut mencapai:

  • deteksi 100 % tanda yang hilang (sebelumnya 8 % lolos).
  • Nol jam manual yang dihabiskan untuk audit.
  • jejak audit disimpan ke daftar SharePoint internal untuk tinjauan regulasi di masa depan.
// 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);
}

Skrip berjalan tanpa pengawasan dan mengirim email ringkasan setiap pagi.


Apa Lagi yang Bisa Anda Lakukan dengan GroupDocs.Watermark?

Selain audit, proyek contoh menunjukkan cara mengganti dan menghapus watermark secara programatis. Tangkapan layar di bawah ini memperlihatkan kedua operasi pada PDF nyata:

Penggantian teks — watermark lama diperbarui dengan teks, font, dan warna baru

Penghapusan terarah — hanya watermark yang cocok dengan kriteria teks dan format yang dihapus

Skenario lain yang dapat Anda bangun dengan API yang sama:

  • Tambahkan watermark pelacakan tak terlihat yang menyematkan ID unik untuk pelacakan kebocoran.
  • Ganti massal logo usang di seluruh arsip.
  • Hasilkan sertifikat kepatuhan siap PDF setelah audit berhasil.
  • Integrasikan dengan Azure Functions atau AWS Lambda untuk pemrosesan tanpa server.

Setiap skenario menggunakan API inti yang sama – cukup ganti kriteria pencarian atau tipe watermark.


Kesimpulan

Apa yang dulu memerlukan tim untuk membalik halaman, menulis catatan, dan berisiko melewatkan tanda kini menjadi beberapa detik kode yang menghasilkan laporan PASS/FAIL yang dapat diaudit. Dengan GroupDocs.Watermark for .NET Anda mendapatkan:

  • Visibilitas penuh atas setiap watermark.
  • Deteksi andal teks, teks bergaya, dan logo.
  • Pelaporan kepatuhan otomatis.
  • Kemampuan memperbarui atau menghapus watermark secara programatis.

Cobalah dan ubah proses kepatuhan watermark Anda dari sakit kepala menjadi layanan yang dapat diulang.


Langkah Selanjutnya

  • Coba percobaan API gratis – dapatkan lisensi sementara di sini: Temp License
  • Baca dokumentasi lengkap untuk opsi lanjutan: Docs
  • Jelajahi referensi API .NET untuk semua kelas dan metode: API Reference
  • Klon proyek contoh di GitHub untuk melihat aplikasi konsol lengkap: GitHub Samples
  • Ajukan pertanyaan atau bagikan kasus penggunaan Anda di forum komunitas: Forum