Jak zobrazit náhled PDF v Javě – Vytvořit PNG miniatury (průvodce 2025)

Už jste někdy potřebovali vědět jak zobrazit náhled PDF v Javě, aniž byste nutili uživatele stáhnout celý soubor? Ať už budujete systém pro správu dokumentů, vytváříte prohlížeč souborů nebo jen chcete uživatelům poskytnout rychlý náhled na obsah, preview pdf java je převrat.

Pokud potřebujete rychle preview pdf java soubory, tento průvodce vám přesně ukáže, jak na to. Pravda je taková: ruční vytváření miniatur nebo náhledů může být noční můra. Potřebovali byste různé knihovny pro různé typy souborů, zvládat různé formáty a bojovat s okrajovými případy. Zde přichází na řadu GroupDocs.Annotation for Java – je to jako švýcarský armádní nůž pro generování náhledů dokumentů.

V tomto tutoriálu se naučíte, jak vytvořit vysoce kvalitní PNG náhledy z prakticky libovolného typu dokumentu pomocí jen několika řádků Java kódu. Pokryjeme vše od základního nastavení po pokročilé optimalizační techniky a přidáme reálné příklady, které můžete skutečně použít ve svých projektech.

Co se naučíte:

  • Nastavení GroupDocs.Annotation for Java (správným způsobem)
  • Generování krystalicky čistých PNG náhledů s minimálním kódem
  • Jemné ladění možností náhledu pro různé případy použití
  • Řešení běžných problémů dříve, než se stanou potížemi
  • Optimalizace výkonu pro produkční prostředí

Jste připraveni změnit způsob, jakým vaše aplikace pracuje s náhledy dokumentů? Pojďme na to!

Rychlé odpovědi

  • Jaká knihovna vytváří preview pdf java? GroupDocs.Annotation for Java
  • Kolik řádků kódu je potřeba? Přibližně 10–15 řádků pro základní náhled
  • Jaký formát obrázku se doporučuje? PNG pro bezztrátovou kvalitu
  • Mohu náhledovat více stránek najednou? Ano, specifikujte čísla stránek v PreviewOptions
  • Je licence vyžadována pro produkci? Ano, komerční licence odstraňuje vodoznaky

Co je how to preview PDF v Javě?

how to preview pdf označuje proces renderování každé stránky PDF (nebo jiného podporovaného dokumentu) jako obrázku – typicky PNG nebo JPEG – pomocí Java kódu. To vám umožní zobrazovat miniatury dokumentů ve webových aplikacích, mobilních aplikacích nebo desktopových nástrojích, aniž byste nutili uživatele stáhnout nebo otevřít původní soubor.

Proč použít GroupDocs.Annotation pro generování náhledů PDF?

Krása GroupDocs.Annotation spočívá v tom, že se postará o veškeré těžké zvedání – nemusíte se starat o to, zda pracujete s PDF, Word dokumentem, Excel tabulkou nebo PowerPoint prezentací. Jedno API, všechny formáty. Navíc convert document to image formáty jako PNG, JPEG, BMP a další, což z něj dělá ideální řešení pro jakýkoli vizuální scénář náhledu.

Kdy použít tuto funkci

Než se pustíme do kódu, pojďme si probrat, kdy generování náhledů stránek dokumentu opravdu zazáří. Budete to považovat za neuvěřitelně užitečné, pokud pracujete na:

  • Systémech pro správu dokumentů – Uživatelé mohou rychle procházet soubory, aniž by je otevírali. Přemýšlejte o tom, jak Google Drive zobrazuje náhledy dokumentů – přesně tohle stavíme zde.
  • E‑commerce platformách – Prodáváte digitální produkty jako eKnihy, šablony nebo reporty? Náhledové obrázky pomáhají zákazníkům vidět, co kupují, což může výrazně zvýšit konverzní poměr.
  • Právním softwaru – Právníci a paralegálové často potřebují rychle odkazovat na konkrétní stránky smluv, výpovědí nebo soudních spisů. Náhledové miniatury tento proces zrychlí.
  • Vzdělávacích platformách – Studenti mohou před stažením nebo studiem prohlédnout stránky učebnic, úkolů nebo referenčních materiálů.
  • Schvalovacích pracovních postupech – Marketingové týmy, vydavatelé a tvůrci obsahu mohou rychle zkontrolovat rozvržení a obsah dokumentu na první pohled, aniž by otevírali více aplikací.

