Giới thiệu
Aspose.PDF FOSS cho Java là một thư viện Java được cấp phép MIT để tạo và chỉnh sửa tài liệu PDF. Các lớp của nó được tổ chức dưới gói org.aspose.pdf và các gói con của nó (org.aspose.pdf.annotations, org.aspose.pdf.forms, org.aspose.pdf.facades, và các gói khác), và Document là điểm vào cho hầu hết các luồng công việc. Thư viện không có phụ thuộc thời gian chạy của bên thứ ba; phụ thuộc duy nhất trong quá trình xây dựng Maven của nó là JUnit, ở phạm vi test.
Bài thông báo thư viện, bài viết facades, và bài page-editing đã đề cập đến việc tạo tài liệu, các trường biểu mẫu, các lớp façade để trích xuất, mã hóa và đóng dấu, và các thao tác trang với PdfFileEditor. Bài viết này đề cập đến năm lĩnh vực khác của cùng API mà những bài viết đó chưa trình bày: chú thích đánh dấu văn bản, chú thích tự do, hành động ở mức tài liệu, cơ chế bảo vệ kích thước khi giải mã luồng, và ghi nhật ký chẩn đoán.
Mỗi lĩnh vực là một API nhỏ, độc lập. Các phần dưới đây trình bày các lời gọi, các giá trị mặc định, và các trường hợp biên mà các bài kiểm tra của thư viện tự xác định.
Các tính năng chính
Chú thích đánh dấu văn bản
HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation, và SquigglyAnnotation mỗi cái nhận một Page và một Rectangle. Bộ khởi tạo suy ra các điểm quad của chú thích từ hình chữ nhật, vì vậy getQuadPoints() trả về tám giá trị mà không cần tính toán thủ công. Đối với hình chữ nhật (100, 200, 300, 250) kết quả là [100, 250, 300, 250, 100, 200, 300, 200]: góc trên-trái, góc trên-phải, góc dưới-trái, rồi góc dưới-phải. setQuadPoints() thay thế các giá trị đã suy ra bằng mảng tám giá trị của bạn, và một chú thích được xây dựng lại từ từ điển hiện có sẽ giữ các điểm quad đã được lưu trữ ở đó. getSubtype() trả về tên phụ loại PDF: Highlight, Underline, StrikeOut, hoặc Squiggly.
Việc tạo một chú thích không gắn nó vào trang. Hãy thêm nó bằng 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");
}
Ghi chú Văn bản Tự do
FreeTextAnnotation đặt văn bản trực tiếp lên trang. Hàm khởi tạo ba đối số của nó nhận một DefaultAppearance, chứa tên phông chữ, kích thước phông và màu văn bản. Ba thuộc tính định hình ghi chú:
setIntent()nhận mộtFreeTextIntent:FreeText,FreeTextCallout, hoặcFreeTextTypeWriter. Một chú thích mới báo cáoUndefined, và việc truyềnnullsẽ đưa nó trở lại trạng thái đó.setCallout()nhận đường kẻ ghi chú dưới dạng một mảng gồm hai hoặc ba điểm{x, y}. Một mảng có độ dài khác sẽ bị bỏ qua và ghi chú hiện có vẫn giữ nguyên;nullsẽ xóa ghi chú.setEndingStyle()nhận một giá trịLineEndingnhưOpenArrowhoặcDiamond. Một chú thích mới báo cáoLineEnding.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");
}
Từ điển chú thích đã lưu lưu các giá trị này dưới dạng /IT, /CL và /LE.
Các hành động cấp độ tài liệu
Document.getActions() trả về một chế độ xem DocumentActions của danh mục tài liệu. setOpenAction() lưu một hành động vào mục /OpenAction của danh mục. Năm trình kích hoạt khác, setBeforeClosing(), setBeforeSaving(), setAfterSaving(), setBeforePrinting() và setAfterPrinting(), được lưu độc lập trong từ điển /AA các hành động bổ sung của danh mục.
Mỗi getter trả về null cho đến khi trình kích hoạt của nó được đặt. Việc truyền null cho một setter sẽ xóa mục đó, và việc xóa trình kích hoạt cuối cùng cũng sẽ xóa từ điển /AA. Các hành động là các thể hiện PdfAction; GoToURIAction là một bí danh của UriAction, và getType() của nó trả về URI. Đối tượng DocumentActions là một chế độ xem trực tiếp, vì vậy một lời gọi sau tới getActions() sẽ thấy các thay đổi được thực hiện qua lời gọi trước, và các trình kích hoạt được đọc lại khi tệp đã lưu được mở lại.
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");
}
Giới hạn giải mã cho các bộ lọc luồng
Các luồng PDF được lưu dưới dạng đã mã hoá, và một luồng bị hỏng hoặc độc hại có thể mở rộng vượt xa kích thước đã lưu. DecodeLimits là một cơ chế bảo vệ được chia sẻ bởi các bộ lọc FlateDecode, LZWDecode và RunLengthDecode. Khi đầu ra đã giải mã của một luồng vượt quá giới hạn, bộ lọc sẽ ném DecodeSizeLimitException, một lớp con của IOException, thay vì giải mã cho đến khi bộ nhớ heap cạn kiệt.
Giới hạn mặc định là 256MB cho mỗi luồng đã giải mã (DecodeLimits.DEFAULT_MAX_DECODED_BYTES). Để thay đổi, đặt thuộc tính hệ thống được đặt tên bởi DecodeLimits.PROPERTY, mà là aspose.pdf.maxDecodedStreamBytes, thành kích thước tính bằng byte; giá trị 0 hoặc thấp hơn sẽ vô hiệu hoá cơ chế bảo vệ. Thuộc tính này được đọc mỗi khi giải mã, vì vậy có thể thay đổi trong thời gian chạy.
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;
}
}
Các luồng dưới giới hạn sẽ được giải mã như bình thường. FlateFilter và RunLengthFilter đều thực hiện vòng qua dữ liệu qua encode() và decode() khi đầu ra vẫn nằm dưới giới hạn.
Ghi nhật ký chẩn đoán
Thư viện ghi nhật ký thông qua java.util.logging dưới bộ ghi org.aspose.pdf và mặc định im lặng: mức độ là OFF. AsposePdfLogging bật ghi nhật ký.
setLevel(Level)đặt mức độ từ mã;nulltrả về thư viện vềOFF.getLevel()đọc lại nó.- Thuộc tính hệ thống
aspose.pdf.log(cũng khả dụng dưới tênAsposePdfLogging.LOG_PROPERTY) đặt nó từ dòng lệnh.configureFromSystemProperty()áp dụng thuộc tính và cũng chạy khi lớp được tải. Các giá trịonvàwarningchọnWARNING,verbosechọnFINE,debugchọnALL, bất kỳ tênjava.util.logging.Levelnào nhưSEVEREđều được chấp nhận, và một giá trị không nhận dạng sẽ quay lạiOFF.
WARNING cho phép các cảnh báo của engine được truyền; FINE, cài đặt verbose, cũng cho phép chi tiết phục hồi của parser được truyền. AsposePdfLogging chỉ thay đổi nhánh logger org.aspose.pdf. Nó không thay đổi mức độ của logger gốc, và logger của thư viện không chuyển bản ghi tới các handler của logger gốc. Nếu logging được bật và không có handler nào được gắn vào logger của thư viện, một console handler sẽ được cài đặt.
// 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
Bắt đầu nhanh
Thêm phụ thuộc vào quá trình biên dịch của bạn:
<dependency>
<groupId>org.aspose</groupId>
<artifactId>aspose-pdf-foss</artifactId>
<version>26.8.0</version>
</dependency>Ví dụ sau tạo một trang, thêm phần tô sáng và một chú thích văn bản tự do, và lưu tài liệu:
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");
}
Định dạng được hỗ trợ
Hỗ trợ định dạng được xác nhận bởi các tùy chọn tải và lưu của thư viện và các thiết bị render:
| Định dạng | Phần mở rộng | Đọc | Ghi |
|---|---|---|---|
| ✓ | ✓ | ||
| HTML | html | ✓ | ✓ |
| DOCX | docx | ✓ | ✓ |
| DOC | doc | ✓ | ✓ |
| XFDF | xfdf | ✓ | ✓ |
| BMP | bmp | — | ✓ |
| GIF | gif | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
Mã nguồn mở & Giấy phép
Aspose.PDF FOSS cho Java được phát hành dưới giấy phép MIT, cho phép sử dụng thương mại, sửa đổi và phân phối lại. Mã nguồn và công cụ theo dõi lỗi có tại github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Java. Thư viện nhắm tới Java 11 trở lên.