Java 比较 PDF 文件 – 主版 GroupDocs.Comparison API

在本指南中,您将学习如何使用 GroupDocs.Comparison for Java 高效地 java compare pdf files。无论您是在构建合同审查门户、版本控制系统,还是学术论文检查器,能够检测 PDF 文档中即使是最小的更改都是必不可少的。我们将逐步介绍设置、核心比较逻辑、预览生成、密码处理、云集成以及性能调优的最佳实践——让您在几分钟内交付可靠的解决方案。

快速答案

  • GroupDocs Comparison Java 的作用是什么? 它比较两个或多个文档,突出显示每个更改,并且可以生成可视化预览以便快速审阅。
  • 支持哪些文件格式? Word、PDF、Excel、PowerPoint、图像、HTML 等等。
  • 生产环境需要许可证吗? 是的——有效的 GroupDocs 许可证会去除水印并解锁完整功能集。
  • 我能处理大文档吗? 可以——通过适当的内存管理和预览分页,您可以处理数百页的 PDF。
  • 在哪里可以找到最新的 Maven 依赖? 在 GroupDocs 仓库——在添加之前请检查最新版本。

什么是 java compare pdf files?

java compare pdf files 指的是加载两个 PDF 版本,检测文本、格式和图形差异,并可选地生成一个在视觉上标记这些更改的结果文档的编程过程。GroupDocs.Comparison 通过一次 API 调用实现此功能,消除了手动差异逻辑的需求。

为什么在 Java 项目中使用 GroupDocs.Comparison?

GroupDocs.Comparison 在 50 多种支持的格式中提供 准确的更改检测,在标准 8 GB JVM 上能够在 5 秒以内处理多达 200 页的 PDF,并且内置预览生成功能。其 Maven 就绪的构件使集成毫不费力,并且在遵循推荐的内存管理模式时,库能够水平扩展。

前置条件:开始所需的内容

在深入代码之前,请确认您的环境满足以下要求:

  • Java 开发工具包(JDK): JDK 8 或更高;建议使用 JDK 11 或更高,以获得更好的垃圾回收性能。
  • 构建工具: 用于依赖解析的 Maven 或 Gradle。
  • IDE: IntelliJ IDEA、Eclipse 或 VS Code——任何现代 Java IDE 都可使用。
  • 基本的 Java 知识: 您应熟悉类、方法和文件 I/O。
  • 网络访问: 用于下载 GroupDocs Maven 构件,以及如果使用云存储,则需要访问您的存储端点。

将 GroupDocs.Comparison 添加到您的项目中

在您的 pom.xml 中添加以下依赖(将 X.Y.Z 替换为您在 GroupDocs 网站上找到的最新版本):

<dependency>
    <groupId>com.groupdocs</groupId>
    <artifactId>groupdocs-comparison</artifactId>
    <version>X.Y.Z</version>
</dependency>

专业提示: 在升级之前,请查看 GroupDocs 发布说明,以了解特定版本的错误修复和新格式支持。

许可(不要跳过!)

试用许可证允许您评估 API,但生产部署需要永久许可证以去除水印并启用完整功能。

  1. 免费试用: 从 GroupDocs 下载
  2. 临时许可证: 获取一个 temporary license 以进行扩展测试
  3. 完整许可证: 从 GroupDocs Store 购买

初始设置:准备 GroupDocs.Comparison

基本初始化

Comparer 类是所有比较操作的入口点。它负责文档加载、差异计算和结果生成。

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

代码片段的作用: 它创建一个 Comparer 实例,应用许可证(如果有),并为后续的比较调用准备引擎。

步骤式实现指南

第 1 部分:设置文档比较

步骤 1:初始化比较器

Comparer 对象是执行差异算法的核心组件。它保存比较选项和许可证信息等配置。

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

重要性说明: 您提供的源文档成为基准;所有更改都相对于它进行衡量。

步骤 2:添加目标文档

您可以将源文档与一个或多个目标文件进行比较。在合同管理场景中,源文档是原始协议,目标文档是法律团队提供的修订版本。

// Initialize comparer with the source document
Comparer comparer = new Comparer(SampleFiles.SOURCE_WORD);

第 2 部分:生成页面预览

步骤 1:设置输出流创建

预览委托模式让您完全控制预览图像的存储位置——本地磁盘、云存储桶或数据库。

// Add a target document for comparison
comparer.add(SampleFiles.TARGET1_WORD);

步骤 2:配置预览选项

仅为实际需要的页面生成预览;这可将大型 PDF 的 CPU 使用率降低最多 60%。

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

步骤 3:生成预览

API 将每个请求的页面渲染为 PNG(无损)或 JPEG(体积更小)。对于像素完美至关重要的法律文档,推荐使用 PNG。

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();

支持的文件格式

