Úvod
Aspose.PDF FOSS pro Java je knihovna Java licencovaná pod licencí MIT pro vytváření a úpravu PDF dokumentů. Její třídy jsou uspořádány v balíčku org.aspose.pdf a jeho podbalíčcích (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades a dalších) a Document je vstupním bodem pro většinu pracovních postupů. Knihovna nemá žádné runtime závislosti třetích stran; jedinou závislostí v jejím Maven buildu je JUnit v testovacím rozsahu.
Oznámení library announcement, příspěvek facades post a příspěvek page-editing post již pokrývají vytváření dokumentů, formulářová pole, třídy fasád pro extrakci, šifrování a razítkování a operace s stránkami pomocí PdfFileEditor. Tento příspěvek pokrývá dalších pět oblastí stejného API, které tyto příspěvky neukazují: anotace textového formátování, volně psané výzvy, akce na úrovni dokumentu, ochranu velikosti při dekódování proudu a diagnostické protokolování.
Každá oblast je malý, samostatný API. Níže uvedené sekce ukazují volání, výchozí hodnoty a okrajové případy, které vlastní testy knihovny upřesňují.
Klíčové vlastnosti
Anotace textového formátování
HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation a SquigglyAnnotation každé přijímají Page a Rectangle. Konstruktor odvozuje čtyřúhelníkové body anotace z obdélníku, takže getQuadPoints() vrací osm hodnot bez jakéhokoli ručního výpočtu. Pro obdélník (100, 200, 300, 250) je výsledek [100, 250, 300, 250, 100, 200, 300, 200]: horní levý, horní pravý, dolní levý, pak dolní pravý. setQuadPoints() nahrazuje odvozené hodnoty vaším vlastním polem o osmi prvcích a anotace přestavěná ze stávajícího slovníku zachová již uložené čtyřúhelníkové body. getSubtype() vrací název PDF podtypu: Highlight, Underline, StrikeOut nebo Squiggly.
Vytvoření anotace ji nepřipojí k stránce. Přidejte ji pomocí 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");
}
Volné textové výzvy
FreeTextAnnotation umisťuje text přímo na stránku. Jeho konstruktor se třemi argumenty přijímá DefaultAppearance, který obsahuje název písma, velikost písma a barvu textu. Tři vlastnosti formují výzvu:
setIntent()přijímáFreeTextIntent:FreeText,FreeTextCalloutneboFreeTextTypeWriter. Nová anotace hlásíUndefineda předánínullji vrátí do tohoto stavu.setCallout()přijímá čáru výzvy jako pole dvou nebo tří{x, y}bodů. Pole jakékoli jiné délky je ignorováno a existující výzva zůstane na místě;nullvýzvu odstraní.setEndingStyle()přijímá hodnotuLineEnding, napříkladOpenArrowneboDiamond. Nová anotace hlásí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");
}
Uložený slovník anotací ukládá tyto hodnoty jako /IT, /CL a /LE.
Akce na úrovni dokumentu
Document.getActions() vrací DocumentActions pohled na katalog dokumentů. setOpenAction() ukládá akci do položky /OpenAction katalogu. Dalších pět spouštěčů, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting() a setAfterPrinting(), je uloženo nezávisle ve slovníku /AA dodatečných akcí katalogu.
Každý getter vrací null, dokud není jeho spouštěč nastaven. Předání null setteru odstraní tuto položku a odstranění posledního spouštěče také odstraní slovník /AA. Akce jsou instance PdfAction; GoToURIAction je alias UriAction a jeho getType() vrací URI. Objekt DocumentActions je živý pohled, takže pozdější volání getActions() vidí změny provedené dřívějším voláním, a spouštěče jsou načteny zpět při opětovném otevření uloženého souboru.
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");
}
Limity dekódování pro streamové filtry
PDF streamy jsou uloženy v kódované podobě a poškozený nebo škodlivý stream se může rozšířit na mnohem větší velikost než je uložena. DecodeLimits je ochrana sdílená filtry FlateDecode, LZWDecode a RunLengthDecode. Když dekódovaný výstup streamu překročí limit, filtr vyhodí DecodeSizeLimitException, podtřídu IOException, místo aby dekódoval až do vyčerpání haldy.
Výchozí limit je 256MB na dekódovaný stream (DecodeLimits.DEFAULT_MAX_DECODED_BYTES). Pro jeho změnu nastavte systémovou vlastnost pojmenovanou DecodeLimits.PROPERTY, která je aspose.pdf.maxDecodedStreamBytes, na velikost v bajtech; hodnota 0 nebo menší vypne ochranu. Vlastnost se načítá při každém dekódování, takže může být změněna za běhu.
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;
}
}
Streamy pod limitem se dekódují normálně. FlateFilter i RunLengthFilter provádějí obousměrný průchod dat přes encode() a decode(), pokud výstup zůstává pod limitem.
Diagnostické logování
Knihovna zapisuje logy přes java.util.logging pod loggerem org.aspose.pdf a ve výchozím nastavení je tichá: úroveň je OFF. AsposePdfLogging zapíná logování.
setLevel(Level)nastaví úroveň z kódu;nullvrátí knihovnu doOFF.getLevel()ji načte zpět.- Systémová vlastnost
aspose.pdf.log(také dostupná jakoAsposePdfLogging.LOG_PROPERTY) ji nastavuje z příkazové řádky.configureFromSystemProperty()použije vlastnost a také se spustí při načtení třídy. HodnotyonawarningvybírajíWARNING,verbosevybíráFINE,debugvybíráALL, jakýkoli názevjava.util.logging.Level, napříkladSEVERE, je akceptován a neznámá hodnota se vrátí naOFF.
WARNING umožňuje varování motoru projít; FINE, nastavení verbose, také umožňuje podrobnosti o zotavení parseru projít. AsposePdfLogging mění pouze podstrom loggeru org.aspose.pdf. Nemění úroveň kořenového loggeru a logger knihovny nepředává záznamy handlerům kořenového loggeru. Pokud je protokolování povoleno a k loggeru knihovny není připojen žádný handler, nainstaluje se console handler.
// 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
Rychlý start
Přidejte závislost do svého sestavení:
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-pdf-foss</artifactId>
<version>26.8.0</version>
</dependency>Následující příklad vytvoří stránku, přidá zvýraznění a volný textový komentář a uloží dokument:
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");
}
Podporované formáty
Podpora formátů, jak potvrzují možnosti načítání a ukládání knihovny a vykreslovací zařízení:
| Formát | Přípona | Číst | Zapsat |
|---|---|---|---|
| ✓ | ✓ | ||
| HTML | html | ✓ | ✓ |
| DOCX | docx | ✓ | ✓ |
| DOC | doc | ✓ | ✓ |
| XFDF | xfdf | ✓ | ✓ |
| BMP | bmp | — | ✓ |
| GIF | gif | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
Open Source a licencování
Aspose.PDF FOSS pro Java je vydáno pod licencí MIT, která umožňuje komerční použití, úpravy a redistribuci. Zdrojový kód a sledovač problémů jsou na github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. Knihovna cílí na Java 11 nebo novější.