当前位置: 首页 > news >正文

PDF 文档处理:使用 Java 对比 PDF 找出内容差异

不论是在团队写作还是在个人工作中,PDF 文档往往会经过多次修订和更新。掌握 PDF 文档内容的变化对于管理文档有极大的帮助。通过对比 PDF 文档,用户可以快速找出文档增加、删除和修改的内容,更好地了解文档的演变过程,轻松地管理文档。本文将介绍如何通过 Java 程序对比 PDF 文档并找出文档之间的内容差异

本文所使用的方法需要用到 Spire.PDF for Java,可从Spire.PDF for Java官网获取。

文章目录

    • 通过 Java 程序对比整个 PDF 文档
    • 通过 Java 程序对比 PDF 文档的指定页面

通过 Java 程序对比整个 PDF 文档

对比文档之前需要先将两个文档作为参数传递到 PdfComparer 类的构造函数创建对象,然后再使用 PdfComparer.compare(String fileName) 方法对比这两个 PDF 文档并将对比结果保存到第三个 PDF 文档。 对比结果文档将分两栏展示原文档,增加部分显示在左侧,删除部位显示在右侧。 下面是详细操作步骤:

  • 创建两个 PdfDocument 类对象,并使用 PdfDocument.loadFromFile() 方法加载两个 PDF 文档。
  • 用这两个文档创建一个 PdfComparer 类对象。
  • 使用 PdfComparer.compare() 方法比较两个文档,并将结果保存为新的 PDF 文档。

Java