Předpoklady

Ujistěme se, že máte vše potřebné, než začneme kódovat. Nebojte se – nastavení je poměrně jednoduché.

Požadované knihovny a závislosti

Hlavní hvězdou našeho představení je GroupDocs.Annotation for Java. Pro správu závislostí použijeme Maven, protože, buďme upřímní, už nikdo nechce ručně stahovat a konfigurovat JAR soubory.

Požadavky na nastavení prostředí

  • Java Development Kit (JDK): Potřebujete JDK 8 nebo vyšší. Pokud stále používáte starší verzi, je čas na upgrade – získáte lepší výkon a bezpečnostní funkce.
  • Nástroj pro sestavení: Maven nebo Gradle (v příkladech použijeme Maven, ale koncepty se snadno přenášejí)
  • IDE: I když můžete použít jakýkoli textový editor, doporučuji IntelliJ IDEA nebo Eclipse pro lepší ladění a automatické doplňování

Znalostní předpoklady

Měli byste být pohodlní s základním programováním v Javě a rozumět tomu, jak fungují Maven závislosti. Pokud jste v Maven noví, nepanikařte – koncepty, které použijeme, jsou poměrně jednoduché a můžete se vždy odkázat na Maven průvodce pro začátečníky.

Nastavení GroupDocs.Annotation for Java

Tady se pustíme do samotného nastavení. Dobrá zpráva? GroupDocs tento proces dělá překvapivě snadným.

Maven konfigurace:
Přidejte tuto konfiguraci do souboru pom.xml, aby se do projektu zahrnula GroupDocs.Annotation:

<repositories>
   <repository>
      <id>repository.groupdocs.com</id>
      <name>GroupDocs Repository</name>
      <url>https://releases.groupdocs.com/annotation/java/</url>
   </repository>
</repositories>
<dependencies>
   <dependency>
      <groupId>com.groupdocs</groupId>
      <artifactId>groupdocs-annotation</artifactId>
      <version>25.2</version>
   </dependency>
</dependencies>

Tip: Vždy zkontrolujte nejnovější číslo verze na webu GroupDocs. Pravidelně vydávají aktualizace s opravami chyb a novými funkcemi.

Získání licence

Je důležité pochopit licencování. GroupDocs.Annotation není zdarma pro komerční použití, ale hodnocení je snadné:

  • Bezplatná zkušební verze: Ideální pro testování a malé projekty. Stáhněte ji ze stránky vydání GroupDocs. Zkušební verze přidává vodoznaky do vašich náhledů, což je v pořádku pro vývoj.
  • Dočasná licence: Potřebujete více času na vyzkoušení? Požádejte o ni na jejich support fóru a získáte prodlouženou zkušební verzi bez vodoznaků.
  • Plná licence: Když jste připraveni na produkci, navštivte stránku nákupu a zakupte licenci. Cena je rozumná vzhledem k tomu, co získáte.

Základní inicializace

Začít je tak jednoduché, jako importovat potřebné třídy a vytvořit instanci Annotator. Uvidíme to v akci v další sekci, ale hlavní věc, kterou si zapamatujte, je, že GroupDocs dodržuje standardní Java konvence – žádné podivné inicializační rituály nebo složité konfigurační soubory.

Průvodce implementací: Vytváření náhledů stránek dokumentu

Teď přichází zábavná část – skutečně vygenerujeme náhledy dokumentů! Proces je přímočarý, ale existují některé nuance, které stojí za pochopení.

Porozumění procesu generování náhledu

Představte si generování náhledu dokumentu jako tříkrokový tanec:

  1. Konfigurace vzhledu a umístění náhledů
  2. Specifikace stránek, které chcete náhledovat
  3. Generování samotných obrázků

GroupDocs.Annotation se postará o veškerou složitost v pozadí – detekci formátu, renderování stránek, optimalizaci obrázků a výstup souborů. Vy jen řeknete, co chcete.

Krok 1: Definice možností náhledu

Zde nastavujete plán pro generování náhledu. Rozhraní CreatePageStream může na první pohled vypadat zastrašujícím dojmem, ale je ve skutečnosti docela šikovné – umožňuje dynamicky rozhodnout, kam má každá náhledová obrázková data jít.

