Introducere

Aspose.PDF FOSS pentru Java este o bibliotecă Java licențiată sub MIT pentru crearea și editarea documentelor PDF. Clasele sale sunt organizate sub pachetul org.aspose.pdf și sub-pachetele sale (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades și altele), iar Document este punctul de intrare pentru majoritatea fluxurilor de lucru. Biblioteca nu are dependențe runtime de terți; singura dependență în construcția sa Maven este JUnit, la nivel de test.

Anunțul bibliotecii , postarea facades și postarea page-editing acoperă deja crearea de documente, câmpurile de formular, clasele de fațadă pentru extracție, criptare și ștampilare, și operațiile de pagină cu PdfFileEditor. Această postare acoperă alte cinci zone ale aceluiași API pe care acele postări nu le demonstrează: adnotări de marcare a textului, note libere de text, acțiuni la nivel de document, o protecție de dimensiune la decodarea fluxului și jurnalizarea de diagnostic.

Fiecare zonă este un API mic, autonom. Secțiunile de mai jos prezintă apelurile, valorile implicite și cazurile limită pe care testele proprii ale bibliotecii le stabilesc.


Caracteristici cheie

Adnotări de marcare a textului

HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation și SquigglyAnnotation primesc fiecare un Page și un Rectangle. Constructorul derivă punctele quad ale adnotării din dreptunghi, astfel încât getQuadPoints() returnează opt valori fără niciun calcul manual. Pentru dreptunghiul (100, 200, 300, 250) rezultatul este [100, 250, 300, 250, 100, 200, 300, 200]: stânga sus, dreapta sus, stânga jos, apoi dreapta jos. setQuadPoints() înlocuiește valorile derivate cu propriul tău tablou de opt valori, iar o adnotare reconstruită dintr-un dicționar existent păstrează punctele quad deja stocate acolo. getSubtype() returnează numele subtipului PDF: Highlight, Underline, StrikeOut sau Squiggly.

Construirea unei adnotări nu o atașează la pagină. Adaugă-o cu 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");
}

Comentarii Text Liber

FreeTextAnnotation plasează text direct pe o pagină. Constructorul său cu trei argumente primește un DefaultAppearance, care conține numele fontului, dimensiunea fontului și culoarea textului. Trei proprietăți modelează callout-ul:

  • setIntent() primește un FreeTextIntent: FreeText, FreeTextCallout sau FreeTextTypeWriter. O adnotare nouă raportează Undefined, iar trecerea lui null o readuce în acea stare.
  • setCallout() primește linia de callout ca un tablou de două sau trei puncte {x, y}. Un tablou cu orice altă lungime este ignorat și callout-ul existent rămâne la locul său; null elimină callout-ul.
  • setEndingStyle() primește o valoare LineEnding precum OpenArrow sau Diamond. O adnotare nouă raportează 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");
}

Dicţionarul de adnotări salvat stochează aceste valori ca /IT, /CL și /LE.

Acţiuni la nivel de document

Document.getActions() returnează o vedere DocumentActions a catalogului de documente. setOpenAction() stochează o acțiune în intrarea /OpenAction a catalogului. Alte cinci declanșatoare, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting() și setAfterPrinting(), sunt stocate independent în dicționarul /AA de acțiuni suplimentare al catalogului.

Fiecare getter returnează null până când declanșatorul său este setat. Transmiterea lui null unui setter elimină acea intrare, iar eliminarea ultimului declanșator elimină și dicționarul /AA. Acțiunile sunt instanțe PdfAction; GoToURIAction este un alias pentru UriAction, iar getType() său returnează URI. Obiectul DocumentActions este o vedere live, astfel încât un apel ulterior la getActions() vede modificările făcute printr-un apel anterior, iar declanșatoarele sunt citite din nou când fișierul salvat este deschis din nou.

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");
}

Limite de decodare pentru filtrele de flux

Fluxurile PDF sunt stocate în formă codificată, iar un flux corupt sau malițios poate crește mult peste dimensiunea sa stocată. DecodeLimits este o protecție partajată de filtrele FlateDecode, LZWDecode și RunLengthDecode. Când ieșirea decodificată a unui flux depășește limita, filtrul aruncă DecodeSizeLimitException, o subclasă a IOException, în loc să decodeze până când heap-ul este epuizat.

Limita implicită este de 256MB per flux decodificat (DecodeLimits.DEFAULT_MAX_DECODED_BYTES). Pentru a o modifica, setați proprietatea de sistem denumită de DecodeLimits.PROPERTY, care este aspose.pdf.maxDecodedStreamBytes, la o dimensiune în octeți; o valoare de 0 sau mai mică dezactivează protecția. Proprietatea este citită la fiecare decodare, astfel încât poate fi modificată în timpul execuției.

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;
    }
}

Fluxurile sub limită se decodează ca de obicei. FlateFilter și RunLengthFilter efectuează ambele un ciclu complet de date prin encode() și decode() când ieșirea rămâne sub limită.

Jurnalizare de diagnostic

Biblioteca înregistrează prin java.util.logging sub loggerul org.aspose.pdf și este silențioasă implicit: nivelul este OFF. AsposePdfLogging activează jurnalizarea.

  • setLevel(Level) stabilește nivelul din cod; null readuce biblioteca la OFF. getLevel() îl citește înapoi.
  • Proprietatea de sistem aspose.pdf.log (disponibilă și ca AsposePdfLogging.LOG_PROPERTY) o setează din linia de comandă. configureFromSystemProperty() aplică proprietatea și rulează, de asemenea, când clasa este încărcată. Valorile on și warning selectează WARNING, verbose selectează FINE, debug selectează ALL, orice nume java.util.logging.Level cum ar fi SEVERE este acceptat, iar o valoare nerecunoscută revine la OFF.

WARNING permite avertismentele motorului; FINE, setarea verbose, permite, de asemenea, detaliile de recuperare ale parserului. AsposePdfLogging modifică numai subarborele logger-ului org.aspose.pdf. Nu modifică nivelul logger-ului rădăcină, iar logger-ul bibliotecii nu transmite înregistrările către handler-ele logger-ului rădăcină. Dacă jurnalizarea este activată și niciun handler nu este atașat logger-ului bibliotecii, se instalează un handler de consolă.

// 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

Start rapid

Adăugați dependența la build:

<dependency>
  <groupId>org.aspose</groupId>
  <artifactId>aspose-pdf-foss</artifactId>
  <version>26.8.0</version>
</dependency>

Exemplul următor creează o pagină, adaugă o evidențiere și un apel liber de text, și salvează documentul:

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");
}

Formate acceptate

Suportul de format așa cum este confirmat de opțiunile de încărcare și salvare ale bibliotecii și de dispozitivele de redare:

FormatExtensieCitireScriere
PDFpdf✓✓
HTMLhtml✓✓
DOCXdocx✓✓
DOCdoc✓✓
XFDFxfdf✓✓
BMPbmp—✓
GIFgif—✓
JPEGjpeg—✓
TIFFtiff—✓
Texttxt—✓

Open Source & Licențiere

Aspose.PDF FOSS pentru Java este lansat sub licența MIT, care permite utilizarea comercială, modificarea și redistribuirea. Codul sursă și sistemul de urmărire a problemelor se găsesc la github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. Biblioteca vizează Java 11 sau o versiune ulterioară.


Începeți

Resurse conexe