So sánh file pdf bằng Java – API master GroupDocs.Comparison
Trong hướng dẫn này, bạn sẽ học cách java compare pdf files hiệu quả với GroupDocs.Comparison cho Java. Cho dù bạn đang xây dựng một cổng thông tin xem xét hợp đồng, một hệ thống kiểm soát phiên bản, hoặc một công cụ kiểm tra bài báo học thuật, khả năng phát hiện ngay cả những thay đổi nhỏ nhất trong tài liệu PDF là rất quan trọng. Chúng tôi sẽ hướng dẫn cài đặt, logic so sánh cốt lõi, tạo preview, xử lý mật khẩu, tích hợp đám mây và các thực tiễn tốt nhất được tối ưu hiệu năng—để bạn có thể triển khai giải pháp đáng tin cậy trong vài phút.
Câu trả lời nhanh
- What does GroupDocs Comparison Java do? Nó so sánh hai hoặc nhiều tài liệu, làm nổi bật mọi thay đổi và có thể tạo preview trực quan để xem nhanh.
- Which file formats are supported? Word, PDF, Excel, PowerPoint, hình ảnh, HTML và nhiều hơn nữa.
- Do I need a license for production? Có – giấy phép GroupDocs hợp lệ sẽ loại bỏ watermark và mở khóa toàn bộ tính năng.
- Can I handle large documents? Có – với quản lý bộ nhớ hợp lý và phân trang preview, bạn có thể xử lý các PDF hàng trăm trang.
- Where can I find the latest Maven dependency? Trên kho lưu trữ GroupDocs – kiểm tra phiên bản mới nhất trước khi thêm vào.
Java compare pdf files là gì?
java compare pdf files đề cập đến quá trình lập trình tải hai phiên bản PDF, phát hiện các khác biệt về văn bản, định dạng và đồ họa, và tùy chọn tạo tài liệu kết quả đánh dấu trực quan những thay đổi đó. GroupDocs.Comparison thực hiện điều này bằng một lời gọi API duy nhất, loại bỏ nhu cầu viết logic diff thủ công.
Tại sao sử dụng GroupDocs.Comparison trong các dự án Java?
GroupDocs.Comparison cung cấp phát hiện thay đổi chính xác trên hơn 50 định dạng được hỗ trợ, xử lý các PDF lên tới 200 trang trong vòng dưới 5 giây trên JVM 8 GB tiêu chuẩn, và bao gồm tính năng tạo preview tích hợp. Các artifact sẵn sàng cho Maven giúp việc tích hợp trở nên dễ dàng, và thư viện có khả năng mở rộng ngang khi bạn tuân theo các mẫu quản lý bộ nhớ được đề xuất.
Yêu cầu trước: Những gì bạn cần để bắt đầu
Trước khi bắt đầu viết code, hãy chắc chắn môi trường của bạn đáp ứng các yêu cầu sau:
- Java Development Kit: JDK 8 hoặc mới hơn; JDK 11 hoặc cao hơn được khuyến nghị để cải thiện hiệu năng garbage‑collection.
- Build tool: Maven hoặc Gradle để quản lý phụ thuộc.
- IDE: IntelliJ IDEA, Eclipse, hoặc VS Code – bất kỳ IDE Java hiện đại nào cũng hoạt động tốt.
- Basic Java knowledge: Bạn nên quen thuộc với lớp, phương thức và I/O file.
- Network access: Để tải artifact Maven của GroupDocs và, nếu bạn sử dụng lưu trữ đám mây, truy cập vào endpoint lưu trữ của bạn.
Thêm GroupDocs.Comparison vào dự án của bạn
Thêm phụ thuộc sau vào pom.xml của bạn (thay X.Y.Z bằng phiên bản mới nhất bạn tìm thấy trên trang GroupDocs):
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-comparison</artifactId>
<version>X.Y.Z</version>
</dependency>
Pro tip: Kiểm tra ghi chú phát hành của GroupDocs để biết các bản sửa lỗi và hỗ trợ định dạng theo phiên bản trước khi nâng cấp.
Giấy phép (đừng bỏ qua phần này!)
Một giấy phép dùng thử cho phép bạn đánh giá API, nhưng triển khai sản xuất yêu cầu giấy phép vĩnh viễn để loại bỏ watermark và kích hoạt đầy đủ chức năng.
- Free trial: Tải xuống từ GroupDocs
- Temporary license: Nhận một temporary license để thử nghiệm kéo dài hơn
- Full license: Mua từ GroupDocs Store
Cài đặt ban đầu: chuẩn bị GroupDocs.Comparison
Khởi tạo cơ bản
Lớp Comparer là điểm vào cho mọi thao tác so sánh. Nó điều phối việc tải tài liệu, tính toán diff và tạo kết quả.
<repositories>
<repository>
<id>repository.groupdocs.com</id>
<name>GroupDocs Repository</name>
<url>https://releases.groupdocs.com/comparison/java/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.groupdocs</groupId>
<artifactId>groupdocs-comparison</artifactId>
<version>25.2</version>
</dependency>
</dependencies>
What the snippet does: Nó tạo một thể hiện Comparer, áp dụng giấy phép (nếu bạn có), và chuẩn bị engine cho các lời gọi compare tiếp theo.
Hướng dẫn triển khai từng bước
Phần 1: thiết lập so sánh tài liệu
Bước 1: khởi tạo comparer của bạn
Đối tượng Comparer là thành phần cốt lõi thực thi thuật toán diff. Nó giữ cấu hình như tùy chọn so sánh và thông tin giấy phép.
import com.groupdocs.comparison.Comparer;
import com.groupdocs.comparison.examples.SampleFiles;
// Initialize the comparer with a source document
Comparer comparer = new Comparer(SampleFiles.SOURCE_WORD);
Why this matters: Tài liệu nguồn bạn cung cấp sẽ trở thành baseline; mọi thay đổi sẽ được đo lường so với nó.
Bước 2: thêm tài liệu mục tiêu
Bạn có thể so sánh nguồn với một hoặc nhiều tệp mục tiêu. Trong kịch bản quản lý hợp đồng, nguồn là bản hợp đồng gốc và mục tiêu là phiên bản đã sửa đổi từ bộ phận pháp lý.
// Initialize comparer with the source document
Comparer comparer = new Comparer(SampleFiles.SOURCE_WORD);
Phần 2: tạo preview trang
Bước 1: thiết lập tạo luồng đầu ra
Mẫu delegate preview cho phép bạn kiểm soát hoàn toàn nơi lưu trữ hình ảnh preview—đĩa cục bộ, bucket đám mây, hoặc cơ sở dữ liệu.
// Add a target document for comparison
comparer.add(SampleFiles.TARGET1_WORD);
Bước 2: cấu hình tùy chọn preview
Chỉ tạo preview cho các trang bạn thực sự cần; điều này giảm tiêu thụ CPU lên tới 60 % cho các PDF lớn.
import com.groupdocs.comparison.common.delegates.Delegates;
import java.io.FileOutputStream;
import java.io.OutputStream;
Delegates.CreatePageStream createPageStream = new Delegates.CreatePageStream() {
@Override
public OutputStream invoke(int pageNumber) {
String pagePath = "YOUR_OUTPUT_DIRECTORY" + "/result-GetPagePreviewsForTargetDocument_" + pageNumber + ".png";
try {
return new FileOutputStream(pagePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
};
Bước 3: tạo các preview
API render mỗi trang yêu cầu dưới dạng PNG (không mất dữ liệu) hoặc JPEG (kích thước nhỏ hơn). PNG được khuyến nghị cho tài liệu pháp lý nơi độ chính xác pixel‑perfect quan trọng.
import com.groupdocs.comparison.options.PreviewOptions;
import com.groupdocs.comparison.options.enums.PreviewFormats;
// Set preview options
PreviewOptions previewOptions = new PreviewOptions.Builder(createPageStream)
.setPreviewFormat(PreviewFormats.PNG) // High-quality images
.setPageNumbers(new int[]{1, 2}) // Only generate what you need
.build();
Định dạng tệp được hỗ trợ
GroupDocs.Comparison làm việc với hơn 50 định dạng đầu vào và đầu ra, bao gồm:
- Microsoft Office: DOCX, DOC, XLSX, XLS, PPTX, PPT
- PDF: Tất cả các phiên bản PDF‑1.x, PDF được mã hóa và PDF có phông chữ nhúng
- Text & markup: TXT, RTF, HTML, MHTML
- Images: JPEG, PNG, BMP, GIF
- OpenDocument: ODT, ODS, ODP
Những khả năng rộng này cho phép bạn so sánh một hợp đồng lưu dưới dạng Word với một bản PDF đã quét, tất cả trong cùng một lời gọi API.
Các vấn đề thường gặp và giải pháp
Vấn đề 1: FileNotFoundException khi tạo preview
Nếu thư mục đầu ra không tồn tại hoặc ứng dụng không có quyền ghi, delegate preview sẽ ném ngoại lệ này.
// Generate page previews
comparer.getTargets().get(0).generatePreview(previewOptions);
Solution: Kiểm tra đường dẫn, tạo các thư mục thiếu bằng mã, và cấp quyền hệ thống tệp phù hợp cho tiến trình Java.
Vấn đề 2: Vấn đề bộ nhớ với tài liệu lớn
Xử lý một PDF 300 trang có thể vượt quá heap mặc định 512 MB, gây ra OutOfMemoryError.
Delegates.CreatePageStream createPageStream = new Delegates.CreatePageStream() {
@Override
public OutputStream invoke(int pageNumber) {
String outputDir = "previews";
File directory = new File(outputDir);
if (!directory.exists()) {
directory.mkdirs(); // Create directory if it doesn't exist
}
String pagePath = outputDir + "/preview_page_" + pageNumber + ".png";
try {
return new FileOutputStream(pagePath);
} catch (FileNotFoundException e) {
System.err.println("Failed to create output file: " + pagePath);
throw new RuntimeException("Cannot create preview file", e);
}
}
};
Solution: Tăng heap JVM (-Xmx2g hoặc cao hơn) và xử lý tài liệu theo các phạm vi trang nhỏ hơn bằng tính năng phân trang của PreviewOptions.
Vấn đề 3: Vấn đề giấy phép
Khi file giấy phép bị thiếu hoặc sai định dạng, API sẽ thêm watermark vào mọi đầu ra và vô hiệu hoá một số tùy chọn nâng cao.
// Process fewer pages at a time
PreviewOptions previewOptions = new PreviewOptions.Builder(createPageStream)
.setPreviewFormat(PreviewFormats.PNG)
.setPageNumbers(new int[]{1, 2, 3}) // Limit page range
.build();
// Always dispose of the comparer when done
try (Comparer comparer = new Comparer(sourceDocument)) {
comparer.add(targetDocument);
comparer.getTargets().get(0).generatePreview(previewOptions);
} // Automatic cleanup
Solution: Đặt file giấy phép ở vị trí biết trước và tải nó bằng License.setLicense("path/to/license.lic") trước bất kỳ lời gọi so sánh nào.
Mẹo hiệu năng và thực tiễn tốt nhất (java comparison best practices)
- Limit preview generation – yêu cầu chỉ những trang bạn cần; sử dụng
pageNumbersđể bỏ qua các phần không liên quan. - Choose the right image format – PNG cho tài liệu pháp lý không mất dữ liệu, JPEG cho thumbnail khi kích thước quan trọng.
- Implement caching – lưu kết quả so sánh (ví dụ: hash của source + target) để tránh xử lý lại các tệp không thay đổi.
- Manage memory – bao bọc việc sử dụng
Comparertrong khối try‑with‑resources và gọiclose()khi hoàn thành. - Dispose of comparer objects – luôn giải phóng tài nguyên native để giảm footprint của JVM.
Mẫu mã sẵn sàng cho môi trường production
Dưới đây là vòng đời được khuyến nghị cho một tác vụ so sánh trong microservice.
// Apply license at the start of your application
License license = new License();
license.setLicense("path/to/your/license.lic");
Các ví dụ triển khai thực tế
Ví dụ 1: hệ thống quản lý hợp đồng
Bộ phận pháp lý tải lên hợp đồng gốc (source) và phiên bản đã sửa đổi (target). Dịch vụ trả về PDF đã được đánh dấu và một tập hợp PNG preview trang để kiểm tra nhanh.
public class DocumentComparisonService {
private static final String OUTPUT_DIR = "document-previews/";
public ComparisonResult compareDocuments(String sourcePath, String targetPath) {
try (Comparer comparer = new Comparer(sourcePath)) {
comparer.add(targetPath);
// Perform comparison
String resultPath = OUTPUT_DIR + "comparison-result.docx";
comparer.compare(resultPath);
// Generate previews if needed
generatePreviews(comparer, 3); // First 3 pages only
return new ComparisonResult(resultPath, true);
} catch (Exception e) {
log.error("Document comparison failed", e);
return new ComparisonResult(null, false);
}
}
private void generatePreviews(Comparer comparer, int maxPages) {
// Implementation details...
}
}
Ví dụ 2: đánh giá bài báo học thuật
Các nhà nghiên cứu nộp bản thảo đã sửa. Hệ thống so sánh PDF mới với phiên bản trước, đánh dấu các trích dẫn đã thay đổi và tạo ảnh preview cho bảng điều khiển người đánh giá.
public class ContractVersionManager {
public void reviewContractChanges(String originalContract, String revisedContract) {
try (Comparer comparer = new Comparer(originalContract)) {
comparer.add(revisedContract);
// Generate comparison document
String comparisonResult = "contracts/comparison-" + System.currentTimeMillis() + ".docx";
comparer.compare(comparisonResult);
// Create preview for stakeholder review
generatePreviewsForReview(comparer);
}
}
}
Cách java compare pdf files với bảo vệ mật khẩu
LoadOptions là lớp cho phép bạn chỉ định các tham số tải như mật khẩu cho tài liệu được mã hoá. Để so sánh một PDF được bảo vệ, tạo một thể hiện LoadOptions với mật khẩu, truyền nó cho Comparer khi tải tài liệu, sau đó thực hiện so sánh như bình thường. Thư viện sẽ giải mã file trong bộ nhớ, đảm bảo không có bản rõ nào được ghi ra đĩa, và mọi thao tác tiếp theo—including preview generation và diff calculation—hoạt động một cách trong suốt.
public class AcademicDocumentReview {
public void compareResearchDrafts(String draft1, String draft2) {
try (Comparer comparer = new Comparer(draft1)) {
comparer.add(draft2);
// Focus on specific sections (first 10 pages typically contain main content)
PreviewOptions options = new PreviewOptions.Builder(createPageStream)
.setPageNumbers(IntStream.rangeClosed(1, 10).toArray())
.setPreviewFormat(PreviewFormats.PNG)
.build();
comparer.getTargets().get(0).generatePreview(options);
}
}
}
So sánh tài liệu lưu trữ trên đám mây
Nếu nguồn và mục tiêu của bạn nằm trên Amazon S3, Azure Blob, hoặc Google Cloud Storage, chỉ cần cung cấp một InputStream lấy từ SDK đám mây thay vì đường dẫn file cục bộ.
LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
Comparer comparer = new Comparer("protected-document.docx", loadOptions);
Câu hỏi thường gặp
Q: Làm thế nào để xử lý tài liệu được bảo vệ bằng mật khẩu?
A: Sử dụng LoadOptions để cung cấp mật khẩu khi tạo thể hiện Comparer, như đã minh họa ở trên.
Q: Tôi có thể so sánh tài liệu được lưu trữ trên đám mây không?
A: Có—chỉ cần cung cấp các input stream từ nhà cung cấp đám mây cho Comparer.
Q: Kích thước tệp tối đa mà GroupDocs.Comparison có thể xử lý là bao nhiêu?
A: Không có giới hạn cứng, nhưng đối với các tệp lớn hơn 100 MB bạn nên tăng heap JVM hoặc xử lý tài liệu theo các khối nhỏ hơn để tránh OutOfMemoryError.
Q: Thuật toán so sánh có độ chính xác như thế nào?
A: Thư viện sử dụng các thuật toán diff tiên tiến, phát hiện thay đổi trong văn bản, định dạng, hình ảnh, bảng và các đối tượng nhúng, cung cấp kết quả diff gần như pixel‑perfect.
Q: Tôi có thể tùy chỉnh loại thay đổi nào sẽ được phát hiện không?
A: Chắc chắn. Đặt CompareOptions để bật hoặc tắt phát hiện văn bản, định dạng, hình ảnh, bảng, và hơn thế nữa.
Q: API có hỗ trợ tạo preview chỉ cho các trang được chọn không?
A: Có—cấu hình PreviewOptions với một mảng pageNumbers cụ thể để giới hạn đầu ra chỉ ở những trang bạn cần.
Kết luận
Bạn đã có một hướng dẫn đầy đủ, sẵn sàng cho production để java compare pdf files với GroupDocs.Comparison. Bằng cách thực hiện các bước cài đặt, áp dụng các khuyến nghị về hiệu năng, và sử dụng các đoạn mã xử lý mật khẩu và tích hợp đám mây, bạn có thể nhúng khả năng so sánh tài liệu mạnh mẽ vào bất kỳ ứng dụng Java nào—dù là cổng thông tin xem xét hợp đồng, quy trình làm việc bài báo học thuật, hay hệ thống lưu trữ tài liệu quy mô lớn.
Last Updated: 2026-11-01
Tested With: GroupDocs.Comparison 25.2
Author: GroupDocs
InputStream sourceStream = getDocumentFromCloud("source-doc-id");
InputStream targetStream = getDocumentFromCloud("target-doc-id");
Comparer comparer = new Comparer(sourceStream);
comparer.add(targetStream);