import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.exception.GroupDocsException;
import com.groupdocs.annotation.options.pagepreview.CreatePageStream;
import com.groupdocs.annotation.options.pagepreview.PreviewFormats;
import com.groupdocs.annotation.options.pagepreview.PreviewOptions;
import java.io.FileOutputStream;
import java.io.OutputStream;

PreviewOptions previewOptions = new PreviewOptions(new CreatePageStream() {
    @Override
    public OutputStream invoke(int pageNumber) {
        String fileName = "YOUR_OUTPUT_DIRECTORY/GenerateDocumentPagesPreview_" + pageNumber + ".png";
        try {
            return new FileOutputStream(fileName);
        } catch (Exception ex) {
            throw new GroupDocsException(ex); // Handle exceptions appropriately.
        }
    }
});

Co se zde děje? Rozhraní CreatePageStream je voláno pro každou stránku, kterou chcete náhledovat. Parametr pageNumber vám říká, která stránka se právě zpracovává, takže můžete vytvořit jedinečná jména souborů. Tento přístup poskytuje maximální flexibilitu – můžete ukládat soubory do různých adresářů, používat různé konvence pojmenování nebo dokonce streamovat obrázky přímo do webové odpovědi.

Krok 2: Konfigurace možností náhledu

Nyní můžete doladit, jak budou vaše náhledy vypadat a chovat se:

previewOptions.setResolution(85); // Set desired resolution.
previewOptions.setPreviewFormat(PreviewFormats.PNG); // Choose PNG as the output format.
previewOptions.setPageNumbers(new int[]{1, 2}); // Specify pages to generate previews for.

Rozlišení má význam: Nastavení rozlišení přímo ovlivňuje jak kvalitu obrázku, tak velikost souboru. Rychlý přehled:

  • 72 DPI: Dobré pro webové miniatury, malé soubory
  • 96 DPI: Standard pro většinu webových aplikací, dobrá rovnováha kvality a velikosti
  • 150 DPI: Vyšší kvalita, vhodná pro tisk nebo detailní prohlížení
  • 300 DPI: Tisková kvalita, velké soubory

Výběr formátu: V tomto příkladu používáme PNG (nejlepší kvalita), ale GroupDocs také podporuje JPEG, pokud potřebujete menší soubory a nevadí vám kompresní artefakty.

Výběr stránek: Metoda setPageNumbers vám umožní vybrat konkrétní stránky k náhledu. To je neuvěřitelně užitečné u velkých dokumentů, kde potřebujete náhledy jen klíčových stránek.

Krok 3: Generování náhledů

Tady se děje kouzlo:

try (Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf")) {
    annotator.getDocument().generatePreview(previewOptions);
}

Proč try‑with‑resources? Zajišťuje, že dokument bude po zpracování správně uzavřen, což je klíčové pro správu paměti a předcházení zamykání souborů. GroupDocs.Annotation implementuje AutoCloseable, takže tento vzor funguje perfektně.

Pozor na cestu k souboru: Ujistěte se, že vstupní cesta k souboru je správná a soubor skutečně existuje. Také zajistěte, aby výstupní adresář existoval před spuštěním kódu – GroupDocs jej automaticky nevytvoří.

Časté úskalí a jak se jim vyhnout

Problémy s pamětí: Velké dokumenty mohou během generování náhledů spotřebovat značnou paměť. Pokud zpracováváte mnoho dokumentů nebo velmi velké soubory, zvažte:

  • Zpracování dokumentů v menších dávkách
  • Zvýšení velikosti haldy JVM pomocí parametru -Xmx
  • Použití nižšího rozlišení pro úvodní náhledy

Oprávnění k souborům: Ujistěte se, že má vaše aplikace právo zápisu do výstupního adresáře. To je zvláště důležité v kontejnerizovaných prostředích nebo na serverech s přísnými bezpečnostními politikami.

Podpora formátů: I když GroupDocs podporuje mnoho formátů, vždy testujte s vašimi konkrétními typy dokumentů. Některé vzácné nebo velmi staré formáty nemusí být podporovány a budete je muset ošetřit.

Pokročilá konfigurace a osvědčené postupy

Posuňme generování náhledů dokumentů na vyšší úroveň pomocí pokročilých technik a optimalizací.

Dynamické strategie pojmenování souborů

