Java ile QR kodlu PDF nasıl okunur

Giriş

Yüzlerce PDF faturası, nakliye etiketi veya envanter belgesinden barkod bilgilerini çıkarmanız gerektiği oldu mu? Sayfaları manuel olarak taramak zahmetli ve hataya açıktır. Otomatik bir belge işleme sistemi oluşturuyor ya da ürün özgünlüğünü doğruluyor olsanız da, PDF’lerde barkodları verimli bir şekilde bulmak zorlayıcı olabilir. Read QR code PDF dosyalarını GroupDocs.Signature ile hızlıca okuyun ve saatler süren manuel işi birkaç satır Java koduna dönüştürün.

Bu rehberde, GroupDocs.Signature API’sını kullanarak read QR code PDF belgelerini verimli bir şekilde nasıl okuyacağınızı öğreneceksiniz. Kütüphaneyi nasıl kuracağınızı, arama seçeneklerini nasıl yapılandıracağınızı, barkod tipine göre nasıl filtreleyeceğinizi ve sonuçları tek bir dosyadan binlerce dosyaya ölçeklenebilecek şekilde nasıl işleyeceğinizi göreceksiniz.

Hızlı Yanıtlar

  • GroupDocs.Signature PDF’lerden QR kodlarını okuyabilir mi? Evet – QR, Data Matrix, PDF417 ve 45’ten fazla başka barkod formatını algılar.
  • Üretim kullanımında lisansa ihtiyacım var mı? Ticari bir lisans gereklidir; değerlendirme için ücretsiz deneme mevcuttur.
  • Hangi Java sürümü gereklidir? Java 8+ (Daha iyi performans için Java 11+ önerilir).
  • Aramayı belirli sayfalara nasıl sınırlayabilirim? BarcodeSearchOptions.setAllPages(false) kullanın ve setPageNumber() ayarlayın.
  • API toplu işleme için çok iş parçacıklı (thread‑safe) mi? Evet, her iş parçacığı için ayrı bir Signature örneği oluşturduğunuzda.

read QR code PDF nedir?

Read QR code PDF, PDF sayfalarına gömülmüş QR‑tipi barkodları programlı olarak bulma ve çözme işlemine denir. GroupDocs.Signature kullanarak kodlanmış metni çıkarabilir, sayfa numarasını belirleyebilir ve her barkodun geometrik boyutlarını elde edebilirsiniz; tüm bunlar PDF’yi önce bir görüntüye dönüştürmeden yapılır ve işlem süresini büyük ölçüde hızlandırır.

PDF’lerde Barkod Aramanın Nedenleri?

PDF’lerde barkod aramak, işletmelerin veri çıkarımını otomatikleştirmesini, manuel giriş hatalarını azaltmasını ve finans, lojistik ve sağlık hizmetleri gibi alanlarda iş akışlarını hızlandırmasını sağlar. Gömülü barkodları programlı olarak okuyarak, kuruluşlar kimlikleri anında alabilir, gönderileri izleyebilir, belgeleri doğrulayabilir ve bilgileri sonraki sistemlere entegre ederek daha hızlı ve güvenilir operasyonlar sunar.

Yaygın İş Senaryoları

  • Fatura İşleme – Tedarikçi faturalarından sipariş numaralarını veya takip kodlarını otomatik olarak çıkarın.
  • Envanter Yönetimi – Ürün kataloglarını tarayın ve veritabanı güncellemeleri için SKU barkodlarını çıkarın.
  • Nakliye & Lojistik – Nakliye manifestolarındaki paket takip kodlarını doğrulayın.
  • Belge Doğrulama – Gömülü güvenlik barkodlarını kontrol ederek imzalı belgeleri doğrulayın.
  • Sağlık Kayıtları – Medikal PDF’lerden hasta kimliklerini veya reçete kodlarını çıkarın.

GroupDocs.Signature ağır işi üstlenir—görüntü işleme kodu yazmanıza veya PDF renderlama tuhaflıklarıyla uğraşmanıza gerek yoktur. Kütüphane 50+ barkod formatını algılayabilir ve tipik bir 8‑çekirdek sunucuda 300‑sayfalık PDF’yi 5 saniyenin altında işler.

Önkoşullar

Bu öğreticiye başlamadan önce aşağıdakilerin hazır olduğundan emin olun:

Gerekli Kütüphaneler ve Bağımlılıklar

