Hogyan olvassuk be a QR-kódot PDF-ben Java-val
Bevezetés
Szüksége volt már arra, hogy több száz PDF-számlából, szállítási címkéről vagy készletdokumentumból vonalkód‑információkat nyerjen ki? A kézi lapozás fárasztó és hibára hajlamos. Akár automatizált dokumentumfeldolgozó rendszert épít, akár a termék hitelességét ellenőrzi, a vonalkódok hatékony megtalálása PDF‑ekben kihívást jelenthet. Read QR code PDF fájlokat gyorsan olvashat a GroupDocs.Signature segítségével, és óráknyi manuális munkát néhány Java‑sorra cserélhet.
Ebben az útmutatóban megtanulja, hogyan read QR code PDF dokumentumokat olvassunk hatékonyan a GroupDocs.Signature API‑val. Megmutatjuk, hogyan állítsa be a könyvtárat, konfigurálja a keresési beállításokat, szűrje a vonalkódtípusok szerint, és kezelje az eredményeket úgy, hogy egyetlen fájltól akár több ezer fájlra is skálázható legyen.
Gyors válaszok
- Olvashatja-e a GroupDocs.Signature a QR‑kódokat PDF‑ekből? Igen – felismeri a QR, Data Matrix, PDF417 és több mint 45 egyéb vonalkódformátumot.
- Szükséges-e licenc a termeléshez? Kereskedelmi licenc szükséges; ingyenes próba elérhető értékeléshez.
- Melyik Java‑verzió szükséges? Java 8+ (Java 11+ ajánlott a jobb teljesítményért).
- Hogyan korlátozhatom a keresést konkrét oldalakra? Használja a
BarcodeSearchOptions.setAllPages(false)‑t és adja meg asetPageNumber()‑t. - Szálbiztos‑e az API kötegelt feldolgozáshoz? Igen, ha minden szálnál külön
Signaturepéldányt hoz létre.
Mi az a QR‑kód PDF olvasása?
Read QR code PDF azt jelenti, hogy programozottan megtaláljuk és dekódoljuk a PDF‑oldalakba ágyazott QR‑típusú vonalkódokat. A GroupDocs.Signature segítségével kinyerheti a kódolt szöveget, meghatározhatja az oldalszámot, és megkapja a vonalkód geometriai méreteit, mindezt anélkül, hogy először képpé renderelné a PDF‑et, ami drámaian felgyorsítja a feldolgozást.
Miért keresünk vonalkódokat PDF‑ekben?
A vonalkódok keresése PDF‑ekben lehetővé teszi a vállalkozások számára az adatkinyerés automatizálását, a manuális beviteli hibák csökkentését és a munkafolyamatok felgyorsítását a pénzügy, logisztika és egészségügy területén. A beágyazott vonalkódok programozott olvasásával a szervezetek azonnal lekérhetik az azonosítókat, nyomon követhetik a szállítmányokat, ellenőrizhetik a dokumentumokat, és integrálhatják az információt a downstream rendszerekbe, így gyorsabb és megbízhatóbb működést biztosítanak.
Gyakori üzleti forgatókönyvek
- Számlafeldolgozás – Automatikusan kinyeri a megrendelésszámokat vagy nyomkövető kódokat a beszállítói számlákról.
- Készletkezelés – Átvizsgálja a termékkatalógusokat és kinyeri az SKU‑vonalkódokat az adatbázis frissítéséhez.
- Szállítás és logisztika – Ellenőrzi a csomagkövető kódokat a szállítási jegyzékekben.
- Dokumentum hitelesítés – Ellenőrzi az aláírt dokumentumokat beágyazott biztonsági vonalkódokkal.
- Egészségügyi nyilvántartások – Kinyeri a betegazonosítókat vagy receptkódokat orvosi PDF‑ekből.
A GroupDocs.Signature elvégzi a nehéz munkát – nem kell képfeldolgozó kódot írnia, vagy a PDF‑renderelés sajátosságaitól aggódnia. A könyvtár 50+ vonalkódformátumot képes felismerni, és egy 300 oldalas PDF‑et 5 másodperc alatt feldolgoz egy tipikus 8‑magos szerveren.
Előfeltételek
Mielőtt elkezdené a tutorialt, győződjön meg róla, hogy a következők rendelkezésre állnak:
Szükséges könyvtárak és függőségek
A GroupDocs.Signature könyvtárat be kell vonni a Java‑projektjébe. Így adhatja hozzá Maven‑nel vagy Gradle‑lel:
Maven:
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-signature</artifactId>
<version>23.12</version>
</dependency>
Gradle:
implementation 'com.groupdocs:groupdocs-signature:23.12'
Megjegyzés: Mindig ellenőrizze a legújabb verziót a GroupDocs.Signature for Java releases oldalon. A legfrissebb verzió használata biztosítja a hibajavításokat és az új funkciókat.
Környezet beállítása
- JDK 8 vagy újabb – A GroupDocs.Signature minimum Java 8‑at igényel (Java 11+ ajánlott a jobb teljesítményért).
- IDE – Az IntelliJ IDEA vagy az Eclipse megkönnyíti az automatikus kiegészítést és a hibakeresést.
- PDF dokumentum – Legyen egy teszt‑PDF vonalkódokkal (számlák, szállítási címkék vagy termékkatalógusok nagyszerűek).
Tudás előfeltételek
Jól kell ismernie:
- Alap Java szintaxist és objektum‑orientált koncepciókat
- Kivételkezelést
try‑catchblokkokkal - Külső könyvtárak használatát az IDE‑ben
Ha új a harmadik féltől származó Java könyvtárakban, ne aggódjon – lépésről lépésre végigvezetjük.
A GroupDocs.Signature beállítása Java-hoz
A GroupDocs.Signature elindítása csak néhány percet vesz igénybe. Íme a teljes beállítási folyamat:
1. lépés: Függőség hozzáadása
Használja a Maven‑t vagy a Gradle‑t a könyvtár felvételéhez (lásd a fenti kódot). A függőség hozzáadása után frissítse a projektet, hogy letöltse a JAR‑fájlokat.
2. lépés: Licenc beszerzése
A GroupDocs több licencelési lehetőséget kínál:
- Ingyenes próba – Ideális teszteléshez. Letölthető a GroupDocs releases oldalról.
- Ideiglenes licenc – 30 napos teljes hozzáférés a Temporary License Page oldalon.
- Kereskedelmi licenc – Termelési környezethez vásároljon licencet a GroupDocs Purchase oldalon.
Pro tip: Kezdje az ingyenes próbával, építse fel a proof‑of‑conceptet, majd váltson licencre, ha az API megfelel az igényeinek.
3. lépés: Alap inicializálás
A Signature osztály a belépési pont, amely betölti a PDF‑et memóriába, és keresési, ellenőrzési és kinyerési metódusokat biztosít.
import com.groupdocs.signature.Signature;
String filePath = "YOUR_DOCUMENT_DIRECTORY/sample_signed.pdf"; // Replace with your PDF path
Signature signature = new Signature(filePath);
Fontos: Windows‑on a fájlútvonalakban használjon dupla visszaperceket (C:\\Documents\\file.pdf), hogy elkerülje az escape‑problémákat.
Implementációs útmutató
Most jön a szórakoztató rész – írjuk meg a kódot, amely a PDF‑ben vonalkódokat keres.
Vonalkód‑aláírások keresése egy dokumentumban
A megvalósítást három egyértelmű lépésre bontjuk.
1. lépés: A Signature objektum inicializálása
A Signature a központi osztály, amely egy PDF dokumentumot reprezentál memóriában.
import com.groupdocs.signature.Signature;
String filePath = "YOUR_DOCUMENT_DIRECTORY/sample_signed.pdf"; // Replace with actual file path
Signature signature = new Signature(filePath);
Mi történik itt – A Signature objektum megnyitja a PDF‑et, és előkészíti a feldolgozást. Olyan, mintha egy szövegszerkesztőben nyitná meg a fájlt; betölti a dokumentumot, hogy lekérdezhesse.
Gyakorlati megjegyzés – Felhasználók által feltöltött PDF‑ek feldolgozásakor mindig ellenőrizze a fájlútvonalat és a létezést a Signature objektum létrehozása előtt. Ez megakadályozza a „file not found” hibákat.
2. lépés: BarcodeSearchOptions létrehozása
A BarcodeSearchOptions megmondja a motornak, hogy mit és hol keressen.
import com.groupdocs.signature.options.search.BarcodeSearchOptions;
// Configure options for searching barcodes
BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setAllPages(true); // Search every page in the document
Definíció: A BarcodeSearchOptions konfigurálja a vonalkód‑keresés paramétereit, például az oldaltartományt, a vonalkódtípusokat és a detektálási pontosságot.
Kulcsfontosságú beállítások
setAllPages(true): Minden oldalt átvizsgál. Állítsafalse‑ra, és adja meg asetPageNumber()‑t, ha pontosan tudja, melyik oldalon van a kód.setEncodeType(BarcodeEncodeType.QR): A keresést csak QR‑kódokra korlátozza, ami akár 60 %-kal is csökkentheti a feldolgozási időt nagy PDF‑eknél.
Miért fontos – Ha a számlák QR‑kódja mindig az 1. oldalon van, a teljes dokumentum átvizsgálása felesleges CPU‑ciklust jelent.
3. lépés: Keresés végrehajtása és az eredmények kezelése
Futtassa a keresést, majd iteráljon az eredményeken.
import com.groupdocs.signature.domain.signatures.BarcodeSignature;
import java.util.List;
try {
// Execute the barcode search
List<BarcodeSignature> signatures = signature.search(BarcodeSignature.class, options);
// Check if any barcodes were found
if (signatures.isEmpty()) {
System.out.println("No barcode signatures found in the document.");
} else {
System.out.println("Found " + signatures.size() + " barcode signature(s):\n");
// Loop through each barcode and display details
for (BarcodeSignature barcodeSignature : signatures) {
System.out.println("----------------------------------------");
System.out.println("Barcode Type: " + barcodeSignature.getEncodeType().getTypeName());
System.out.println("Barcode Text: " + barcodeSignature.getText());
System.out.println("Page Number: " + barcodeSignature.getPageNumber());
System.out.println("Position: X=" + barcodeSignature.getLeft() +
", Y=" + barcodeSignature.getTop());
System.out.println("Size: Width=" + barcodeSignature.getWidth() +
", Height=" + barcodeSignature.getHeight());
System.out.println("----------------------------------------\n");
}
}
} catch (Exception e) {
System.err.println("Error searching for barcodes: " + e.getMessage());
e.printStackTrace();
} finally {
// Always dispose of the signature object to free resources
if (signature != null) {
signature.dispose();
}
}
Definíció: A BarcodeSignature egy felismert vonalkódot reprezentál, amely megadja a típusát, a dekódolt szöveget, az oldalszámot és a geometriai határokat.
A kód működése
- Meghívja a
signature.search()‑t, amelyBarcodeSignatureobjektumok listáját adja vissza. - Ellenőrzi, hogy talált‑e vonalkódot, hogy elkerülje a null‑pointer kivételeket.
- Kinyeri a típust, a szöveget, az oldalszámot és a méreteket minden találatra.
- A teljes műveletet
try‑catchblokkba helyezi, hogy szép módon kezelje a sérült PDF‑eket vagy hiányzó fájlokat. - A
Signaturepéldányt afinallyblokkban zárja le, így felszabadítja a memóriát.
Gyakorlati alkalmazás – Egy szállítócímke‑folyamatban a getText()‑t (a nyomkövető számot) adatbázisba menti, a getPageNumber()‑t pedig felhasználja a címke visszakapcsolásához az eredeti kötegfájlhoz.
Szűrés vonalkódtípus szerint
Ha pontosan ismeri a vonalkódtípust, szűrje le a keresést a gyorsabb detektálás érdekében:
import com.groupdocs.signature.domain.barcodes.BarcodeTypes;
BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setEncodeType(BarcodeTypes.QR); // Only search for QR codes
options.setAllPages(true);
Mikor szűrjünk – A keresés egyetlen típusra (pl. QR) korlátozása 30‑50 %-kal csökkentheti a CPU‑használatot olyan dokumentumoknál, amelyek sok vizuális elemet tartalmaznak.
Támogatott vonalkódtípusok
A GroupDocs.Signature számos vonalkódtípust képes felismerni. Íme egy gyors áttekintés:
1D vonalkódok (lineáris)
- Code128 – gyakori a szállításban és csomagolásban
- Code39 – autóiparban és védelmi szektorban használják
- EAN13/EAN8 – kiskereskedelmi termékkódok
- UPC‑A/UPC‑E – Észak‑amerikai kiskereskedelmi szabvány
- Interleaved2of5 – raktárak és elosztás
2D vonalkódok (mátrix)
- QR Code – a legnépszerűbb, URL‑ek, Wi‑Fi adatok stb. tárolására
- Data Matrix – kompakt, kis alkatrészekhez ideális
- PDF417 – kormányzati azonosítók, beszállókártyák, jogosítványok
- Aztec Code – közlekedési jegyek
A típus szerinti szűrés (lásd fent) segít a pontos formátumra koncentrálni.
Valós példák
1. Automatikus számlafeldolgozás
Forgatókönyv: Egy könyvelési osztály naponta 500+ beszállítói számlát kap PDF‑ként.
Megoldás: Minden PDF‑et átvizsgál Code39 vonalkódok után, amelyek a számlaszámot tartalmazzák, majd automatikusan párosítja őket a beszerzési rendelésekhez az ERP‑rendszerben. Ez 85 %-kal csökkenti a manuális adatbevitel hibáit.
// Pseudo-code workflow
for (PDF invoice : invoiceBatch) {
List<BarcodeSignature> barcodes = searchBarcodes(invoice);
String invoiceNumber = barcodes.get(0).getText();
updateERPSystem(invoiceNumber, invoice);
}
2. Raktárkészlet frissítések
Forgatókönyv: A raktár PDF csomaglistákat kap, amelyek EAN13 vonalkódokként ágyazzák be a termék‑SKU‑kat.
Megoldás: Kinyeri az összes vonalkódot a listákból, automatikusan frissíti a készletnyilvántartást, és jelzi a lemaradásokat manuális ellenőrzésre.
3. Dokumentum hitelesítés
Forgatókönyv: Jogi szerződések QR‑kódot tartalmaznak kriptográfiai aláírásokkal a hitelesség ellenőrzéséhez.
Megoldás: Keres QR‑kódot az aláírt szerződésekben, dekódolja az aláírási adatot, és ellenőrzi egy megbízható tanúsítvány‑hatóság ellen. Ez biztosítja, hogy a dokumentumok ne legyenek manipulálva.
4. Egészségügyi nyilvántartások kezelése
Forgatókönyv: Betegfájlok PDF‑laborjelentéseket tartalmaznak, amelyek Code128 vonalkódokként tárolják a mintavételi azonosítókat.
Megoldás: Automatikusan kinyeri a mintavételi azonosítókat, és összekapcsolja a laboreredményeket a betegnyilvántartással a kórházi információs rendszerben (HIS), így a keresési idő percekről másodpercekre csökken.
Gyakori problémák és megoldások
Probléma 1: „Nem található vonalkód” (bár létezik)
Lehetséges okok
- Alacsony képfelbontás (200 DPI alatt)
- A vonalkód túl kicsi a detektáló motor számára
- Rossz vonalkódtípus‑szűrő
Megoldások
- Növelje a DPI‑t – Legalább 300 DPI‑nál szkenneljen.
- Távolítsa el a típus‑szűrőt – Először keressen minden vonalkódtípusra, majd szűkítse le.
- Ellenőrizze a vizuális minőséget – Nyissa meg a PDF‑et Adobe Acrobat‑ban, nagyítsa 200 %-ra, és győződjön meg róla, hogy a vonalkód éles.
Probléma 2: OutOfMemoryError nagy PDF‑eknél
Ok – Egy 500‑oldalas PDF magas felbontású képekkel jelentős heap‑memóriát fogyaszt.
Megoldás – Oldalakat kötegekben dolgozza fel a teljes fájl betöltése helyett:
for (int startPage = 1; startPage <= totalPages; startPage += 50) {
BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setPageNumber(startPage);
options.setPagesSetup(new PagesSetup());
options.getPagesSetup().setLastPage(Math.min(startPage + 49, totalPages));
List<BarcodeSignature> batchResults = signature.search(BarcodeSignature.class, options);
// Process results...
}
Ezen felül fontolja meg a JVM heap növelését (-Xmx4g) nagyon nagy kötegek esetén.
Probléma 3: Lassú teljesítmény többoldalas dokumentumoknál
Ok – Minden oldalt sorban átvizsgálni időigényes.
Megoldások
- Célzott oldalak – Ha a vonalkódok mindig az 1. oldalon vannak, állítsa
setAllPages(false)‑t éssetPageNumber(1)‑et. - Eredmények gyorsítótárazása – Tárolja a vonalkód‑adatokat az első beolvasás után, hogy elkerülje a fájl újbóli feldolgozását.
- SSD‑tároló használata – A gyorsabb I/O 60‑70 %-kal csökkentheti a betöltési időt HDD‑hez képest.
Probléma 4: Hamis pozitívok (véletlen minták vonalkódként azonosítva)
Ok – Táblázatok vagy rácsvonalak tévesen vonalkódként értelmezhetők.
Megoldás – A dekódolt szöveg hosszát és mintáját ellenőrizze, mielőtt elfogadná:
for (BarcodeSignature barcode : signatures) {
String text = barcode.getText();
// Example: Invoice numbers are always 10 digits
if (text.matches("\\d{10}")) {
// Valid invoice number
processBarcode(barcode);
} else {
System.out.println("Skipping invalid barcode: " + text);
}
}
Teljesítmény tippek nagy dokumentumokhoz
1. Kötetes feldolgozási stratégia
Használjon szálkészletet, hogy egyszerre több PDF‑et dolgozzon fel:
ExecutorService executor = Executors.newFixedThreadPool(4); // 4 parallel threads
for (String pdfPath : pdfFiles) {
executor.submit(() -> {
try (Signature sig = new Signature(pdfPath)) {
List<BarcodeSignature> results = sig.search(BarcodeSignature.class, options);
// Process results...
} catch (Exception e) {
e.printStackTrace();
}
});
}
executor.shutdown();
executor.awaitTermination(1, TimeUnit.HOURS);
Eredmény: 1 000 fájl feldolgozása ~2 óráról ~30 percre csökken egy négymagos gépen.
2. Keresési tartomány csökkentése
Ha a vonalkódok mindig egy adott régióban jelennek meg, korlátozza a keresési területet:
// Only search the top‑right corner where barcodes are typically placed
options.setRectangle(new Rectangle(400, 50, 150, 150)); // X, Y, Width, Height
Eredmény: 40‑60 % gyorsabb feldolgozás konzisztens elrendezésű dokumentumoknál.
3. Memóriahasználat monitorozása
Hosszú futású kötegelt feladatoknál időnként hívja meg a garbage collector‑t:
Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();
if (usedMemory > (runtime.maxMemory() * 0.8)) {
System.gc(); // Suggest garbage collection
}
Legjobb gyakorlatok
1. Mindig szabadítsa fel a Signature objektumokat
A Signature implementálja az AutoCloseable‑t; a try‑with‑resources használata garantálja a tisztítást:
try (Signature signature = new Signature(filePath)) {
// Your search code here...
} // Automatically disposed
2. Ellenőrizze a bemeneti fájlokat
Soha ne bízzon meg vakon külső útvonalakat. Először ellenőrizze a létezést és a PDF‑validitást:
File pdfFile = new File(filePath);
if (!pdfFile.exists() || !pdfFile.canRead()) {
throw new FileNotFoundException("PDF not found or not readable: " + filePath);
}
// Optional: Verify it's actually a PDF (check magic bytes)
3. Naplózza a vonalkód‑észlelési eredményeket
Tartson audit‑naplót a megfelelőség és a hibakeresés érdekében:
Logger logger = Logger.getLogger(BarcodeSearcher.class.getName());
for (BarcodeSignature barcode : signatures) {
logger.info(String.format("Detected %s barcode '%s' on page %d at (%.2f, %.2f)",
barcode.getEncodeType().getTypeName(),
barcode.getText(),
barcode.getPageNumber(),
barcode.getLeft(),
barcode.getTop()));
}
4. Kezelje a különböző vonalkódtípusokat
Hozzon létre egy rugalmas metódust, amely BarcodeEncodeType értékek listáját fogadja, így új szabványok megjelenésekor kódmódosítás nélkül alkalmazkodhat:
switch (barcode.getEncodeType().getTypeName()) {
case "QR":
// QR codes might contain URLs or JSON data
processQRCode(barcode.getText());
break;
case "Code128":
// Code128 typically contains alphanumeric order/tracking numbers
processTrackingNumber(barcode.getText());
break;
default:
logger.warning("Unexpected barcode type: " + barcode.getEncodeType());
}
5. Tesztelje valós dokumentumokkal
Használjon beolvasott számlákat kávéfolttal, faxolt szállítási címkéket zajjal, valamint alacsony felbontású mobiltelefon‑fotókat PDF‑vé konvertálva. Ezek a valós esetek olyan széljegyeket fednek fel, amelyeket a tiszta minta‑PDF‑ek nem mutatnak.
Hogyan észleli a GroupDocs.Signature a QR‑kódokat PDF‑ekben?
Töltse be a PDF‑et egy Signature példánnyal, konfigurálja a BarcodeSearchOptions‑t QR‑kódokra, majd hívja meg a search()‑t. A motor belsőleg minden oldalt 150 DPI‑ra bitmap‑re renderel, egy gyors Z‑Bar‑alapú dekódert futtat, és BarcodeSignature objektumokat ad vissza, amelyek tartalmazzák a dekódolt szöveget és a geometriai adatokat. Ez a folyamat 300 oldalas dokumentum esetén kevesebb, mint 5 másodperc alatt befejeződik egy tipikus 8‑magos szerveren.
Gyakran feltett kérdések
K: Olvashatok-e QR‑kód PDF‑fájlokat licenc nélkül?
V: Az ingyenes próba lehetővé teszi a QR‑kód PDF‑fájlok kiértékelését, de a kereskedelmi licenc szükséges a termelési környezetben.
K: Támogatja‑e az API a jelszóval védett PDF‑eket?
V: Igen. Adja meg a jelszót a Signature objektum létrehozásakor, pl. new Signature(filePath, "password").
K: Hogyan javíthatom a detektálást alacsony felbontású beolvasásoknál?
V: Legalább 200 DPI‑nál szkenneljen, engedélyezze a setEncodeType(BarcodeEncodeType.QR)‑t, és fontolja meg a PDF előfeldolgozását zajszűrővel.
K: Szálbiztos‑e a keresés párhuzamos feldolgozáshoz?
V: Minden szálnak saját Signature objektumot kell létrehoznia. Így az API szálbiztos.
K: Melyik GroupDocs.Signature verzióval tesztelték ezt a tutorialt?
V: A kód a GroupDocs.Signature 23.12‑vel lett validálva, amely több mint 50 vonalkódformátumot támogat, és több száz oldalas PDF‑eket képes feldolgozni anélkül, hogy az egész fájlt memóriába töltené.
Következtetés
Most már tudja, hogyan read QR code PDF dokumentumokat olvasson Java‑val és a GroupDocs.Signature API‑val. A gyors összefoglaló:
- Beállítás – Adja hozzá a Maven/Gradle függőséget, szerezze be a licencet, és hozza létre a
Signature‑t. - Implementáció – Konfigurálja a
BarcodeSearchOptions‑t, futtassa asearch()‑t, és dolgozza fel aBarcodeSignatureeredményeket. - Támogatott típusok – Több mint 50 vonalkódformátum, köztük QR, Data Matrix, PDF417, Code128 és EAN13.
- Valós példák – Számlafeldolgozás, készletfrissítés, dokumentum hitelesítés, egészségügyi nyilvántartás‑kezelés.
- Hibakeresés – Megoldások hiányzó vonalkódok, memóriahibák, teljesítménybottleneckek és hamis pozitívok esetére.
- Teljesítmény – Kötegelt feldolgozás, oldaltartomány korlátozása és SSD‑I/O drámai módon növeli a throughput‑ot.
A GroupDocs.Signature elrejti a PDF renderelés és vonalkód‑dekódolás bonyolult lépéseit, így Ön a valódi üzleti logikára koncentrálhat. Legyen szó egy kis segédprogramról vagy egy nagyméretű dokumentum‑feldolgozó csővezetről, most már egy megbízható, nagy teljesítményű megoldása van.
Utoljára frissítve: 2026-07-15
Tesztelve a következővel: GroupDocs.Signature 23.12
Szerző: GroupDocs