Základní příklad ukazuje jednoduchou konvenci, ale ve skutečných aplikacích často potřebujete sofistikovanější přístupy:

PreviewOptions previewOptions = new PreviewOptions(new CreatePageStream() {
    @Override
    public OutputStream invoke(int pageNumber) {
        // Include timestamp for cache busting
        String timestamp = String.valueOf(System.currentTimeMillis());
        String fileName = String.format("preview_%s_page_%d_%s.png", 
                                      documentId, pageNumber, timestamp);
        String fullPath = outputDirectory + "/" + fileName;
        
        try {
            return new FileOutputStream(fullPath);
        } catch (Exception ex) {
            throw new GroupDocsException(ex);
        }
    }
});

Tento přístup vám poskytuje:

  • Jedinečná jména souborů, která se nekolidují
  • Snadnou identifikaci, ke kterému dokumentu náhled patří
  • Vestavěné „cache busting“ pro webové aplikace

Dávkové zpracování více dokumentů

Když potřebujete generovat náhledy pro více dokumentů, efektivita je klíčová:

public void generatePreviewsForDocuments(List<String> documentPaths, String outputDir) {
    for (String docPath : documentPaths) {
        try (Annotator annotator = new Annotator(docPath)) {
            String docName = Paths.get(docPath).getFileName().toString();
            
            PreviewOptions options = new PreviewOptions(pageNumber -> {
                String fileName = String.format("%s/%s_page_%d.png", 
                                               outputDir, docName, pageNumber);
                try {
                    return new FileOutputStream(fileName);
                } catch (Exception ex) {
                    throw new GroupDocsException(ex);
                }
            });
            
            options.setResolution(96);
            options.setPreviewFormat(PreviewFormats.PNG);
            
            annotator.getDocument().generatePreview(options);
            
        } catch (Exception ex) {
            // Log error but continue processing other documents
            System.err.println("Failed to process " + docPath + ": " + ex.getMessage());
        }
    }
}

Tipy pro optimalizaci výkonu

Správa paměti: Pro produkční aplikace monitorujte využití paměti a zvažte implementaci strategií úklidu:

// Force garbage collection after processing large batches
System.gc();

Paralelní zpracování: Pro velké sady dokumentů můžete zvážit paralelní zpracování (ale dejte pozor na spotřebu paměti):

documentPaths.parallelStream().forEach(this::generatePreviewForDocument);

Strategie cachování: Implementujte inteligentní cachování, abyste se vyhnuli zbytečnému opakovanému generování náhledů:

  • Zkontrolujte, zda náhledové soubory již existují a jsou novější než zdrojový dokument
  • Použijte časové razítko souboru k určení, zda je potřeba regenerovat
  • Zvažte ukládání metadat náhledu do databáze pro rychlejší vyhledávání

Reálné příklady integrace

Podívejme se, jak se generování náhledů hodí do skutečných aplikací, které můžete stavět.

Integrace do webové aplikace

Zde je ukázka, jak můžete tento proces začlenit do Spring Boot webové aplikace:

@RestController
public class DocumentPreviewController {
    
    @GetMapping("/api/documents/{id}/preview/{pageNumber}")
    public ResponseEntity<byte[]> getDocumentPreview(
            @PathVariable String id, 
            @PathVariable int pageNumber) {
        
        // Check if preview already exists
        String previewPath = getPreviewPath(id, pageNumber);
        if (Files.exists(Paths.get(previewPath))) {
            byte[] imageBytes = Files.readAllBytes(Paths.get(previewPath));
            return ResponseEntity.ok()
                    .contentType(MediaType.IMAGE_PNG)
                    .body(imageBytes);
        }
        
        // Generate preview if it doesn't exist
        generatePreviewForPage(id, pageNumber);
        
        // Return the generated preview
        byte[] imageBytes = Files.readAllBytes(Paths.get(previewPath));
        return ResponseEntity.ok()
                .contentType(MediaType.IMAGE_PNG)
                .body(imageBytes);
    }
}

Integrace do systému pro správu dokumentů

Pro podnikovou správu dokumentů můžete chtít generovat náhledy asynchronně:

@Service
public class DocumentPreviewService {
    
