Introduction
Aspose.PDF FOSS pour Java est une bibliothèque Java sous licence MIT pour créer et modifier des documents PDF. Ses classes sont organisées sous le paquet org.aspose.pdf et ses sous-packages (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades et d’autres), et Document est le point d’entrée pour la plupart des flux de travail. La bibliothèque n’a aucune dépendance d’exécution tierce ; la seule dépendance dans sa construction Maven est JUnit, en portée test.
L’annonce de la bibliothèque, le post sur les façades, et le post sur l’édition de pages couvrent déjà la création de documents, les champs de formulaire, les classes de façade pour l’extraction, le chiffrement et le timbrage, ainsi que les opérations de pages avec PdfFileEditor. Ce post couvre cinq autres domaines du même API que ces posts ne démontrent pas: les annotations de balisage de texte, les annotations de texte libre, les actions au niveau du document, une garde de taille lors du décodage de flux, et la journalisation diagnostique.
Chaque domaine est un petit API autonome. Les sections ci-dessous montrent les appels, les valeurs par défaut et les cas limites que les propres tests de la bibliothèque déterminent.
Fonctionnalités clés
Annotations de balisage de texte
HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation et SquigglyAnnotation prennent chacun un Page et un Rectangle. Le constructeur déduit les points de quadrilatère de l’annotation à partir du rectangle, de sorte que getQuadPoints() renvoie huit valeurs sans aucun calcul manuel. Pour le rectangle (100, 200, 300, 250), le résultat est [100, 250, 300, 250, 100, 200, 300, 200]: en haut à gauche, en haut à droite, en bas à gauche, puis en bas à droite. setQuadPoints() remplace les valeurs dérivées par votre propre tableau de huit valeurs, et une annotation reconstruite à partir d’un dictionnaire existant conserve les points de quadrilatère déjà stockés. getSubtype() renvoie le nom du sous-type PDF: Highlight, Underline, StrikeOut ou Squiggly.
Construire une annotation ne l’attache pas à la page. Ajoutez-la avec page.getAnnotations().add(...).
try (Document doc = new Document()) {
Page page = doc.getPages().add();
HighlightAnnotation highlight = new HighlightAnnotation(page, new Rectangle(100, 200, 300, 250));
double[] quadPoints = highlight.getQuadPoints();
UnderlineAnnotation underline = new UnderlineAnnotation(page, new Rectangle(50, 100, 200, 120));
StrikeOutAnnotation strikeOut = new StrikeOutAnnotation(page, new Rectangle(50, 140, 200, 160));
SquigglyAnnotation squiggly = new SquigglyAnnotation(page, new Rectangle(50, 180, 200, 200));
page.getAnnotations().add(highlight);
page.getAnnotations().add(underline);
page.getAnnotations().add(strikeOut);
page.getAnnotations().add(squiggly);
doc.save("markup.pdf");
}
Annotations de texte libre
FreeTextAnnotation place du texte directement sur une page. Son constructeur à trois arguments prend un DefaultAppearance, qui contient le nom de la police, la taille de la police et la couleur du texte. Trois propriétés définissent la bulle :
setIntent()prend unFreeTextIntent:FreeText,FreeTextCalloutouFreeTextTypeWriter. Une nouvelle annotation indiqueUndefined, et en passantnullla ramène à cet état.setCallout()prend la ligne de la bulle sous forme d’un tableau de deux ou trois points{x, y}. Un tableau d’une autre longueur est ignoré et la bulle existante reste en place ;nullsupprime la bulle.setEndingStyle()prend une valeurLineEndingtelle queOpenArrowouDiamond. Une nouvelle annotation indiqueLineEnding.None.
try (Document doc = new Document()) {
Page page = doc.getPages().add();
DefaultAppearance da = new DefaultAppearance("Helv", 10, Color.BLACK);
FreeTextAnnotation note = new FreeTextAnnotation(page, new Rectangle(50, 50, 200, 100), da);
note.setContents("Check this value");
note.setIntent(FreeTextIntent.FreeTextCallout);
note.setCallout(new double[][] {{10, 10}, {50, 50}, {100, 100}});
note.setEndingStyle(LineEnding.OpenArrow);
page.getAnnotations().add(note);
doc.save("callout.pdf");
}
Le dictionnaire d’annotations enregistré stocke ces valeurs sous les clés /IT, /CL et /LE.
Actions au niveau du document
Document.getActions() renvoie une vue DocumentActions du catalogue de documents. setOpenAction() stocke une action dans l’entrée /OpenAction du catalogue. Cinq déclencheurs supplémentaires, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting() et setAfterPrinting(), sont stockés indépendamment dans le dictionnaire additional-actions /AA du catalogue.
Chaque getter renvoie null jusqu’à ce que son déclencheur soit défini. Passer null à un setter supprime cette entrée, et la suppression du dernier déclencheur supprime également le dictionnaire /AA. Les actions sont des instances PdfAction; GoToURIAction est un alias de UriAction, et son getType() renvoie URI. L’objet DocumentActions est une vue en direct, de sorte qu’un appel ultérieur à getActions() voit les modifications effectuées par un appel antérieur, et les déclencheurs sont relus lorsque le fichier enregistré est rouvert.
try (Document doc = new Document()) {
doc.getPages().add();
DocumentActions actions = doc.getActions();
actions.setOpenAction(new GoToURIAction("https://example.com"));
actions.setBeforeSaving(new GoToURIAction("https://example.com/saving"));
PdfAction open = doc.getActions().getOpenAction();
if (open instanceof UriAction) {
System.out.println(((UriAction) open).getUri());
}
actions.setBeforeSaving(null); // removes /WS; /AA is removed once it is empty
doc.save("actions.pdf");
}
Limites de décodage pour les filtres de flux
Les flux PDF sont stockés sous forme encodée, et un flux corrompu ou malveillant peut s’étendre bien au-delà de sa taille stockée. DecodeLimits est une garde partagée par les filtres FlateDecode, LZWDecode et RunLengthDecode. Lorsque la sortie décodée d’un flux dépasse la limite, le filtre lève DecodeSizeLimitException, une sous-classe de IOException, au lieu de décoder jusqu’à épuisement du tas.
La limite par défaut est de 256Mo par flux décodé (DecodeLimits.DEFAULT_MAX_DECODED_BYTES). Pour la modifier, définissez la propriété système nommée par DecodeLimits.PROPERTY, qui est aspose.pdf.maxDecodedStreamBytes, à une taille en octets; une valeur de 0 ou moins désactive la garde. La propriété est lue à chaque décodage, ce qui permet de la changer à l’exécution.
static byte[] decodeFlate(byte[] encoded) {
// Lower the cap to 16 MB (16777216 bytes) for this process
System.setProperty(DecodeLimits.PROPERTY, "16777216");
try {
return new FlateFilter().decode(encoded, null);
} catch (IOException e) {
// "FlateDecode: decoded output exceeds 16777216 bytes - likely a corrupt stream
// or decompression bomb (override with -Daspose.pdf.maxDecodedStreamBytes)"
return null;
}
}
Les flux sous la limite se décodent comme d’habitude. FlateFilter et RunLengthFilter effectuent tous deux un aller-retour des données via encode() et decode() lorsque la sortie reste sous la limite.
Journalisation diagnostique
La bibliothèque consigne via java.util.logging sous le logger org.aspose.pdf et est silencieuse par défaut: le niveau est OFF. AsposePdfLogging active la journalisation.
setLevel(Level)définit le niveau depuis le code;nullrenvoie la bibliothèque àOFF.getLevel()le lit à nouveau.- La propriété système
aspose.pdf.log(disponible également sous le nomAsposePdfLogging.LOG_PROPERTY) la définit depuis la ligne de commande.configureFromSystemProperty()applique la propriété et s’exécute également lors du chargement de la classe. Les valeursonetwarningsélectionnentWARNING,verbosesélectionneFINE,debugsélectionneALL, tout nomjava.util.logging.Leveltel queSEVEREest accepté, et une valeur non reconnue revient àOFF.
WARNING laisse passer les avertissements du moteur; FINE, le paramètre verbose, laisse également passer les détails de récupération du parseur. AsposePdfLogging ne modifie que le sous-arbre du logger org.aspose.pdf. Il ne change pas le niveau du logger racine, et le logger de la bibliothèque ne transmet pas les enregistrements aux gestionnaires du logger racine. Si la journalisation est activée et aucun gestionnaire n’est attaché au logger de la bibliothèque, un gestionnaire console est installé.
// Equivalent to starting the JVM with -Daspose.pdf.log=warning
AsposePdfLogging.setLevel(Level.WARNING);
System.setProperty(AsposePdfLogging.LOG_PROPERTY, "verbose");
AsposePdfLogging.configureFromSystemProperty();
System.out.println(AsposePdfLogging.getLevel()); // FINE
Démarrage rapide
Ajoutez la dépendance à votre build:
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-pdf-foss</artifactId>
<version>26.8.0</version>
</dependency>L’exemple suivant crée une page, ajoute une mise en évidence et un encadré de texte libre, puis enregistre le document:
import org.aspose.pdf.*;
import org.aspose.pdf.annotations.*;
try (Document doc = new Document()) {
Page page = doc.getPages().add();
page.getAnnotations().add(new HighlightAnnotation(page, new Rectangle(100, 200, 300, 250)));
FreeTextAnnotation note = new FreeTextAnnotation(page, new Rectangle(50, 50, 200, 100),
new DefaultAppearance("Helv", 10, Color.BLACK));
note.setContents("Check this value");
note.setIntent(FreeTextIntent.FreeTextCallout);
note.setCallout(new double[][] {{10, 10}, {50, 50}, {100, 100}});
page.getAnnotations().add(note);
doc.save("core-features.pdf");
}
Formats pris en charge
Prise en charge des formats telle que confirmée par les options de chargement et d’enregistrement de la bibliothèque et les périphériques de rendu :
| Format | Extension | Lire | Écrire |
|---|---|---|---|
| ✓ | ✓ | ||
| HTML | html | ✓ | ✓ |
| DOCX | docx | ✓ | ✓ |
| DOC | doc | ✓ | ✓ |
| XFDF | xfdf | ✓ | ✓ |
| BMP | bmp | — | ✓ |
| GIF | gif | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
Open Source & Licence
Aspose.PDF FOSS pour Java est publié sous licence MIT, qui autorise l’utilisation commerciale, la modification et la redistribution. Le code source et le suivi des problèmes sont disponibles à github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. La bibliothèque cible Java 11 ou version ultérieure.