Εισαγωγή
Aspose.PDF FOSS για Java είναι μια βιβλιοθήκη Java υπό άδεια MIT για δημιουργία και επεξεργασία εγγράφων PDF. Οι κλάσεις της οργανώνονται στο πακέτο org.aspose.pdf και στα υποπακέτα του (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades και άλλα), ενώ το Document είναι το σημείο εισόδου για τις περισσότερες ροές εργασίας. Η βιβλιοθήκη δεν έχει εξαρτήσεις χρόνου εκτέλεσης από τρίτους· η μόνη εξάρτηση στην κατασκευή Maven είναι το JUnit, σε επίπεδο δοκιμών.
Η ανακοίνωση βιβλιοθήκης, η ανάρτηση για τις προσκηνές, και η ανάρτηση επεξεργασίας σελίδων καλύπτουν ήδη τη δημιουργία εγγράφων, τα πεδία φόρμας, τις κλάσεις προσκηνής για εξαγωγή, κρυπτογράφηση και σφράγιση, καθώς και τις λειτουργίες σελίδων με το PdfFileEditor. Αυτή η ανάρτηση καλύπτει πέντε άλλες περιοχές του ίδιου API που αυτές οι αναρτήσεις δεν δείχνουν: σημειώσεις σήμανσης κειμένου, ελεύθερα κείμενα κλήσεων, ενέργειες σε επίπεδο εγγράφου, έλεγχο μεγέθους κατά την αποκωδικοποίηση ροής και διαγνωστική καταγραφή.
Κάθε περιοχή είναι ένα μικρό, αυτόνομο API. Οι παρακάτω ενότητες δείχνουν τις κλήσεις, τις προεπιλογές και τις ακραίες περιπτώσεις που καθορίζονται από τις δικές της δοκιμές της βιβλιοθήκης.
Βασικά Χαρακτηριστικά
Σημειώσεις Σήμανσης Κειμένου
HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation και SquigglyAnnotation δέχονται καθένα ένα Page και ένα Rectangle. Ο κατασκευαστής παράγει τα quad points της σημείωσης από το ορθογώνιο, έτσι το getQuadPoints() επιστρέφει οκτώ τιμές χωρίς κανέναν χειροκίνητο υπολογισμό. Για το ορθογώνιο (100, 200, 300, 250) το αποτέλεσμα είναι [100, 250, 300, 250, 100, 200, 300, 200]: πάνω-αριστερά, πάνω-δεξιά, κάτω-αριστερά, μετά κάτω-δεξιά. Το setQuadPoints() αντικαθιστά τις παραγόμενες τιμές με το δικό σας πίνακα οκτώ τιμών, και μια σημείωση που ξαναχτίζεται από υπάρχον λεξικό διατηρεί τα quad points που είναι ήδη αποθηκευμένα εκεί. Το getSubtype() επιστρέφει το όνομα του υποτύπου PDF: Highlight, Underline, StrikeOut ή Squiggly.
Η δημιουργία μιας σημείωσης δεν την επισυνάπτει στη σελίδα. Προσθέστε την με 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");
}
Κλήσεις Ελεύθερου Κειμένου
FreeTextAnnotation τοποθετεί κείμενο απευθείας σε μια σελίδα. Ο κατασκευαστής του με τρία ορίσματα δέχεται ένα DefaultAppearance, το οποίο περιλαμβάνει το όνομα γραμματοσειράς, το μέγεθος γραμματοσειράς και το χρώμα κειμένου. Τρία χαρακτηριστικά διαμορφώνουν την κλήση:
setIntent()δέχεται έναFreeTextIntent:FreeText,FreeTextCallout, ήFreeTextTypeWriter. Μια νέα σημείωση αναφέρειUndefined, και η μεταβίβαση τουnullτην επαναφέρει σε εκείνη την κατάσταση.setCallout()δέχεται τη γραμμή της κλήσης ως έναν πίνακα από δύο ή τρία σημεία{x, y}. Ένας πίνακας οποιουδήποτε άλλου μήκους αγνοείται και η υπάρχουσα κλήση παραμένει στη θέση της·nullαφαιρεί την κλήση.setEndingStyle()δέχεται μια τιμήLineEndingόπωςOpenArrowήDiamond. Μια νέα σημείωση αναφέρειLineEnding.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");
}
Το αποθηκευμένο λεξικό σημειώσεων αποθηκεύει αυτές τις τιμές ως /IT, /CL και /LE.
Δράσεις Σε Επίπεδο Εγγράφου
Document.getActions() επιστρέφει μια DocumentActions προβολή του καταλόγου εγγράφων. setOpenAction() αποθηκεύει μια ενέργεια στην καταχώρηση /OpenAction του καταλόγου. Πέντε επιπλέον ενεργοποιητές, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting() και setAfterPrinting(), αποθηκεύονται ανεξάρτητα στο λεξικό /AA πρόσθετων ενεργειών του καταλόγου.
Κάθε getter επιστρέφει null μέχρι να οριστεί ο ενεργοποιητής του. Η παράδοση του null σε έναν setter αφαιρεί εκείνη την καταχώρηση, και η αφαίρεση του τελευταίου ενεργοποιητή αφαιρεί επίσης το λεξικό /AA. Οι ενέργειες είναι στιγμιότυπα PdfAction; το GoToURIAction είναι ψευδώνυμο του UriAction, και το getType() του επιστρέφει URI. Το αντικείμενο DocumentActions είναι μια ζωντανή προβολή, έτσι μια μεταγενέστερη κλήση στο getActions() βλέπει τις αλλαγές που έγιναν μέσω μιας προηγούμενης, και οι ενεργοποιητές διαβάζονται ξανά όταν το αποθηκευμένο αρχείο ανοίγει ξανά.
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");
}
Όρια Αποκωδικοποίησης για Φίλτρα Ροών
Οι ροές PDF αποθηκεύονται σε κωδικοποιημένη μορφή, και μια κατεστραμμένη ή κακόβουλη ροή μπορεί να επεκταθεί πολύ περισσότερο από το αποθηκευμένο της μέγεθος. Το DecodeLimits είναι ένας φραγμός που μοιράζεται από τα φίλτρα FlateDecode, LZWDecode και RunLengthDecode. Όταν η αποκωδικοποιημένη έξοδος μιας ροής υπερβαίνει το όριο, το φίλτρο ρίχνει το DecodeSizeLimitException, μια υποκλάση του IOException, αντί να αποκωδικοποιήσει μέχρι να εξαντληθεί η μνήμη heap.
Το προεπιλεγμένο όριο είναι 256MB ανά αποκωδικοποιημένη ροή (DecodeLimits.DEFAULT_MAX_DECODED_BYTES). Για να το αλλάξετε, ορίστε την ιδιότητα συστήματος που ονομάζεται από το DecodeLimits.PROPERTY, η οποία είναι aspose.pdf.maxDecodedStreamBytes, σε ένα μέγεθος σε byte· μια τιμή του 0 ή μικρότερη απενεργοποιεί τον φραγμό. Η ιδιότητα διαβάζεται σε κάθε αποκωδικοποίηση, ώστε να μπορεί να αλλάξει σε χρόνο εκτέλεσης.
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;
}
}
Οι ροές κάτω από το όριο αποκωδικοποιούνται όπως συνήθως. Τα FlateFilter και RunLengthFilter κάνουν και τα δύο round-trip δεδομένων μέσω encode() και decode() όταν η έξοδος παραμένει κάτω από το όριο.
Διαγνωστική Καταγραφή
Η βιβλιοθήκη καταγράφει μέσω java.util.logging κάτω από τον καταγραφέα org.aspose.pdf και είναι σιωπηλή από προεπιλογή: το επίπεδο είναι OFF. Το AsposePdfLogging ενεργοποιεί την καταγραφή.
setLevel(Level)ορίζει το επίπεδο από κώδικα·nullεπιστρέφει τη βιβλιοθήκη σεOFF.getLevel()το διαβάζει ξανά.- Η ιδιότητα συστήματος
aspose.pdf.log(διαθέσιμη επίσης ωςAsposePdfLogging.LOG_PROPERTY) τη ρυθμίζει από τη γραμμή εντολών. ΤοconfigureFromSystemProperty()εφαρμόζει την ιδιότητα και εκτελείται επίσης όταν φορτώνεται η κλάση. Οι τιμέςonκαιwarningεπιλέγουν τοWARNING, τοverboseεπιλέγει τοFINE, τοdebugεπιλέγει τοALL, οποιοδήποτε όνομαjava.util.logging.Levelόπως τοSEVEREγίνονται αποδεκτά, και μια μη αναγνωρισμένη τιμή επιστρέφει στοOFF.
WARNING επιτρέπει τις προειδοποιήσεις της μηχανής· FINE, η ρύθμιση verbose, επίσης επιτρέπει τις λεπτομέρειες αποκατάστασης του parser. Το AsposePdfLogging αλλάζει μόνο το υποδέντρο καταγραφέα org.aspose.pdf. Δεν αλλάζει το επίπεδο του ριζικού καταγραφέα, και ο καταγραφέας της βιβλιοθήκης δεν περνάει εγγραφές στους χειριστές του ριζικού καταγραφέα. Εάν η καταγραφή είναι ενεργοποιημένη και δεν υπάρχει χειριστής συνδεδεμένος στον καταγραφέα της βιβλιοθήκης, εγκαθίσταται ένας χειριστής κονσόλας.
// 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
Γρήγορη Εκκίνηση
Προσθέστε την εξάρτηση στη δόμησή σας:
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-pdf-foss</artifactId>
<version>26.8.0</version>
</dependency>Το παρακάτω παράδειγμα δημιουργεί μια σελίδα, προσθέτει μια επισήμανση και μια κλήση ελεύθερου κειμένου, και αποθηκεύει το έγγραφο:
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");
}
Υποστηριζόμενες Μορφές
Υποστήριξη μορφών όπως επιβεβαιώνεται από τις επιλογές φόρτωσης και αποθήκευσης της βιβλιοθήκης και τις συσκευές απόδοσης:
| Μορφή | Επέκταση | Ανάγνωση | Εγγραφή |
|---|---|---|---|
| ✓ | ✓ | ||
| HTML | html | ✓ | ✓ |
| DOCX | docx | ✓ | ✓ |
| DOC | doc | ✓ | ✓ |
| XFDF | xfdf | ✓ | ✓ |
| BMP | bmp | — | ✓ |
| GIF | gif | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
Ανοιχτή Πηγή & Αδειοδότηση
Aspose.PDF FOSS για Java κυκλοφορεί υπό την άδεια MIT, η οποία επιτρέπει εμπορική χρήση, τροποποίηση και αναδιανομή. Ο πηγαίος κώδικας και ο παρακολουθητής ζητημάτων βρίσκονται στη διεύθυνση github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. Η βιβλιοθήκη στοχεύει στο Java 11 ή νεότερο.