Java PDF Dropdown Tutorial - Maak Interactieve Formulieren met GroupDocs
Inleiding
Heb je ooit moeite gehad met het maken van interactieve PDF‑formulieren in Java? Je bent niet de enige. Veel ontwikkelaars worstelen met complexe PDF‑bibliotheken die ofwel geen documentatie hebben of een steile leercurve vereisen. Daar komt GroupDocs.Annotation voor Java om de hoek kijken – het is als een Zwitsers zakmes voor PDF‑manipulatie.
In deze uitgebreide tutorial ontdek je hoe je een dropdown toevoegt aan je Java‑PDF‑formulieren met GroupDocs.Annotation. Of je nu enquêtes, bestelsystemen of goedkeuringsworkflows bouwt, deze gids leidt je stap voor stap van basisconfiguratie tot geavanceerde optimalisatietechnieken.
Wat je leert:
- GroupDocs.Annotation instellen in je Java‑project (op de juiste manier)
- Dropdown‑componenten maken met praktijkvoorbeelden
- Veelvoorkomende problemen oplossen die de meeste ontwikkelaars tegenkomen
- Prestatie‑optimalisatietrucs die je uren debuggen kunnen besparen
- Best practices voor productie‑klare PDF‑formulieren
Snelle Antwoorden
- Welke bibliotheek is het beste voor het toevoegen van dropdowns in Java‑PDF’s? GroupDocs.Annotation biedt een eenvoudige API voor java pdf form fields.
- Heb ik een licentie nodig voor ontwikkeling? Een gratis proefversie werkt voor testen; een productie‑licentie is vereist voor commercieel gebruik.
- Kan ik de dropdown overal op de pagina positioneren? Ja – gebruik de
setBox‑methode met PDF‑coördinaten (origine onder‑links). - Hoe voorkom ik geheugenproblemen met grote PDF’s? Gebruik try‑with‑resources, verwerk bestanden één voor één, en vergroot de JVM‑heap indien nodig.
- Is het mogelijk om opties uit een database te laden? Absoluut – vul de optielijst dynamisch voordat je
setOptionsaanroept.
Hoe voeg je een dropdown toe in Java‑PDF’s
Een PDF‑dropdown is in wezen een formulier‑veld dat een vooraf gedefinieerde lijst met keuzes presenteert, vergelijkbaar met een HTML‑<select>‑element. GroupDocs.Annotation abstraheert de low‑level PDF‑details, zodat je je kunt concentreren op de businesslogica van je java pdf form fields.
Waarom GroupDocs kiezen voor PDF‑Dropdowns?
Voordat we in de code duiken, vraag je je misschien af: “Waarom GroupDocs boven andere PDF‑bibliotheken?” Het punt is – ik heb met verschillende PDF‑bibliotheken gewerkt, en GroupDocs biedt de perfecte balans tussen kracht en eenvoud.
Belangrijkste voordelen:
- Intuïtieve API: In tegenstelling tot sommige bibliotheken die je PDF‑interne werking laten begrijpen, abstraheert GroupDocs de complexiteit.
- Rijke annotatie‑ondersteuning: Naast dropdowns krijg je tekstvelden, selectievakjes, handtekeningen en meer.
- Cross‑platform compatibiliteit: Werkt naadloos op verschillende besturingssystemen.
- Actieve community: Sterk ondersteuningsforum en regelmatige updates.
- Licentie‑flexibiliteit: Biedt zowel proef‑ als enterprise‑opties.
Vereisten en Installatie
Wat je nodig hebt
- Java Development Kit (JDK): Versie 8 of hoger (JDK 11+ aanbevolen).
- Maven: Voor dependency‑beheer (Gradle werkt ook, maar Maven wordt hier getoond).
- IDE: IntelliJ IDEA, Eclipse of VS Code met Java‑extensies.
- Basiskennis van Java: Begrip van klassen, objecten en try‑with‑resources.
Maven‑configuratie
Voeg GroupDocs.Annotation toe aan je project door het volgende in je pom.xml op te nemen:
<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>
Pro tip: Controleer altijd de nieuwste versie op de GroupDocs‑website. Het gebruik van verouderde versies kan compatibiliteitsproblemen en ontbrekende functionaliteit veroorzaken.
Licentie‑instelling
Voor Leren/Testen:
- Download de gratis proefversie via GroupDocs Free Trial
- De proefversie bevat watermerken maar biedt volledige functionaliteit.
Voor Productie:
- Bezoek de Purchase Page voor permanente licenties.
- Wil je testen in productie? Vraag een Temporary License.
Basisinitialisatie‑patroon
Hier is de basis die je voor alle GroupDocs‑operaties zult gebruiken:
try (final Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf")) {
// Your annotation magic happens here
// The try-with-resources ensures proper cleanup
}
Waarom dit patroon belangrijk is: De try-with-resources‑statement sluit de annotator automatisch af, waardoor geheugenlekken – een veelvoorkomend probleem bij PDF‑bibliotheken – worden voorkomen.
Stapsgewijze Implementatie‑gids
Begrijpen van Dropdown‑Componenten
Voordat we gaan coderen, laten we eerst begrijpen wat we gaan bouwen. Een PDF‑dropdown‑component is in wezen een formulier‑veld dat gebruikers een vooraf gedefinieerde lijst met opties presenteert. Zie het als een HTML‑<select>‑element, maar direct ingebed in een PDF‑document.
Veelvoorkomende use‑cases:
- Land/staat‑selectie in formulieren
- Productcategorieën in bestelformulieren
- Statusupdates in workflow‑documenten
- Beoordelingsschalen in feedback‑formulieren
Je Eerste Dropdown Maken
Stap 1: Initialiseer de Annotator
Begin met het instellen van je documentprocessor:
try (final Annotator annotator = new Annotator("YOUR_DOCUMENT_DIRECTORY/input.pdf")) {
// We'll build our dropdown here
}
Belangrijke opmerking: Vervang "YOUR_DOCUMENT_DIRECTORY/input.pdf" door het daadwerkelijke pad naar je PDF‑bestand. Een veelgemaakte fout is het gebruik van relatieve paden die breken wanneer je vanuit verschillende directories draait.
Stap 2: Maak de Dropdown‑Component
Hier begint de magie:
// Create a new DropdownComponent object
dropdownComponent = new DropdownComponent();
Dit maakt een lege dropdown‑component. Zie het als het aanmaken van een leeg formulier‑veld dat we in de volgende stappen gaan configureren.
Stap 3: Configureer Dropdown‑Opties
Nu vullen we de dropdown met selecteerbare items:
dropdownComponent.setOptions(new ArrayList<>(Arrays.asList("Item1", "Item2", "Item3")));
Praktijkvoorbeeld: Voor een klanttevredenheidsenquête kun je bijvoorbeeld gebruiken:
dropdownComponent.setOptions(new ArrayList<>(Arrays.asList(
"Very Satisfied",
"Satisfied",
"Neutral",
"Dissatisfied",
"Very Dissatisfied"
)));
Stap 4: Positioneer en Dimensioneer de Dropdown
Definieer waar je dropdown op de pagina verschijnt:
dropdownComponent.setBox(new Rectangle(100, 100, 50, 20)); // x, y, width, height
Coördinaten begrijpen: PDF‑coördinaten beginnen vanaf de onder‑linker hoek (in tegenstelling tot HTML die start links‑boven). Dus (100, 100) betekent 100 punten naar rechts en 100 punten omhoog vanaf de onder‑linker hoek.
Dimensioneringstips:
- De breedte moet je langste optie‑tekst kunnen bevatten.
- Een hoogte van 20‑25 punten werkt meestal goed voor standaardtekst.
- Test met verschillende waarden om te vinden wat er het beste uitziet in je document.
Stap 5: Voeg toe en Sla op
Tot slot integreer je de dropdown in het document:
annotator.add(dropdownComponent);
// Save changes to a new file or overwrite the existing one
annotator.save("YOUR_DOCUMENT_DIRECTORY/output.pdf");
Best practice: Sla altijd op onder een andere bestandsnaam tijdens ontwikkeling. Zo kun je resultaten vergelijken en voorkom je dat je per ongeluk je originele document beschadigt.
Volledig Werkend Voorbeeld
Hier is alles samengevoegd in een compleet, uitvoerbaar voorbeeld:
import com.groupdocs.annotation.Annotator;
import com.groupdocs.annotation.models.annotationmodels.DropdownComponent;
import com.groupdocs.annotation.models.Rectangle;
import java.util.ArrayList;
import java.util.Arrays;
public class PDFDropdownExample {
public static void main(String[] args) {
try (final Annotator annotator = new Annotator("input.pdf")) {
// Create dropdown component
DropdownComponent dropdownComponent = new DropdownComponent();
// Set dropdown options
dropdownComponent.setOptions(new ArrayList<>(Arrays.asList(
"Priority: High",
"Priority: Medium",
"Priority: Low"
)));
// Position the dropdown
dropdownComponent.setBox(new Rectangle(150, 300, 120, 25));
// Add to document and save
annotator.add(dropdownComponent);
annotator.save("output_with_dropdown.pdf");
System.out.println("Dropdown successfully added to PDF!");
} catch (Exception e) {
System.err.println("Error creating dropdown: " + e.getMessage());
}
}
}
Veelvoorkomende Valkuilen en Hoe ze te Vermijden
Probleem 1: “File Not Found”‑fouten
Probleem: Je code gooit FileNotFoundException hoewel het bestand bestaat.
Oplossing:
// Instead of relative paths like this:
new Annotator("input.pdf")
// Use absolute paths or properly constructed relative paths:
new Annotator(System.getProperty("user.dir") + "/documents/input.pdf")
// Or use Path.resolve() for more robust path handling
Probleem 2: Dropdown verschijnt op de verkeerde locatie
Probleem: Je dropdown verschijnt op een onverwachte plek in de PDF.
Oorzaak: Verwarring over het PDF‑coördinatensysteem.
Oplossing:
- Onthoud: (0,0) is onder‑links in PDF’s, niet links‑boven.
- Gebruik een PDF‑viewer met coördinatenweergave om exacte posities te vinden.
- Begin met grotere coördinaatwaarden en pas ze naar beneden aan.
Probleem 3: Licentie‑gerelateerde runtime‑fouten
Probleem: Code werkt in ontwikkeling maar faalt in productie met licentiefouten.
Snelle oplossingen:
- Controleer of je licentiebestand in het classpath staat.
- Controleer de vervaldatums van de licentie.
- Zorg dat de licentie overeenkomt met je implementatie‑omgeving (ontwikkel‑ vs. productielicenties zijn verschillend).
Probleem 4: Geheugenproblemen met grote PDF’s
Probleem: OutOfMemoryError bij het verwerken van grote documenten.
Oplossingen:
// Set JVM memory parameters
// -Xmx2g -Xms1g
// Process documents in batches if possible
// Dispose of annotator objects properly (use try-with-resources)
Praktijkvoorbeelden uit de Werkelijkheid
Voorbeeld 1: Medewerker‑Feedbackformulier
public void createFeedbackForm(String inputPdf, String outputPdf) {
try (final Annotator annotator = new Annotator(inputPdf)) {
// Department selection dropdown
DropdownComponent deptDropdown = new DropdownComponent();
deptDropdown.setOptions(new ArrayList<>(Arrays.asList(
"Engineering", "Marketing", "Sales", "HR", "Finance"
)));
deptDropdown.setBox(new Rectangle(200, 500, 100, 25));
// Performance rating dropdown
DropdownComponent ratingDropdown = new DropdownComponent();
ratingDropdown.setOptions(new ArrayList<>(Arrays.asList(
"Exceeds Expectations", "Meets Expectations", "Below Expectations"
)));
ratingDropdown.setBox(new Rectangle(200, 450, 150, 25));
annotator.add(deptDropdown);
annotator.add(ratingDropdown);
annotator.save(outputPdf);
} catch (Exception e) {
log.error("Failed to create feedback form: {}", e.getMessage());
}
}
Voorbeeld 2: Bestelformulier met Dynamische Opties
Dit voorbeeld laat zien hoe je dropdown‑opties uit een database kunt vullen:
public void createOrderForm(String inputPdf, List<String> products) {
try (final Annotator annotator = new Annotator(inputPdf)) {
DropdownComponent productDropdown = new DropdownComponent();
// Add a default option
List<String> options = new ArrayList<>();
options.add("-- Select Product --");
options.addAll(products);
productDropdown.setOptions(options);
productDropdown.setBox(new Rectangle(150, 400, 200, 25));
annotator.add(productDropdown);
annotator.save("order_form_" + System.currentTimeMillis() + ".pdf");
} catch (Exception e) {
throw new RuntimeException("Order form creation failed", e);
}
}
Tips voor Prestatie‑optimalisatie
Geheugenbeheer
Bij het verwerken van meerdere PDF’s of grote documenten wordt geheugenbeheer cruciaal:
// Good: Process documents one at a time
for (String pdfFile : pdfFiles) {
try (final Annotator annotator = new Annotator(pdfFile)) {
// Process individual file
addDropdowns(annotator);
annotator.save(getOutputPath(pdfFile));
} // Annotator automatically closed here
}
// Avoid: Creating multiple annotators simultaneously
// This can quickly exhaust memory
Batch‑verwerkingsstrategie
Voor scenario’s met hoog volume:
public void processBatch(List<String> pdfFiles, int batchSize) {
for (int i = 0; i < pdfFiles.size(); i += batchSize) {
List<String> batch = pdfFiles.subList(i,
Math.min(i + batchSize, pdfFiles.size()));
processBatchOfFiles(batch);
// Force garbage collection between batches
System.gc();
}
}
Caching‑overwegingen
Als je soortgelijke documenten herhaaldelijk verwerkt:
// Cache dropdown configurations
private static final Map<String, List<String>> DROPDOWN_OPTIONS = Map.of(
"countries", Arrays.asList("USA", "Canada", "UK", "Germany"),
"priorities", Arrays.asList("High", "Medium", "Low")
);
public DropdownComponent createStandardDropdown(String type, Rectangle position) {
DropdownComponent dropdown = new DropdownComponent();
dropdown.setOptions(new ArrayList<>(DROPDOWN_OPTIONS.get(type)));
dropdown.setBox(position);
return dropdown;
}
Geavanceerde Technieken
Styling van Dropdowns
Hoewel GroupDocs.Annotation zich richt op functionaliteit boven visuele aanpassing, kun je toch de weergave beïnvloeden:
dropdownComponent.setBox(new Rectangle(100, 100, 150, 30)); // Wider for better readability
// The library handles font and color based on PDF defaults
Conditionele Dropdown‑creatie
Soms heb je dropdowns alleen onder bepaalde voorwaarden nodig:
public void addConditionalDropdowns(Annotator annotator, DocumentType docType) {
if (docType == DocumentType.SURVEY) {
addSurveyDropdowns(annotator);
} else if (docType == DocumentType.ORDER_FORM) {
addOrderDropdowns(annotator);
}
}
Integratie met Formulier‑validatie
Hoewel GroupDocs de dropdown‑creatie afhandelt, wil je misschien de PDF’s na creatie valideren:
public boolean validateDropdownsAdded(String pdfPath) {
try (final Annotator annotator = new Annotator(pdfPath)) {
// Check if annotations were added successfully
return annotator.get().size() > 0;
} catch (Exception e) {
return false;
}
}
Probleemoplossingsgids
Debug‑modus
Schakel gedetailleerde logging in om problemen te diagnosticeren:
// Add this to your logging configuration
Logger.getLogger("com.groupdocs").setLevel(Level.DEBUG);
Veelvoorkomende Exception‑berichten en Oplossingen
| Exception | Waarschijnlijke Oorzaak | Oplossing |
|---|---|---|
FileNotFoundException | Onjuist bestandspad | Gebruik absolute paden of controleer de logica voor relatieve paden |
InvalidLicenseException | Licentieproblemen | Controleer locatie en vervaldatum van licentiebestand |
OutOfMemoryError | Verwerking van grote bestanden | Vergroot de JVM‑heap of verwerk in batches |
UnsupportedOperationException | PDF‑beperkingen | Controleer of de PDF wijzigingen toestaat |
Je Implementatie Testen
Maak een eenvoudige test om te verifiëren dat alles werkt:
@Test
public void testDropdownCreation() {
String inputFile = "test-input.pdf";
String outputFile = "test-output.pdf";
try (final Annotator annotator = new Annotator(inputFile)) {
DropdownComponent dropdown = new DropdownComponent();
dropdown.setOptions(Arrays.asList("Test1", "Test2"));
dropdown.setBox(new Rectangle(100, 100, 80, 20));
annotator.add(dropdown);
annotator.save(outputFile);
// Verify output file exists and has content
assertTrue(Files.exists(Paths.get(outputFile)));
assertTrue(Files.size(Paths.get(outputFile)) > 0);
}
}
Overwegingen voor Productie‑implementatie
Foutafhandelingsstrategie
Implementeer robuuste foutafhandeling voor productie‑omgevingen:
public class PDFDropdownService {
private static final Logger logger = LoggerFactory.getLogger(PDFDropdownService.class);
public Result<String> addDropdownToPDF(String inputPath, DropdownConfig config) {
try (final Annotator annotator = new Annotator(inputPath)) {
DropdownComponent dropdown = createDropdownFromConfig(config);
annotator.add(dropdown);
String outputPath = generateOutputPath(inputPath);
annotator.save(outputPath);
logger.info("Successfully added dropdown to PDF: {}", outputPath);
return Result.success(outputPath);
} catch (Exception e) {
logger.error("Failed to add dropdown to PDF: {}", e.getMessage(), e);
return Result.error("PDF processing failed: " + e.getMessage());
}
}
}
Configuratiebeheer
Gebruik configuratie‑bestanden voor dropdown‑opties:
# dropdown-config.yml
dropdowns:
priority:
options: ["High", "Medium", "Low"]
position: {x: 100, y: 200, width: 80, height: 25}
status:
options: ["New", "In Progress", "Completed"]
position: {x: 200, y: 200, width: 100, height: 25}
Conclusie en Volgende Stappen
Gefeliciteerd! Je beheerst nu hoe je een dropdown toevoegt aan interactieve PDF‑formulieren met GroupDocs.Annotation voor Java. Je hebt alles geleerd van basisinstelling tot geavanceerde optimalisatietechnieken die je goed van pas komen in productie‑omgevingen.
Belangrijkste Leerpunten
- Instelling is eenvoudig: Maven‑integratie en licenties zijn eenvoudiger dan bij de meeste PDF‑bibliotheken.
- Code is intuïtief: Het API‑ontwerp is logisch en volgt Java‑conventies.
- Prestaties zijn cruciaal: Goed resource‑beheer voorkomt geheugenproblemen.
- Testen is essentieel: Verifieer altijd dat je PDF’s correct werken in verschillende viewers.
Wat nu?
Nu je dropdowns onder de knie hebt, overweeg dan deze geavanceerde functies:
- Tekstveld‑annotaties – perfect voor vrije gebruikersinvoer.
- Selectievak‑componenten – ideaal voor binaire keuzes.
- Handtekeningvelden – essentieel voor goedkeuringsworkflows.
- Watermerken – geef je documenten een professionele uitstraling.
- Documentvergelijking – houd wijzigingen tussen versies bij.
Klaar om een stap hoger te gaan?
Bekijk deze bronnen om je GroupDocs‑kennis te verdiepen:
- Official Documentation – uitgebreide handleidingen en API‑referenties
- Community Forum – krijg hulp van andere ontwikkelaars
- Sample Projects – praktijkvoorbeelden uit de echte wereld
Onthoud: de beste manier om een technologie onder de knie te krijgen is door er iets mee te bouwen. Begin met een simpel project – bijvoorbeeld een feedback‑formulier voor je team of een basisenquête – en voeg geleidelijk complexiteit toe naarmate je vertrouwd raakt met de API.
Vragen of problemen? De GroupDocs‑community is ontzettend behulpzaam, en de documentatie is eigenlijk leesbaar (ik weet het, zeldzaam voor ontwikkeltools!).
Happy coding, en moge je PDF’s voor altijd interactief zijn! 🚀
Veelgestelde Vragen
Wat is GroupDocs.Annotation voor Java precies?
GroupDocs.Annotation voor Java is een uitgebreide bibliotheek waarmee je verschillende soorten annotaties aan documenten kunt toevoegen, inclusief PDF’s. Zie het als je gereedschapskist om statische documenten interactief te maken – je kunt dropdowns, tekstvelden, selectievakjes, handtekeningen en meer toevoegen zonder de complexe interne structuur van PDF’s te hoeven begrijpen.
Hoe moeilijk is het om GroupDocs in mijn bestaande project op te zetten?
Het is verrassend eenvoudig! Als je Maven gebruikt, hoef je alleen maar de repository en dependency toe te voegen aan je pom.xml. De volledige setup duurt ongeveer 5 minuten. Het lastigste deel is meestal de licentie‑configuratie, maar ook dat is goed gedocumenteerd.
Kan ik GroupDocs gebruiken voor andere bestandsformaten dan PDF?
Absoluut! GroupDocs ondersteunt een breed scala aan formaten, waaronder Word‑documenten, Excel‑spreadsheets, PowerPoint‑presentaties en diverse afbeeldingsformaten. De API blijft consistent over formaten heen, dus als je het voor PDF’s leert, kun je die kennis gemakkelijk elders toepassen.
Wat moet ik doen als mijn dropdown op de verkeerde positie verschijnt?
Dit is meestal een verwarring over het coördinatensysteem. Onthoud dat PDF’s een oorsprong onder‑links gebruiken (in tegenstelling tot webpagina’s die links‑boven beginnen). Begin met grotere Y‑waarden en werk je weg naar beneden. Gebruik ook een viewer die coördinaten toont – Adobe Reader heeft deze functie in het eigenschappen‑paneel.
Is er een manier om mijn implementatie te testen zonder een volledige licentie?
Ja! GroupDocs biedt een gratis proefversie met volledige functionaliteit. De enige beperking is dat verwerkte documenten een watermerk krijgen. Dit is perfect voor ontwikkeling en testen – je kunt alles verifiëren voordat je een productie‑licentie aanschaft.
Hoe ga ik om met grote PDF‑bestanden zonder geheugen op te raken?
Goede vraag! Gebruik het try‑with‑resources‑patroon consequent – het zorgt voor juiste opruiming. Verwerk bij batch‑verwerking bestanden één voor één in plaats van meerdere PDF’s tegelijk te laden. Mogelijk moet je ook de JVM‑heap vergroten (-Xmx‑parameter) afhankelijk van de bestandsgrootte.
Kan ik het uiterlijk van dropdowns aanpassen?
GroupDocs richt zich meer op functionaliteit dan op visuele aanpassing. De dropdowns erven de standaardstijl van de PDF. Je kunt echter grootte en positie nauwkeurig regelen. Als je uitgebreide visuele aanpassingen nodig hebt, moet je wellicht naar meer gespecialiseerde PDF‑bibliotheken kijken, maar de standaardstijl voldoet voor de meeste zakelijke toepassingen.
Wat is de beste manier om hulp te krijgen als ik vastloop?
Het GroupDocs Support Forum is ontzettend actief en behulpzaam. De community bestaat uit zowel gebruikers als GroupDocs‑medewerkers die snel reageren. Bovendien is hun documentatie eigenlijk goed (ik weet het, schokkend voor een ontwikkeltool!), dus kijk daar eerst.
Zijn er licentie‑valkuilen waar ik op moet letten?
Het belangrijkste is het verschil tussen ontwikkel‑ en productielicenties. Zorg dat je licentie overeenkomt met je implementatie‑omgeving. Tijdelijke licenties zijn handig voor testen, maar hebben een vervaldatum – laat je niet verrassen in productie!
Hoe verhoudt GroupDocs zich tot andere PDF‑bibliotheken zoals iText?
GroupDocs richt zich meer op annotaties en formulier‑velden, terwijl iText een meer algemene PDF‑creatie/manipulatie‑tool is. GroupDocs heeft een eenvoudigere API voor annotatietaken, maar minder flexibiliteit voor complexe PDF‑generatie. Als je voornamelijk interactieve elementen aan bestaande PDF’s toevoegt, is GroupDocs meestal de betere keuze.
Aanvullende Bronnen
- GroupDocs Documentation - Complete API‑documentatie en tutorials
- API Reference - Gedetailleerde methode‑ en klasse‑referenties
- Download Center - Laatste releases en proefversies
- Purchase Options - Licentie‑informatie en prijzen
- Free Trial - Test de volledige functionaliteit
- Temporary License - Kort‑lopende licentie voor evaluatie
- Support Forum - Community‑hulp en officiële ondersteuning
Laatst bijgewerkt: 2026-02-18
Getest met: GroupDocs.Annotation 25.2
Auteur: GroupDocs