Introduktion
Aspose.PDF FOSS för Java är ett MIT-licensierat Java-bibliotek för att skapa och redigera PDF-dokument. Dess klasser är organiserade under paketet org.aspose.pdf och dess underpaket (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades och andra), och Document är inträdespunkten för de flesta arbetsflöden. Biblioteket har inga tredjeparts-körningsberoenden; den enda beroendet i dess Maven-byggnad är JUnit, i test-omfång.
Den library announcement, facades post och page-editing post täcker redan dokumentgenerering, formulärfält, fasadklasserna för extrahering, kryptering och stämpling samt sidoperationer med PdfFileEditor. Detta inlägg täcker fem andra områden av samma API som dessa inlägg inte demonstrerar: text-markup-annotationer, fria text-kommentarer, dokumentnivå-åtgärder, en storleksgräns för ström-avkodning och diagnostisk loggning.
Varje område är ett litet, fristående API. Avsnitten nedan visar anropen, standardvärdena och kantfallen som bibliotekets egna tester fastställer.
Nyckelfunktioner
Text-markup-annotationer
HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation och SquigglyAnnotation tar var och en en Page och en Rectangle. Konstruktorn härleder annotationens quad-punkter från rektangeln, så getQuadPoints() returnerar åtta värden utan någon manuell beräkning. För rektangeln (100, 200, 300, 250) är resultatet [100, 250, 300, 250, 100, 200, 300, 200]: övre vänster, övre höger, nedre vänster, sedan nedre höger. setQuadPoints() ersätter de härledda värdena med din egen åtta-värdes-array, och en annotation som byggs om från en befintlig ordbok behåller quad-punkterna som redan lagrats där. getSubtype() returnerar PDF-subtypens namn: Highlight, Underline, StrikeOut eller Squiggly.
Att konstruera en annotation fäster den inte på sidan. Lägg till den med 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");
}
Fri-text-callouts
FreeTextAnnotation placerar text direkt på en sida. Dess konstruktor med tre argument tar en DefaultAppearance, som innehåller teckensnittets namn, teckensnittsstorlek och textfärg. Tre egenskaper formar callouten:
setIntent()tar emot enFreeTextIntent:FreeText,FreeTextCalloutellerFreeTextTypeWriter. En ny annotation rapporterarUndefined, och att skickanullåterställer den till det tillståndet.setCallout()tar emot callout-linjen som en array av två eller tre{x, y}-punkter. En array med någon annan längd ignoreras och den befintliga callouten förblir på plats;nulltar bort callouten.setEndingStyle()tar emot ettLineEnding-värde såsomOpenArrowellerDiamond. En ny annotation rapporterarLineEnding.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");
}
Den sparade annotation-ordboken lagrar dessa värden som /IT, /CL och /LE.
Dokumentnivå-åtgärder
Document.getActions() returnerar en DocumentActions vy av dokumentkatalogen. setOpenAction() lagrar en åtgärd i katalogens /OpenAction post. Fem ytterligare triggrar, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting() och setAfterPrinting(), lagras oberoende i katalogens /AA additional-actions dictionary.
Varje getter returnerar null tills dess trigger är satt. Att skicka null till en setter tar bort den posten, och att ta bort den sista triggern tar även bort /AA dictionary. Åtgärder är PdfAction instanser; GoToURIAction är ett alias för UriAction, och dess getType() returnerar URI. DocumentActions-objektet är en livevy, så ett senare anrop till getActions() ser förändringar som gjorts genom ett tidigare, och triggrarna läses tillbaka när den sparade filen öppnas igen.
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");
}
Avkodningsgränser för strömfilter
PDF-strömmar lagras i kodad form, och en korrupt eller skadlig ström kan expandera till långt mer än dess lagrade storlek. DecodeLimits är en skyddsmekanism som delas av FlateDecode, LZWDecode och RunLengthDecode-filtren. När en ströms avkodade utdata överskrider gränsen kastar filtret DecodeSizeLimitException, en subklass av IOException, i stället för att avkoda tills heapen är uttömd.
Standardgränsen är 256MB per avkodad ström (DecodeLimits.DEFAULT_MAX_DECODED_BYTES). För att ändra den, sätt systemegenskapen som namnges av DecodeLimits.PROPERTY, som är aspose.pdf.maxDecodedStreamBytes, till en storlek i byte; ett värde på 0 eller mindre inaktiverar skyddet. Egenskapen läses vid varje avkodning, så den kan ändras vid körning.
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;
}
}
Strömmar under gränsen avkodas som vanligt. FlateFilter och RunLengthFilter gör båda en round-trip av data genom encode() och decode() när utdata hålls under gränsen.
Diagnostisk loggning
Biblioteket loggar via java.util.logging under org.aspose.pdf-loggen och är tyst som standard: nivån är OFF. AsposePdfLogging slår på loggning.
setLevel(Level)sätter nivån från kod;nullåterställer biblioteket tillOFF.getLevel()läser tillbaka den.- Systemegenskapen
aspose.pdf.log(även tillgänglig somAsposePdfLogging.LOG_PROPERTY) sätter den från kommandoraden.configureFromSystemProperty()tillämpar egenskapen och körs också när klassen laddas. VärdenaonochwarningväljerWARNING,verboseväljerFINE,debugväljerALL, vilketjava.util.logging.Levelnamn somSEVEREaccepteras, och ett okänt värde faller tillbaka tillOFF.
WARNING släpper igenom motorns varningar; FINE, verbose-inställningen, släpper också igenom parserns återhämtningsdetaljer. AsposePdfLogging ändrar endast org.aspose.pdf-loggarnas underträd. Den ändrar inte nivån på rotloggaren, och bibliotekets logger vidarebefordrar inte poster till rotloggarens hanterare. Om loggning är aktiverad och ingen hanterare är kopplad till bibliotekets logger, installeras en konsolhanterare.
// 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
Snabbstart
Lägg till beroendet i din build:
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-pdf-foss</artifactId>
<version>26.8.0</version>
</dependency>Följande exempel skapar en sida, lägger till en markering och ett fri-text-callout, och sparar dokumentet:
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");
}
Stödda format
Formatstöd som bekräftas av bibliotekets laddnings- och sparalternativ samt renderingsenheter:
| Format | Filändelse | Läs | Skriv |
|---|---|---|---|
| ✓ | ✓ | ||
| HTML | html | ✓ | ✓ |
| DOCX | docx | ✓ | ✓ |
| DOC | doc | ✓ | ✓ |
| XFDF | xfdf | ✓ | ✓ |
| BMP | bmp | — | ✓ |
| GIF | gif | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
Öppen källkod & licensiering
Aspose.PDF FOSS för Java släpps under MIT-licensen, som tillåter kommersiell användning, modifiering och omdistribution. Källkoden och felspårningssystemet finns på github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. Biblioteket riktar sig mot Java 11 eller senare.