    @Async
    public CompletableFuture<List<String>> generatePreviewsAsync(String documentPath) {
        List<String> previewPaths = new ArrayList<>();
        
        try (Annotator annotator = new Annotator(documentPath)) {
            // Get total page count first
            int pageCount = annotator.getDocument().getPages().size();
            
            PreviewOptions options = new PreviewOptions(pageNumber -> {
                String previewPath = generatePreviewPath(documentPath, pageNumber);
                previewPaths.add(previewPath);
                
                try {
                    return new FileOutputStream(previewPath);
                } catch (Exception ex) {
                    throw new GroupDocsException(ex);
                }
            });
            
            // Generate previews for all pages
            int[] allPages = IntStream.rangeClosed(1, pageCount).toArray();
            options.setPageNumbers(allPages);
            options.setResolution(150);
            
            annotator.getDocument().generatePreview(options);
        }
        
        return CompletableFuture.completedFuture(previewPaths);
    }
}

Úvahy o výkonu a optimalizaci

Když pracujete s generováním náhledů dokumentů v produkci, výkon je kritický. Zaměřte se na následující oblasti:

Strategie správy paměti

Limity velikosti dokumentu: Velké dokumenty mohou rychle spotřebovat dostupnou paměť. Zvažte implementaci kontrol velikosti:

File documentFile = new File(documentPath);
long fileSizeInMB = documentFile.length() / (1024 * 1024);

if (fileSizeInMB > 50) { // Adjust threshold based on your server capacity
    // Process with lower resolution or in smaller chunks
    previewOptions.setResolution(72);
}

Úklid zdrojů: Vždy používejte try‑with‑resources a zvažte explicitní úklid pro dlouho běžící procesy:

try (Annotator annotator = new Annotator(documentPath)) {
    // Generate previews
    annotator.getDocument().generatePreview(previewOptions);
} // Automatic cleanup happens here

Škálování pro aplikace s vysokým objemem

Zpracování pomocí front: Pro aplikace, které potřebují zpracovat mnoho dokumentů, zvažte použití zprávové fronty:

@Component
public class PreviewGenerationWorker {
    
    @RabbitListener(queues = "preview-generation-queue")
    public void processPreviewRequest(PreviewRequest request) {
        try {
            generateDocumentPreviews(request.getDocumentPath(), request.getOutputDir());
        } catch (Exception ex) {
            // Handle errors, potentially retry or send to dead letter queue
            log.error("Failed to generate previews for {}", request.getDocumentPath(), ex);
        }
    }
}

Strategie cachování: Implementujte inteligentní cachování, abyste se vyhnuli zbytečnému regenerování:

public boolean shouldRegeneratePreview(String documentPath, String previewPath) {
    try {
        Path docPath = Paths.get(documentPath);
        Path prevPath = Paths.get(previewPath);
        
        if (!Files.exists(prevPath)) {
            return true; // Preview doesn't exist
        }
        
        FileTime docModified = Files.getLastModifiedTime(docPath);
        FileTime previewModified = Files.getLastModifiedTime(prevPath);
        
        return docModified.compareTo(previewModified) > 0; // Doc is newer
    } catch (Exception ex) {
        return true; // When in doubt, regenerate
    }
}

Optimalizace rozlišení a kvality

Adaptivní rozlišení: Přizpůsobte rozlišení podle zamýšleného použití:

public int getOptimalResolution(PreviewUsage usage) {
    switch (usage) {
        case THUMBNAIL: return 72;
        case WEB_DISPLAY: return 96;
        case DETAILED_REVIEW: return 150;
        case PRINT_QUALITY: return 300;
        default: return 96;
    }
}

Řešení běžných problémů

I při nejlepším nastavení se občas objeví problémy. Zde jsou nejčastější a jejich řešení:

Problémy s přístupem k souborům a oprávněními

Problém: „Přístup odmítnut“ nebo „Soubor nenalezen“
Řešení:

  • Ověřte, že cesty k souborům jsou správné a soubory existují
  • Zkontrolujte, že aplikace má oprávnění ke čtení zdrojových dokumentů
  • Ujistěte se, že máte právo zápisu do výstupních adresářů
  • Na Linux/Unix systémech zkontrolujte vlastnictví a oprávnění souborů

Problémy s pamětí a výkonem

Problém: OutOfMemoryError nebo pomalé zpracování
Řešení:

  • Zvyšte velikost haldy JVM: -Xmx2048m
  • Zpracovávejte méně stránek najednou
  • Použijte nižší rozlišení pro velké dokumenty
  • Implementujte limity velikosti dokumentu (viz výše)