GroupDocs.Comparison 支持 50 多种输入和输出格式,包括:

  • Microsoft Office: DOCX、DOC、XLSX、XLS、PPTX、PPT
  • PDF: 所有 PDF‑1.x 版本、加密 PDF 和嵌入字体的 PDF
  • 文本与标记: TXT、RTF、HTML、MHTML
  • 图像: JPEG、PNG、BMP、GIF
  • OpenDocument: ODT、ODS、ODP

这些广泛的能力让您能够在同一次 API 调用中比较以 Word 文件存储的合同与扫描的 PDF 版本。

常见问题及解决方案

问题 1:预览生成期间的 FileNotFoundException

如果输出目录不存在或应用程序缺少写入权限,预览委托会抛出此异常。

// Generate page previews
comparer.getTargets().get(0).generatePreview(previewOptions);

解决方案: 验证路径,使用代码创建缺失的文件夹,并授予 Java 进程相应的文件系统权限。

问题 2:大型文档的内存问题

处理 300 页的 PDF 可能会超出默认的 512 MB 堆内存,导致 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);
        }
    }
};

解决方案: 增加 JVM 堆大小(-Xmx2g 或更高),并使用 PreviewOptions 的分页功能在更小的页面范围内处理文档。

问题 3:许可证问题

当许可证文件缺失或格式错误时,API 会在每个输出上添加水印并禁用某些高级选项。

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

解决方案: 将许可证文件放置在已知位置,并在任何比较调用之前使用 License.setLicense("path/to/license.lic") 加载它。

性能提示和最佳实践(java 比较最佳实践)

  1. 限制预览生成——仅请求所需页面;使用 pageNumbers 跳过不相关的章节。
  2. 选择合适的图像格式——对无损的法律文档使用 PNG,对尺寸重要的缩略图使用 JPEG。
  3. 实现缓存——存储比较结果(例如 source + target 的哈希),以避免对未更改的文件重新处理。
  4. 管理内存——在 try‑with‑resources 块中使用 Comparer,完成后调用 close()。
  5. 释放 comparer 对象——始终释放本机资源,以保持 JVM 占用低。

生产就绪代码模式

下面是微服务中比较任务的推荐生命周期。

// Apply license at the start of your application
License license = new License();
license.setLicense("path/to/your/license.lic");

实际实现示例

示例 1:合同管理系统

法律部门上传原始合同(源)和修订版本(目标)。服务返回带有高亮标记的 PDF 以及一组页面预览 PNG,以便快速可视化检查。

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

示例 2:学术论文审查

研究人员提交修订稿件。系统比较新 PDF 与之前的版本,标记修改的引用,并为审阅者仪表板生成预览图像。

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

如何在密码保护下 java compare pdf files

LoadOptions 是一个类,允许您指定加载参数,例如加密文档的密码。要比较受保护的 PDF,创建带有密码的 LoadOptions 实例,在加载文档时将其传递给 Comparer,然后照常运行比较。库在内存中解密文件,确保未将明文写入磁盘,所有后续操作——包括预览生成和差异计算——都能透明工作。

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

比较存储在云端的文档

如果您的源和目标位于 Amazon S3、Azure Blob 或 Google Cloud Storage,只需提供从云 SDK 获取的 InputStream,而不是本地文件路径。

LoadOptions loadOptions = new LoadOptions();
loadOptions.setPassword("your-password");
Comparer comparer = new Comparer("protected-document.docx", loadOptions);

常见问题

Q: 我该如何处理受密码保护的文档?
A: 如上所示,在创建 Comparer 实例时使用 LoadOptions 提供密码。

Q: 我可以比较存储在云存储中的文档吗?
A: 可以——只需将来自云提供商的输入流提供给 Comparer。

Q: GroupDocs.Comparison 能处理的最大文件大小是多少?
A: 没有硬性限制,但对于大于 100 MB 的文件,您应增加 JVM 堆大小或将文档分成更小的块处理,以避免 OutOfMemoryError。

Q: 比较算法的准确性如何?
A: 该库使用先进的差异算法,能够检测文本、格式、图像、表格和嵌入对象的更改,提供接近像素完美的可视化差异结果。

Q: 我可以自定义检测哪些类型的更改吗?
A: 当然。设置 CompareOptions 可启用或禁用文本、格式、图像、表格等的检测。

Q: API 是否支持仅为选定页面生成预览?
A: 是的——通过使用特定的 pageNumbers 数组配置 PreviewOptions,将输出限制为所需页面。

结论

您现在拥有了一份完整的、可用于生产的 java compare pdf files 使用 GroupDocs.Comparison 的指南。通过遵循设置步骤、应用性能建议,并利用密码处理和云集成代码片段,您可以将强大的文档比较功能嵌入任何 Java 应用程序——无论是合同审查门户、学术论文工作流,还是大规模文档归档系统。


最后更新: 2026-11-01
测试版本: GroupDocs.Comparison 25.2
作者: GroupDocs

InputStream sourceStream = getDocumentFromCloud("source-doc-id");
InputStream targetStream = getDocumentFromCloud("target-doc-id");
Comparer comparer = new Comparer(sourceStream);
comparer.add(targetStream);

相关教程