Bevezetés
Aspose.PDF FOSS for Java egy MIT licenc alatt álló Java könyvtár PDF dokumentumok létrehozásához és szerkesztéséhez. Osztályai a org.aspose.pdf csomag és alkönyvtárai (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades és egyéb) alatt vannak elrendezve, és a Document a legtöbb munkafolyamat belépési pontja. A könyvtárnak nincsenek harmadik fél által biztosított futásidejű függőségei; az egyetlen függőség a Maven buildben a JUnit, teszt hatókörben.
A könyvtár bejelentése, a facade poszt, és a oldal-szerkesztés poszt már lefedik a dokumentum létrehozását, űrlapmezőket, a kinyeréshez, titkosításhoz és pecsételéshez használt facade osztályokat, valamint a PdfFileEditor segítségével végzett oldal műveleteket. Ez a poszt öt további területet tárgyal ugyanabból a API-ból, amelyeket a korábbi posztok nem mutatnak be: szöveg-jelölő annotációk, szabad szöveges felhívások, dokumentumszintű műveletek, méretkorlátozás a stream dekódolásnál, és diagnosztikai naplózás.
Minden terület egy kicsi, önálló API. Az alábbi szekciók bemutatják a hívásokat, az alapértelmezéseket és a szélsőséges eseteket, amelyeket a könyvtár saját tesztjei rögzítenek.
Főbb jellemzők
Szövegjelölő annotációk
HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation és SquigglyAnnotation mindegyik egy Page-t és egy Rectangle-t fogad. A konstruktor a téglalapból származtatja az annotáció négyzet pontjait, így a getQuadPoints() nyolc értéket ad vissza manuális számítás nélkül. A (100, 200, 300, 250) téglalap esetén az eredmény [100, 250, 300, 250, 100, 200, 300, 200]: bal-fent, jobb-fent, bal-lent, majd jobb-lent. A setQuadPoints() felülírja a származtatott értékeket a saját nyolcértékű tömbjével, és egy meglévő szótárból újjáépített annotáció megtartja a már ott tárolt négyzet pontokat. A getSubtype() visszaadja a PDF al-típus nevét: Highlight, Underline, StrikeOut vagy Squiggly.
Az annotáció létrehozása nem csatolja azt az oldalhoz. Add hozzá a page.getAnnotations().add(...) segítségével.
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");
}
Szabad szöveges felhívások
FreeTextAnnotation közvetlenül az oldalra helyezi a szöveget. Három argumentumos konstruktorja egy DefaultAppearance típust fogad, amely a betűtípus nevét, méretét és a szöveg színét tartalmazza. Három tulajdonság alakítja a felhívást:
setIntent()egyFreeTextIntenttípust vár:FreeText,FreeTextCalloutvagyFreeTextTypeWriter. Egy új annotációUndefinedértéket jelent, és anullátadása visszaállítja azt az állapotba.setCallout()a felhívás vonalát két vagy három{x, y}pontból álló tömbként veszi. A más hosszúságú tömböt figyelmen kívül hagyja, és a meglévő felhívás helyben marad; anulleltávolítja a felhívást.setEndingStyle()egyLineEndingértéket fogad, példáulOpenArrowvagyDiamond. Egy új annotációLineEnding.Noneértéket jelent.
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");
}
A mentett annotációszótár ezeket az értékeket /IT, /CL és /LE kulcsok alatt tárolja.
Dokumentumszintű műveletek
Document.getActions() visszaad egy DocumentActions nézetet a dokumentumkatalógusról. setOpenAction() egy műveletet tárol a katalógus /OpenAction bejegyzésében. További öt trigger, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting() és setAfterPrinting(), önállóan tárolódik a katalógus /AA additional-actions szótárában.
Minden getter null értéket ad vissza, amíg a trigger be nincs állítva. null átadása egy setternek eltávolítja azt a bejegyzést, és az utolsó trigger eltávolítása szintén törli a /AA szótárat. A műveletek PdfAction példányok; GoToURIAction egy alias a UriAction számára, és a getType() visszaadja a URI értéket. A DocumentActions objektum egy élő nézet, így egy későbbi hívás a getActions() esetén látja az előző hívás által végrehajtott változtatásokat, és a triggerek visszaolvasásra kerülnek, amikor a mentett fájlt újra megnyitják.
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");
}
Stream szűrők dekódolási korlátai
A PDF stream-ek kódolt formában vannak tárolva, és egy sérült vagy rosszindulatú stream jóval nagyobbra nőhet, mint a tárolt mérete. DecodeLimits egy védelmi mechanizmus, amelyet a FlateDecode, az LZWDecode és a RunLengthDecode szűrők osztanak meg. Amikor egy stream dekódolt kimenete meghaladja a korlátot, a szűrő DecodeSizeLimitException kivételt dob, amely a IOException alosztálya, ahelyett, hogy a heap kimerüléséig dekódolna.
Az alapértelmezett korlát 256MB dekódolt stream-enként (DecodeLimits.DEFAULT_MAX_DECODED_BYTES). A módosításhoz állítsa be a DecodeLimits.PROPERTY által megnevezett rendszer tulajdonságot, amely aspose.pdf.maxDecodedStreamBytes, a kívánt méretet bájtokban; a 0 vagy kisebb érték letiltja a védelmet. A tulajdonság minden egyes dekódoláskor beolvasásra kerül, így futásidőben is módosítható.
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;
}
}
A korlát alatti stream-ek a szokásos módon dekódolódnak. FlateFilter és RunLengthFilter egyaránt round-trip adatot a encode() és a decode() segítségével, ha a kimenet a határ alatt marad.
Diagnosztikai naplózás
A könyvtár a java.util.logging használatával naplóz a org.aspose.pdf naplózó alatt, és alapértelmezés szerint némán működik: a szint OFF. AsposePdfLogging bekapcsolja a naplózást.
setLevel(Level)beállítja a szintet kódból;nullvisszaállítja a könyvtáratOFF-ra.getLevel()visszaolvassa.- A(z)
aspose.pdf.logrendszer tulajdonság (amelyAsposePdfLogging.LOG_PROPERTYnéven is elérhető) a parancssorból állítja be.configureFromSystemProperty()alkalmazza a tulajdonságot, és a osztály betöltésekor is fut. Aonéswarningértékek a(z)WARNING-t választják, a(z)verbosea(z)FINE-t, a(z)debuga(z)ALL-t, bármelyjava.util.logging.Levelnév, példáulSEVERE, elfogadható, és egy ismeretlen érték visszatér a(z)OFFalapértelmezett értékhez.
WARNING engedi, hogy a motor figyelmeztetései átjussanak; FINE, a verbose beállítás, szintén engedi, hogy a parser helyreállítási részletei átjussanak. AsposePdfLogging csak a org.aspose.pdf naplózó al-fáját módosítja. Nem változtatja meg a gyökér naplózó szintjét, és a könyvtár naplózó nem továbbítja a rekordokat a gyökér naplózó kezelői felé. Ha a naplózás engedélyezett, és nincs kezelő csatolva a könyvtár naplózóhoz, egy konzol kezelő kerül telepítésre.
// 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
Gyors kezdés
Add hozzá a függőséget a buildhez:
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-pdf-foss</artifactId>
<version>26.8.0</version>
</dependency>A következő példa egy oldalt hoz létre, hozzáad egy kiemelést és egy szabad szöveges felhívást, majd elmenti a dokumentumot:
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");
}
Támogatott formátumok
Formátumtámogatás, ahogy a könyvtár betöltési és mentési opciói, valamint a renderelő eszközök megerősítik:
| Formátum | Kiterjesztés | Olvasás | Írás |
|---|---|---|---|
| ✓ | ✓ | ||
| HTML | html | ✓ | ✓ |
| DOCX | docx | ✓ | ✓ |
| DOC | doc | ✓ | ✓ |
| XFDF | xfdf | ✓ | ✓ |
| BMP | bmp | — | ✓ |
| GIF | gif | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
Nyílt forráskód és licencelés
Aspose.PDF FOSS for Java MIT licenc alatt került kiadásra, amely megengedi a kereskedelmi felhasználást, módosítást és újraelosztást. A forráskód és a hibajegy-nyilvántartó itt érhető el: github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. A könyvtár a Java 11 vagy újabb verzióra céloz.