Formát‑specifické problémy

Problém: Některé dokumenty negenerují náhledy správně
Řešení:

  • Ověřte, že dokument není poškozený otevřením v editoru
  • Zkontrolujte seznam podporovaných formátů v GroupDocs.Annotation (knihovna podporuje více než 50 formátů)
  • Dokumenty chráněné heslem mohou vyžadovat další nastavení (viz FAQ)
  • Ujistěte se, že na serveru jsou dostupné všechny potřebné fonty

Problémy s kvalitou výstupu

Problém: Rozmazané nebo pixelované náhledové obrázky
Řešení:

  • Zvyšte nastavení rozlišení (dávejte pozor na využití paměti)
  • Pro dokumenty s velkým množstvím textu obecně funguje PNG lépe než JPEG
  • Ujistěte se, že zdrojový dokument má dostatečnou kvalitu

Často kladené otázky

Q: Jaké formáty souborů GroupDocs.Annotation podporuje pro generování náhledů?
A: Podporováno je více než 50 formátů, včetně PDF, Word, Excel, PowerPoint, OpenDocument, běžných typů obrázků a CAD souborů jako DWG a DXF. Kompletní seznam je v oficiální dokumentaci.

Q: Mohu generovat náhledy pro dokumenty chráněné heslem?
A: Ano. Použijte konstruktor Annotator, který přijímá LoadOptions s heslem, např. new Annotator(filePath, new LoadOptions(password)).

Q: Jak zacházet s velmi velkými dokumenty, aby nedošlo k vyčerpání paměti?
A: Zpracovávejte stránky v menších dávkách, použijte nižší rozlišení pro úvodní miniatury, zvyšte velikost haldy JVM a zvažte streamování náhledů místo načítání celého dokumentu do paměti.

Q: Je možné dynamicky přizpůsobit strukturu výstupního adresáře?
A: Rozhodně. Rozhraní CreatePageStream vám dává plnou kontrolu nad tím, kde jsou soubory ukládány. Můžete organizovat podle data, typu dokumentu, uživatele nebo jakýchkoli dalších kritérií úpravou logiky cesty uvnitř invoke.

Q: Mohu generovat náhledy v jiných formátech než PNG?
A: Ano. GroupDocs.Annotation podporuje JPEG, BMP a další obrazové formáty. Přepněte formát pomocí previewOptions.setPreviewFormat(PreviewFormats.JPEG), pokud potřebujete menší soubory.

Závěr

Nyní ovládáte umění generování preview pdf java miniatur pomocí GroupDocs.Annotation! Tato výkonná funkce může změnit způsob, jakým uživatelé interagují s dokumenty ve vašich aplikacích, ať už stavíte jednoduchý prohlížeč souborů nebo komplexní podnikovou platformu pro správu dokumentů.

Klíčové body:

  • GroupDocs.Annotation vám umožní vytvořit vysoce kvalitní PNG náhledy pomocí několika řádků Java kódu
  • Flexibilní konfigurace vám umožní nastavit rozlišení, formát a výběr stránek podle jakéhokoli scénáře
  • Tipy zaměřené na výkon (správa paměti, cachování, asynchronní zpracování) udrží vaši aplikaci rychlou i při velkém zatížení
  • Robustní řešení chyb a průvodce řešením problémů vám pomohou vyhnout se běžným úskalím

Chcete jít dál? Prozkoumejte další možnosti GroupDocs.Annotation, jako je přidávání anotací, extrakce textu nebo konverze mezi formáty. Oficiální dokumentace poskytuje podrobné návody ke všem těmto funkcím.

Další kroky:

  1. Naklonujte ukázkový projekt a vyzkoušejte kód s vlastními PDF, Word nebo Excel soubory.
  2. Experimentujte s různými rozlišeními a formáty, abyste našli optimální nastavení pro vaše UI.
  3. Integrovejte generování náhledů do webového endpointu (jak je ukázáno) a cachujte výsledky pro rychlé následné načítání.

Šťastné programování a užijte si plynulejší zážitek z dokumentů, který svým uživatelům přinesete!


Poslední aktualizace: 2026-03-19
Testováno s: GroupDocs.Annotation 25.2 for Java
Autor: GroupDocs