Pendahuluan

Aspose.PDF FOSS untuk Java adalah perpustakaan Java berlisensi MIT untuk membuat dan menyunting dokumen PDF. Kelas-kelasnya diatur di dalam paket org.aspose.pdf dan sub-paketnya (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades, dan lainnya), dan Document adalah titik masuk untuk kebanyakan alur kerja. Perpustakaan ini tidak memiliki dependensi runtime pihak ketiga; satu-satunya dependensi dalam build Maven-nya adalah JUnit, pada lingkup test.

Pengumuman library announcement, posting facades post, dan posting page-editing post sudah mencakup pembuatan dokumen, bidang formulir, kelas facade untuk ekstraksi, enkripsi, dan stamping, serta operasi halaman dengan PdfFileEditor. Posting ini mencakup lima area lain dari API yang sama yang tidak ditunjukkan oleh posting tersebut: anotasi penanda teks, catatan teks bebas, aksi tingkat dokumen, penjagaan ukuran pada dekoding aliran, dan pencatatan diagnostik.

Setiap area merupakan API kecil yang berdiri sendiri. Bagian-bagian di bawah ini menunjukkan pemanggilan, nilai default, dan kasus tepi yang ditetapkan oleh tes internal perpustakaan.


Fitur Utama

Anotasi Penanda Teks

HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation, dan SquigglyAnnotation masing-masing menerima sebuah Page dan sebuah Rectangle. Konstruktor menghasilkan titik kuad anotasi dari persegi panjang, sehingga getQuadPoints() mengembalikan delapan nilai tanpa perhitungan manual. Untuk persegi panjang (100, 200, 300, 250) hasilnya adalah [100, 250, 300, 250, 100, 200, 300, 200]: kiri-atas, kanan-atas, kiri-bawah, kemudian kanan-bawah. setQuadPoints() menggantikan nilai yang dihasilkan dengan array delapan nilai Anda sendiri, dan anotasi yang dibangun kembali dari kamus yang ada mempertahankan titik kuad yang sudah disimpan di sana. getSubtype() mengembalikan nama subtipe PDF: Highlight, Underline, StrikeOut, atau Squiggly.

Membuat anotasi tidak menempelkannya ke halaman. Tambahkan dengan 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");
}

Panggilan Teks Bebas

FreeTextAnnotation menempatkan teks secara langsung pada halaman. Konstruktor tiga-argumennya menerima DefaultAppearance, yang memuat nama font, ukuran font, dan warna teks. Tiga properti membentuk panggilan:

  • setIntent() menerima FreeTextIntent: FreeText, FreeTextCallout, atau FreeTextTypeWriter. Anotasi baru melaporkan Undefined, dan memberikan null mengembalikannya ke keadaan itu.
  • setCallout() menerima garis panggilan sebagai array berisi dua atau tiga titik {x, y}. Array dengan panjang lain diabaikan dan panggilan yang ada tetap berada; null menghapus panggilan.
  • setEndingStyle() menerima nilai LineEnding seperti OpenArrow atau Diamond. Anotasi baru melaporkan 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");
}

Kamus anotasi yang disimpan menyimpan nilai-nilai ini sebagai /IT, /CL, dan /LE.

Tindakan Tingkat Dokumen

Document.getActions() mengembalikan tampilan DocumentActions dari katalog dokumen. setOpenAction() menyimpan sebuah aksi dalam entri /OpenAction katalog. Lima pemicu tambahan, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting(), dan setAfterPrinting(), disimpan secara terpisah dalam kamus additional-actions /AA katalog.

Setiap getter mengembalikan null sampai pemicunya diatur. Memberikan null ke setter menghapus entri tersebut, dan menghapus pemicu terakhir juga menghapus kamus /AA. Aksi adalah instance PdfAction; GoToURIAction merupakan alias dari UriAction, dan getType()-nya mengembalikan URI. Objek DocumentActions adalah tampilan langsung, sehingga panggilan getActions() berikutnya melihat perubahan yang dibuat oleh panggilan sebelumnya, dan pemicu dibaca kembali ketika file yang disimpan dibuka kembali.

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

Batas Dekode untuk Filter Aliran

Aliran PDF disimpan dalam bentuk terkode, dan aliran yang rusak atau berbahaya dapat berkembang jauh melebihi ukuran yang disimpan. DecodeLimits adalah penjaga yang dibagi oleh filter FlateDecode, LZWDecode, dan RunLengthDecode. Ketika output terdekripsi sebuah aliran melebihi batas, filter melempar DecodeSizeLimitException, subclass dari IOException, alih-alih mendekode hingga heap habis.

Batas default adalah 256 MB per aliran yang didekode (DecodeLimits.DEFAULT_MAX_DECODED_BYTES). Untuk mengubahnya, atur properti sistem yang dinamai oleh DecodeLimits.PROPERTY, yang merupakan aspose.pdf.maxDecodedStreamBytes, ke ukuran dalam byte; nilai 0 atau kurang menonaktifkan penjaga. Properti ini dibaca pada setiap proses dekode, sehingga dapat diubah pada waktu berjalan.

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

Aliran di bawah batas didekode seperti biasa. FlateFilter dan RunLengthFilter keduanya melakukan round-trip data melalui encode() dan decode() ketika output tetap di bawah limit.

Pencatatan Diagnostik

Perpustakaan mencatat melalui java.util.logging di bawah logger org.aspose.pdf dan secara default diam: levelnya adalah OFF. AsposePdfLogging mengaktifkan pencatatan.

  • setLevel(Level) mengatur level dari kode; null mengembalikan perpustakaan ke OFF. getLevel() membacanya kembali.
  • Properti sistem aspose.pdf.log (juga tersedia sebagai AsposePdfLogging.LOG_PROPERTY) mengaturnya dari baris perintah. configureFromSystemProperty() menerapkan properti tersebut dan juga dijalankan ketika kelas dimuat. Nilai on dan warning memilih WARNING, verbose memilih FINE, debug memilih ALL, nama java.util.logging.Level apa pun seperti SEVERE diterima, dan nilai yang tidak dikenali akan kembali ke OFF.

WARNING memungkinkan peringatan mesin lewat; FINE, pengaturan verbose, juga memungkinkan detail pemulihan parser lewat. AsposePdfLogging hanya mengubah subtree logger org.aspose.pdf. Itu tidak mengubah level logger root, dan logger perpustakaan tidak meneruskan record ke handler logger root. Jika pencatatan diaktifkan dan tidak ada handler yang terpasang pada logger perpustakaan, handler konsol akan dipasang.

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

Panduan Cepat

Tambahkan dependensi ke build Anda:

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

Contoh berikut membuat sebuah halaman, menambahkan sorotan dan catatan teks bebas, dan menyimpan dokumen:

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

Format yang Didukung

Dukungan format sebagaimana dikonfirmasi oleh opsi muat dan simpan perpustakaan serta perangkat rendering:

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

Sumber Terbuka & Lisensi

Aspose.PDF FOSS untuk Java dirilis di bawah lisensi MIT, yang mengizinkan penggunaan komersial, modifikasi, dan redistribusi. Kode sumber dan pelacak masalah berada di github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. Perpustakaan menargetkan Java 11 atau lebih baru.


Memulai

Sumber Daya Terkait