import com.spire.pdf.PdfDocument;
import com.spire.pdf.comparison.PdfComparer;public class ComparePDF {public static void main(String[] args) {// 创建PdfDocument对象并加载第一个PDF文档PdfDocument pdf1 = new PdfDocument();pdf1.loadFromFile("文件1.pdf");// 创建另一个PdfDocument对象并加载另一个PDF文档PdfDocument pdf2 = new PdfDocument();pdf2.loadFromFile("文件2.pdf");// 创建PdfComparer对象PdfComparer comparer = new PdfComparer(pdf1, pdf2);// 比较两个PDF文档并将比较结果保存到新文档中comparer.compare("比较1.pdf");}
}

对比结果
通过 Java 程序对比整个 PDF 文档

通过 Java 程序对比 PDF 文档的指定页面

初始化 PdfComparer 之后,还可以使用 PdfComparer.getOptions().setPageRanges() 方法限制用于对比的 PDF 页面范围。以下是详细操作步骤:

  • 创建两个 PdfDocument 类对象,并使用 PdfDocument.loadFromFile() 方法加载两个 PDF 文档。
  • 用这两个文档创建一个 PdfComparer 类对象。
  • 使用 PdfComparer.getOptions().setPageRanges() 方法设置要对比的页面范围。
  • 使用 PdfComparer.compare() 方法比较两个文档,并将结果保存为新的 PDF 文档。

Java

import com.spire.pdf.PdfDocument;
import com.spire.pdf.comparison.PdfComparer;public class ComparePDFPageRange {public static void main(String[] args) {// 创建PdfDocument对象并加载第一个PDF文档PdfDocument pdf1 = new PdfDocument();pdf1.loadFromFile("文件1.pdf");// 创建另一个PdfDocument对象并加载另一个PDF文档PdfDocument pdf2 = new PdfDocument();pdf2.loadFromFile("文件2.pdf");// 创建PdfComparer对象PdfComparer comparer = new PdfComparer(pdf1, pdf2);// 设置要比较的页面范围comparer.getOptions().setPageRanges(1, 1, 1, 1);// 比较两个PDF文档并将比较结果保存到新文档中comparer.compare("比较2.pdf");}
}

对比结果
通过 Java 程序对比 PDF 文档的指定页面

以上是关于如何使用 Spire.PDF for Java 对比 PDF 文档,找出文档差异的操作介绍。它还支持许多其他功能,可前往 Spire.PDF for Java 教程页面查看。

相关文章:

PDF 文档处理:使用 Java 对比 PDF 找出内容差异

不论是在团队写作还是在个人工作中,PDF 文档往往会经过多次修订和更新。掌握 PDF 文档内容的变化对于管理文档有极大的帮助。通过对比 PDF 文档,用户可以快速找出文档增加、删除和修改的内容,更好地了解文档的演变过程,轻松地管理…...

压敏电阻有哪些原理?|深圳比创达电子EMC

压敏电阻是一种金属氧化物陶瓷半导体电阻器。它以氧化锌(ZnO)为基料,加入多种(一般5~10种)其它添加剂,经压制成坯体,高温烧结,成为具有晶界特性的多晶半导体陶瓷组件。氧化锌压敏电阻器的微观结构如下图1所示。 氧化锌…...

【计算机网络笔记】Web应用之HTTP协议(涉及HTTP连接类型和HTTP消息格式)

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...

IDEA 2023.2.2 使用 Scala 编译报错 No scalac found to compile scala sources

一、问题 scala: No scalac found to compile scala sources 官网 Bug 链接 二、临时解决方案 Incrementality Type 先变成 IDEA 类型 Please go to Settings > Build, Execution, Deployment > Compiler > Scala Compiler and change the Incrementality type to …...

C51--PWN-舵机控制

PWM开发sg90舵机 1、简介 PWM(pulse width modulation)是脉冲宽度调制缩写。 通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值)。对模拟信号电平进行数字编码,通过调节占空比的变化来…...

electron27+react18集成搭建跨平台应用|electron窗口多开

基于Electron27集成React18创建一个桌面端exe程序。 electron27-vite4-react18基于electron27结合vite4构建工具快速创建react18跨端应用实践。 版本列表 "vite": "^4.4.5" "react": "^18.2.0" "electron": "^27.0.1&…...

【k8s】kubeadm安装k8s集群

一、环境部署 master192.168.88.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.88.20docker、kubeadm、kubelet、kubectl、flannelnode02192.168.88.30docker、kubeadm、kubelet、kubectl、flannelhub.lp.com192.168.88.40 docker、docker-compose harbor-offli…...

三、虚拟机的迁移和删除

虚拟机的本质就是文件(放在文件夹的)。因此虚拟机的迁移很方便,可以把安装好的虚拟系统这个文件夹整体拷贝或者剪切到另外的位置使用。删除也很简单,使用vmware进行移除,再点菜单->从磁盘删除即可,或者手动删除虚拟系统对应的文…...

RabbitMQ的交换机(原理及代码实现)

1.交换机类型 Fanout Exchange(扇形)Direct Exchange(直连)opic Exchange(主题)Headers Exchange(头部) 2.Fanout Exchange 2.1 简介 Fanout 扇形的,散开的&#xff1…...

【C++进阶】pair容器

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…...

Linux--进程等待

1.什么是进程等待 1.通过系统调用wait/waitid,来对子进程进行进行检测和回收的功能。 2.为什么有进程等待 1.对于每个进程来说,如果子进程终止,父进程没有停止,就会形成僵尸进程,导致内存泄露,为了防止僵尸进程的形成…...

VMware CentOS 虚拟机扩容

参考文章: VMware中centos磁盘扩容 - 简书 看这篇文章进行操作!扩展根分区报错,xfs_growfs 提示 / is not a mounted XFS filesystem-CSDN博客 [rootnode001 ~]# df 文件系统 1K-块 已用 可用 已用% 挂载点 /dev/…...

CentOS 编译安装 nginx

CentOS 编译安装 nginx 修改 yum 源地址为 阿里云 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum makecache升级内核和软件 yum -y update安装常用软件和依赖 yum -y install gcc gcc-c make cmake zlib zlib-devel openss…...

学习笔记-MongoDB(命令增删改查,聚合,权限管理,索引,java使用)

基础概念 1 什么是mogodb? MongoDB 是一个基于分布式文件/文档存储的数据库,由 C 编写,可以为 Web 应用提供可扩展、高性能、易部署的数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功…...

第13期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…...

OpenCV学习(一)——图像读取

1. 图像入门 读取图像显示图像写入图像 import cv2# 读取图像 img cv2.imread(lena.jpg) print(img.shape)# 显示图像 cv2.imshow(image, img) cv2.waitKey(0) cv2.destroyAllWindows()# 写入图像 cv2.imwrite(image.jpg, img)1.1 读取图像 读取图像cv.imread(filename, fl…...

并发编程- 线程池ForkJoinPool工作原理分析(实践)

数据结构加油站: Comparison Sorting Visualization 并发设计模式 单线程归并排序 public class MergeSort {private final int[] arrayToSort; //要排序的数组private final int threshold; //拆分的阈值,低于此阈值就不再进行拆分public MergeSort…...

小程序原生开发中的onLoad和onShow

在小程序的原生开发中,onLoad和onShow是两个常用的生命周期函数,用于管理页面的加载和显示。 onLoad:该函数会在页面加载时触发。当页面第一次加载时,它会被调用一次,之后切换到其他页面再返回时不会再触发。可以在on…...

springcloud技术栈以及相关组件

常用中间件 注册中心—nacos分布式服务之间的交互工具—Feign服务安全入口中间件—Gateway各个服务的异步通信组件—rabbitmqRabbitMq分布式场景的应用配置微服务的容器部署–docker分布式检索引擎—elasticSearches在分布式场景的应用分布式事务协调中间间— seata分布式服务…...

An Early Evaluation of GPT-4V(ision)

本文是LLM系列文章,针对《An Early Evaluation of GPT-4V(ision)》的翻译。 GPT-4V的早期评估 摘要1 引言2 视觉理解3 语言理解4 视觉谜题解决5 对其他模态的理解6 结论 摘要 在本文中,我们评估了GPT-4V的不同能力,包括视觉理解、语言理解、…...

vLLM推理引擎教程8-CUDA Graph内存池优化

1. CUDA Graph内存池优化原理 在vLLM这类大模型推理引擎中,CUDA Graph技术已经成为提升性能的标配方案。但很多开发者在使用过程中会遇到一个棘手问题:当需要处理不同batch size的请求时,显存碎片和重复分配会导致性能下降。这时候就需要引入…...

深度学习项目训练环境作品集:10类常见图像分类任务的统一训练模板与结果汇总

深度学习项目训练环境作品集:10类常见图像分类任务的统一训练模板与结果汇总 1. 环境准备与快速上手 深度学习项目训练往往需要复杂的环境配置,从框架安装到依赖库配置,整个过程耗时且容易出错。本镜像基于深度学习项目改进与实战专栏&…...

实测科哥版HeyGem稳定性:文件校验、中断恢复、显存保护全解析

实测科哥版HeyGem稳定性:文件校验、中断恢复、显存保护全解析 1. 引言:为什么稳定性对数字人视频生成如此重要 在数字人视频生成领域,我们常常关注生成效果和速度,却容易忽视一个更基础的问题——稳定性。想象一下,当…...

Legcord:革命性Discord轻量级客户端,10大特性全面解析

Legcord:革命性Discord轻量级客户端,10大特性全面解析 【免费下载链接】ArmCord Legcord is a custom client designed to enhance your Discord experience while keeping everything lightweight. 项目地址: https://gitcode.com/gh_mirrors/ar/ArmC…...

节能模式!OpenClaw优化Qwen3-4B模型夜间任务功耗

节能模式!OpenClaw优化Qwen3-4B模型夜间任务功耗 1. 为什么需要关注OpenClaw的能耗问题 去年夏天,我的MacBook Pro在运行OpenClaw执行夜间数据整理任务时,风扇狂转的声音把我从睡梦中吵醒。摸到发烫的机身时,我突然意识到——这…...

Vitis 2021.1下,手把手教你为Xilinx LWIP库适配国产YT8511以太网芯片(附完整代码)

Vitis 2021.1环境下国产YT8511以太网芯片与Xilinx LWIP库的深度适配指南 当Artix-7 FPGA遇上国产PHY芯片,开发者常常面临官方驱动不兼容的困境。本文将彻底解决Vitis 2021.1环境中LWIP库对YT8511的适配问题,提供从寄存器配置到代码移植的全套方案。 1. 环…...

OpenClaw离线部署方案:Qwen3-32B镜像在无网络环境中的适配改造

OpenClaw离线部署方案:Qwen3-32B镜像在无网络环境中的适配改造 1. 离线部署的核心挑战与解决思路 去年在给某研究所部署内部知识管理系统时,我第一次遇到完全隔离的局域网环境。当时尝试用OpenClaw对接Qwen模型,发现官方默认安装流程完全依…...

零基础玩转OpenClaw:Phi-3-mini-128k-instruct镜像云端体验

零基础玩转OpenClaw:Phi-3-mini-128k-instruct镜像云端体验 1. 为什么选择云端体验OpenClaw 作为一个长期关注AI自动化工具的技术爱好者,我一直在寻找一个既强大又易于上手的本地AI助手框架。OpenClaw的出现让我眼前一亮,但第一次尝试本地安…...

35岁程序员收藏!转行大模型,抢占高薪风口,从入门到高薪 Offer 全攻略

35岁程序员收藏!转行大模型,抢占高薪风口,从入门到高薪 Offer 全攻略 35岁程序员面临职业瓶颈,大模型技术提供了转行出路。文章分析了为何转行大模型是明智之选,包括行业风口、需求缺口大、原有技术可复用、职业生命周…...

STM32开发方式对比与HAL库深度解析

1. STM32开发方式概述对于刚接触STM32的开发者来说,选择合适的开发方式是首要问题。目前主要有三种开发方式:直接操作寄存器、使用标准库(Standard Peripheral Library)和使用HAL库(Hardware Abstraction Layer&#x…...