Java projenize GroupDocs.Signature kütüphanesini eklemeniz gerekir. Maven veya Gradle kullanarak nasıl ekleyeceğiniz aşağıdadır:

Maven:

<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-signature</artifactId>
    <version>23.12</version>
</dependency>

Gradle:

implementation 'com.groupdocs:groupdocs-signature:23.12'

Not: Her zaman en son sürümü GroupDocs.Signature for Java releases adresinde kontrol edin. En yeni sürümü kullanmak, hata düzeltmeleri ve yeni özellikler almanızı sağlar.

Ortam Kurulumu

  • JDK 8 veya üzeri – GroupDocs.Signature en az Java 8 gerektirir (Daha iyi performans için Java 11+ önerilir).
  • IDE – IntelliJ IDEA veya Eclipse, otomatik tamamlama ve hata ayıklama ile işinizi kolaylaştırır.
  • PDF Belgesi – Barkodlu bir test PDF’niz olsun (faturalar, nakliye etiketleri veya ürün katalogları iyi çalışır).

Bilgi Önkoşulları

Aşağıdakilerde rahat olmalısınız:

  • Temel Java sözdizimi ve nesne‑yönelimli kavramlar
  • try‑catch bloklarıyla istisna yönetimi
  • IDE’nizde harici kütüphanelerle çalışma

Üçüncü‑taraf Java kütüphanelerine yeniyseniz endişelenmeyin—her şeyi adım adım anlatacağız.

GroupDocs.Signature’ı Java için Kurma

GroupDocs.Signature ile başlamak sadece birkaç dakika sürer. İşte tam kurulum süreci:

Adım 1: Bağımlılığı Ekleyin

Kütüphaneyi eklemek için Maven veya Gradle kullanın (yukarıdaki koda bakın). Bağımlılığı ekledikten sonra JAR dosyalarını indirmek için projenizi yenileyin.

Adım 2: Lisans Alımı

GroupDocs çeşitli lisans seçenekleri sunar:

Pro İpucu: Kanıt‑konseptinizi oluşturmak için ücretsiz deneme ile başlayın, ardından API ihtiyaçlarınıza uygunsa yükseltin.

Adım 3: Temel Başlatma

Signature sınıfı, PDF’yi belleğe yükleyen ve arama, doğrulama ve çıkarma metodlarını sunan giriş noktasıdır.

import com.groupdocs.signature.Signature;

String filePath = "YOUR_DOCUMENT_DIRECTORY/sample_signed.pdf"; // Replace with your PDF path
Signature signature = new Signature(filePath);

Önemli: Windows’ta dosya yolunun çift ters eğik çizgi (C:\\Documents\\file.pdf) kullandığından emin olun, kaçış sorunlarını önlemek için.

Uygulama Kılavuzu

Şimdi eğlenceli kısma geçelim—PDF’nizde barkodları aramak için kodu yazalım.

Bir Belgede Barkod İmzalarını Arama

Uygulamayı üç net adıma böleceğiz.

Adım 1: Signature Nesnesini Başlatma

Signature, PDF belgesini bellekte temsil eden temel sınıftır.

import com.groupdocs.signature.Signature;

String filePath = "YOUR_DOCUMENT_DIRECTORY/sample_signed.pdf"; // Replace with actual file path
Signature signature = new Signature(filePath);

Burada Ne Oluyor – Signature nesnesi PDF’nizi açar ve işlemeye hazırlar. Bunu bir metin düzenleyicide dosya açmak gibi düşünün; belgeyi sorgulayabilmek için yüklüyorsunuz.

Gerçek Dünya Notu – Kullanıcı yüklediği PDF’leri işlerken, Signature nesnesini oluşturmadan önce dosya yolunu doğrulayın ve varlığını kontrol edin. Bu, ileride belirsiz “dosya bulunamadı” hatalarını önler.

Adım 2: BarcodeSearchOptions Oluşturma

BarcodeSearchOptions, motorun neyi ve nerede arayacağını belirler.

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

Tanım Açıklaması: BarcodeSearchOptions, sayfa aralığı, barkod tipleri ve algılama doğruluğu gibi barkod arama parametrelerini yapılandırır.

Ana Yapılandırma Seçenekleri

  • setAllPages(true): Tüm sayfaları tarar. Kesin sayfayı bildiğinizde false yapın ve setPageNumber() belirleyin.
  • setEncodeType(BarcodeEncodeType.QR): Aramayı QR kodlarıyla sınırlar, büyük PDF’lerde işleme süresini %60’a kadar azaltır.

Neden Önemli – Faturalarınızda QR kodları her zaman 1. sayfada yer alıyorsa, tüm belgeyi taramak CPU döngülerini boşa harcar.

Adım 3: Aramayı Çalıştırma ve Sonuçları İşleme

Aramayı çalıştırın, ardından sonuçlar üzerinde döngü kurun.

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

Tanım Açıklaması: BarcodeSignature, algılanan bir barkodu temsil eder; tipini, çözülen metni, sayfa numarasını ve geometrik sınırlarını sunar.

Bu Kod Ne Yapıyor

  1. signature.search() çağırarak BarcodeSignature nesnelerinin bir listesini alır.
  2. Null‑pointer istisnalarını önlemek için barkod bulunup bulunmadığını kontrol eder.
  3. Her eşleşme için tip, metin, sayfa numarası ve boyutları çıkarır.
  4. Bozuk PDF’leri veya eksik dosyaları nazikçe ele almak için tüm işlemi bir try‑catch bloğuna sarar.
  5. Signature örneğini finally bloğunda serbest bırakarak belleği temizler.

Gerçek Dünya Uygulaması – Nakliye etiketi iş akışında getText() (takip numarası) veritabanına kaydedersiniz ve getPageNumber() ile etiketi orijinal toplu dosyaya eşlersiniz.

Barkod Tipine Göre Filtreleme

Tam barkod formatını biliyorsanız, algılamayı hızlandırmak için filtreleyin:

import com.groupdocs.signature.domain.barcodes.BarcodeTypes;

BarcodeSearchOptions options = new BarcodeSearchOptions();
options.setEncodeType(BarcodeTypes.QR); // Only search for QR codes
options.setAllPages(true);

Ne Zaman Filtrelenir – Aramayı tek bir tipe (ör. QR) sınırlamak, görsel öğeleri çok olan belgelerde CPU kullanımını %30‑50 azaltabilir.

Desteklenen Barkod Tipleri

GroupDocs.Signature çok çeşitli barkod formatlarını algılayabilir. İşte hızlı bir referans:

1D Barkodlar (Doğrusal)

  • Code128 – nakliye ve paketlemede yaygın
  • Code39 – otomotiv ve savunma sektörlerinde kullanılır
  • EAN13/EAN8 – perakende ürün barkodları
  • UPC‑A/UPC‑E – Kuzey Amerika perakende standardı
  • Interleaved2of5 – depo ve dağıtım

2D Barkodlar (Matris)

  • QR Code – en popüler, URL’ler, Wi‑Fi kimlik bilgileri vb. depolar
  • Data Matrix – kompakt, küçük bileşenler için ideal
  • PDF417 – devlet kimlikleri, biniş kartları, sürücü belgeleri
  • Aztec Code – ulaşım biletleri

Tipine göre filtreleme (yukarıda gösterildiği gibi) ihtiyacınız olan tam formata odaklanmanıza yardımcı olur.

Gerçek Dünya Kullanım Senaryoları

1. Otomatik Fatura İşleme

Senaryo: Muhasebe departmanı günde 500+ tedarikçi faturasını PDF olarak alır.

Çözüm: Her PDF’yi, fatura numaralarını içeren Code39 barkodları için tarar ve ardından bunları ERP sistemindeki satın alma siparişleriyle otomatik eşleştirir. Bu, manuel veri girişini ortadan kaldırır ve hataları %85 azaltır.

// Pseudo-code workflow
for (PDF invoice : invoiceBatch) {
    List<BarcodeSignature> barcodes = searchBarcodes(invoice);
    String invoiceNumber = barcodes.get(0).getText();
    updateERPSystem(invoiceNumber, invoice);
}

2. Depo Envanter Güncellemeleri

Senaryo: Bir depo, ürün SKU’larını EAN13 barkodları olarak gömülü PDF paket listeleriyle gönderimler alır.

Çözüm: Paket listelerinden tüm barkodları çıkarın, envanter sayımlarını otomatik güncelleyin ve uyumsuzlukları manuel inceleme için işaretleyin.

3. Belge Doğrulama

Senaryo: Hukuki sözleşmeler, özgünlük doğrulaması için kriptografik imzalar içeren QR kodları içerir.

Çözüm: İmzalı sözleşmelerde QR kodlarını arayın, imza verilerini çözün ve güvenilir bir sertifika otoritesine karşı doğrulayın. Bu, belgelerin değiştirilmediğini garanti eder.

4. Sağlık Kayıtları Yönetimi

Senaryo: Hasta dosyaları, örnek kimlikleri için Code128 barkodları içeren PDF laboratuvar raporları içerir.

Çözüm: Örnek kimliklerini otomatik olarak çıkarın ve laboratuvar sonuçlarını hastane bilgi sistemindeki (HIS) hasta kayıtlarına bağlayın; arama süresini dakikalardan saniyelere düşürün.

Yaygın Sorunlar ve Çözümler

Sorun 1: “Barkod Bulunamadı” (Mevcut olmasına rağmen)

Olası Nedenler

  • Düşük görüntü çözünürlüğü (200 DPI altında)
  • Barkod, algılayıcı motor için çok küçük
  • Yanlış barkod tipi filtresi

Çözümler

  1. DPI’yi artırın – 300 DPI veya daha yüksek tarayın.
  2. Tip filtresini kaldırın – Önce tüm barkod tiplerini arayın, ardından daraltın.
  3. Görsel kaliteyi doğrulayın – PDF’yi Adobe Acrobat’ta açın, %200 yakınlaştırın ve barkodun net göründüğünden emin olun.

Sorun 2: Büyük PDF’lerde OutOfMemoryError

Neden – Yüksek çözünürlüklü görüntüler içeren 500‑sayfalık PDF’yi yüklemek çok fazla yığın belleği tüketir.

Çözüm – Tüm dosyayı yüklemek yerine sayfaları toplu olarak işleyin:

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

Ayrıca çok büyük toplular için JVM yığınını (-Xmx4g) artırmayı düşünün.

Sorun 3: Çok Sayfalı Belgelerde Yavaş Performans

Neden – Her sayfayı sırayla taramak zaman alıcı olabilir.

Çözümler

  1. Belirli Sayfaları Hedefleyin – Barkodlar her zaman 1. sayfadaysa, setAllPages(false) ve setPageNumber(1) ayarlayın.
  2. Sonuçları Önbellekle – Aynı dosyayı yeniden işlemekten kaçınmak için ilk taramadan sonra barkod verilerini saklayın.
  3. SSD Depolama Kullanın – Daha hızlı I/O, HDD’lere göre yükleme süresini %60‑70 azaltabilir.

Sorun 4: Yanlış Pozitifler (Rastgele desenlerin barkod olarak algılanması)

Neden – Tablo veya ızgara çizgileri barkod olarak yanlış algılanabilir.

Çözüm – Kabul etmeden önce çözülen metnin uzunluğunu ve desenini doğrulayın:

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

Büyük Belgeler İçin Performans İpuçları

1. Toplu İşleme Stratejisi

Birden fazla PDF’yi aynı anda işlemek için bir iş parçacığı havuzu kullanın:

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

Sonuç: 1 000 dosyanın işlenmesi, dört çekirdekli bir makinede ~2 saatten ~30 dakikaya düşer.

2. Arama Kapsamını Azaltma

Barkodlar her zaman aynı bölgede görünüyorsa, arama alanını sınırlayın:

// Only search the top‑right corner where barcodes are typically placed
options.setRectangle(new Rectangle(400, 50, 150, 150)); // X, Y, Width, Height

Sonuç: Tutarlı düzenlere sahip belgelerde %40‑60 daha hızlı.

3. Bellek Kullanımını İzleme

Uzun süren toplu işler için periyodik olarak çöp toplama çağırın:

Runtime runtime = Runtime.getRuntime();
long usedMemory = runtime.totalMemory() - runtime.freeMemory();

if (usedMemory > (runtime.maxMemory() * 0.8)) {
    System.gc(); // Suggest garbage collection
}

En İyi Uygulamalar

1. Signature Nesnelerini Her Zaman Serbest Bırakın

Signature, AutoCloseable uygular; try‑with‑resources kullanmak temizlik garantiler:

try (Signature signature = new Signature(filePath)) {
    // Your search code here...
} // Automatically disposed

2. Girdi Dosyalarını Doğrulayın

Harici yolları körü körüne güvenmeyin. Önce varlığı ve PDF geçerliliğini doğrulayın:

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. Barkod Algılama Sonuçlarını Günlüğe Kaydedin

Uyumluluk ve hata ayıklama için bir denetim izi tutun:

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. Farklı Barkod Formatlarını İşleyin

BarcodeEncodeType değerlerinin bir listesini kabul eden esnek bir yöntem oluşturun; böylece kod değişikliği yapmadan yeni standartlara uyum sağlayabilirsiniz:

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. Gerçek Dünya Belgeleriyle Test Edin

Kahve lekeli taranmış faturalar, gürültülü faks gönderim etiketleri ve düşük çözünürlüklü telefon fotoğraflarının PDF’ye dönüştürülmüş hallerini kullanın. Bu, temiz örnek PDF’lerin gizlediği kenar durumlarını ortaya çıkarır.

GroupDocs.Signature PDF’lerde QR kodlarını nasıl algılar?

PDF’yi bir Signature örneğiyle yükleyin, BarcodeSearchOptions‘ı QR kodlarını hedefleyecek şekilde yapılandırın ve search()‘ı çağırın. Motor, her sayfayı dahili olarak 150 DPI’de bitmap’e dönüştürür, hızlı bir Z‑Bar tabanlı çözücü çalıştırır ve çözülen metin ve geometrik verileri içeren BarcodeSignature nesnelerini döndürür. Bu işlem tipik bir 8‑çekirdek sunucuda 300‑sayfalık bir belge için 5 saniyenin altında tamamlanır.

Sıkça Sorulan Sorular

S: QR kodlu PDF dosyalarını lisans olmadan okuyabilir miyim?
C: Ücretsiz deneme, değerlendirme amaçlı QR kodlu PDF dosyalarını okumanıza izin verir, ancak üretim dağıtımları için ticari lisans gereklidir.

S: API şifre korumalı PDF’leri destekliyor mu?
C: Evet. Signature nesnesini oluştururken şifreyi geçin, örneğin new Signature(filePath, "password").

S: Düşük çözünürlüklü taramalarda algılamayı nasıl iyileştiririm?
C: Minimum 200 DPI ile tarayın, setEncodeType(BarcodeEncodeType.QR)‘yi etkinleştirin ve PDF’yi bir gürültü azaltma filtresiyle ön işleme almayı düşünün.

S: Arama paralel işleme için çok iş parçacıklı (thread‑safe) mi?
C: Her iş parçacığı kendi Signature nesnesini oluşturmalıdır. API bu şekilde kullanıldığında çok iş parçacıklı güvenlidir.

S: Bu öğreticide hangi GroupDocs.Signature sürümü test edildi?
C: Kod, 23.12 sürümü GroupDocs.Signature ile doğrulandı; bu sürüm 50+ barkod formatını destekler ve tüm dosyayı belleğe yüklemeden çok sayfalı PDF’leri işleyebilir.

Sonuç

Java ve GroupDocs.Signature API’sını kullanarak read QR code PDF belgelerini nasıl okuyacağınızı yeni öğrendiniz. İşte kısa bir özet:

  • Kurulum – Maven/Gradle bağımlılığını ekleyin, lisans alın ve Signature örneğini oluşturun.
  • Uygulama – BarcodeSearchOptions yapılandırın, search() çalıştırın ve BarcodeSignature sonuçlarını işleyin.
  • Desteklenen Tipler – QR, Data Matrix, PDF417, Code128 ve EAN13 dahil 50’den fazla barkod formatı.
  • Gerçek Dünya Kullanım Senaryoları – Fatura otomasyonu, envanter güncellemeleri, belge doğrulama ve sağlık kayıtları yönetimi.
  • Sorun Giderme – Eksik barkodlar, bellek hataları, performans darboğazları ve yanlış pozitifler için çözümler.
  • Performans – Toplu işleme, sayfa aralığı sınırlama ve SSD I/O, verimliliği büyük ölçüde artırır.

GroupDocs.Signature, karmaşık PDF renderleme ve barkod çözme adımlarını soyutlayarak, önemli iş mantığına odaklanmanızı sağlar. Küçük bir yardımcı program ya da büyük ölçekli bir belge işleme hattı inşa ediyor olsanız, artık güvenilir ve yüksek performanslı bir çözümünüz var.

Son Güncelleme: 2026-07-15
Test Edilen Sürüm: GroupDocs.Signature 23.12
Yazar: GroupDocs

İlgili Öğreticiler