PDF文档是我们日常办公中使用最频繁的文档格式。但因为大多数PDF文档都包含很多页面图像或大量图片,这就导致PDF文档过大,处理起来较为麻烦。PDF文件过大,就会导致传输或者下载的速度变慢,也会增加传输失败的风险,影响办公效率。因此我们需要对PDF文档进行压缩。本文将从以下两方面介绍如何通过Java应用程序压缩PDF文档。

在使用PDF文件过程中,经常会出现由于体积过大导致文件传输失败的情况。遇到这种情况,我们可以先将PDF文件压缩一下再进行传输。而除了压缩文档内容以外,压缩图片是缩小PDF文档的主要方法之一。本文将分为2部分分别介绍如何通过Java代码压缩PDF文档。希望这篇文章能对大家有所帮助。

  • 压缩PDF文档中的内容及图片
  • 压缩PDF文档中的高分辨率图片

1.引入jar

导入方法1:

手动引入。将 Free Spire.PDF for Java 下载到本地,解压,找到lib文件夹下的Spire.PDF.jar文件。在IDEA中打开如下界面,将本地路径中的jar文件引入Java程序:

导入方法2:如果您想通过 Maven安装,则可以在 pom.xml 文件中添加以下代码导入 JAR 文件。

<repositories>
<repository>
<id>com.e-iceblue</id>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.pdf.free</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>

压缩PDF文档中的内容及图片

压缩PDF文档中的内容及图片的详细步骤如下:

  • 创建 PdfDocument 类的对象。

  • 使用 PdfDocument.loadFromFile() 方法加载 PDF 文档。

  • 使用 PdfDocument.getFileInfo().setIncrementalUpdate() 方法将增量更新设置为false。

  • 使用 PdfDocument.setCompressionLevel() 方法将压缩级别设置为最佳,以压缩文档中的内容。 您可以从 PdfCompressionLevel 枚举中选择其他一些级别。

  • 循环遍历文档中的页面,使用 PdfPageBase.getImagesInfo() 方法获取每个页面的图像信息集合。

  • 遍历集合中的所有项目,并使用 PdfBitmap.setQuality() 方法压缩特定图像的质量。

  • 使用 PdfPageBase.replaceImage() 方法将原始图像替换为压缩图像。使用 PdfDocument.saveToFile() 方法将文档保存到另一个 PDF 文件。

完整代码

Java

import com.spire.pdf.PdfCompressionLevel;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.exporting.PdfImageInfo;
import com.spire.pdf.graphics.PdfBitmap; public class CompressPDFImage { public static void main(String[] args) { //创建 PdfDocument 类的对象。
PdfDocument doc = new PdfDocument(); //加载 PDF 文档
doc.loadFromFile("测试文档.pdf"); //将增量更新设置为false
doc.getFileInfo().setIncrementalUpdate(false); //将压缩级别设置为最佳
doc.setCompressionLevel(PdfCompressionLevel.Best); //循环遍历文档中的页面
for (int i = 0; i < doc.getPages().getCount(); i++) { //获取特定页面
PdfPageBase page = doc.getPages().get(i); //获取每个页面的图像信息集合
PdfImageInfo[] images = page.getImagesInfo(); //遍历集合中的项目
if (images != null && images.length > 0)
for (int j = 0; j < images.length; j++) { //获取指定图像
PdfImageInfo image = images[j];
PdfBitmap bp = new PdfBitmap(image.getImage()); //设置压缩质量
bp.setQuality(20); //用压缩后的图片替换原始图片
page.replaceImage(j, bp);
} //保存文件
doc.saveToFile("压缩PDF文档.pdf");
doc.close();
}
}
}

效果对比图

压缩 PDF 文档中的高分辨率图像

本方法仅对文档中的高分辨率图像进行无损压缩,而低分辨率的图像将不再被压缩。

  • 创建 PdfDocument 类的对象。
  • 使用 PdfDocument.loadFromFile() 方法加载 PDF 文档。
  • 使用 PdfDocument.getFileInfo().setIncrementalUpdate() 方法将 IncrementalUpdate 设置为 false。
  • 声明一个 PdfPageBase 变量。
  • 循环遍历页面并使用 PdfDocument.getPages().get() 方法获取特定页面。
  • 循环遍历页面中的图像。并使用 page.tryCompressImage(info.Index) 方法压缩高分辨率图像。
  • 使用 PdfDocument.saveToFile() 方法将文档保存到另一个 PDF 文件。

完整代码

Java

import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import com.spire.pdf.exporting.PdfImageInfo; public class CompressPDFImage {
public static void main(String[] args) { //创建 PdfDocument 类的对象
PdfDocument doc = new PdfDocument //加载 PDF 文档
doc.loadFromFile("示例文档.pdf"); //将IncrementalUpdate设置为false
doc.getFileInfo().setIncrementalUpdate(false); //声明一个 PdfPageBase 变量
PdfPageBase page; //循环遍历页面
for (int i = 0; i < doc.getPages().getCount(); i++) { //获取指定页面
page = doc.getPages().get(i);
if (page != null) { if(page.getImagesInfo() != null){ //循环遍历页面中的图像
for (PdfImageInfo info: page.getImagesInfo()) { //使用tryCompressImage方法压缩高分辨率图像
page.tryCompressImage(info.getIndex());
}
}
}
} //保存文件
doc.saveToFile("输出结果.pdf");
}
}

效果对比图

—本文完—

如何通过Java应用程序压缩PDF文档的更多相关文章

  1. Java 加密、解密PDF文档

    本篇文章将介绍通过Java编程来设置PDF文档保护的方法.我们可以设置仅用于查阅文档的密码,即该通过该密码打开文档仅用于文档阅读,无法编辑:也可以设置文档编辑权限的密码,即通过该密码打开文档时,文档为 ...

  2. Java 合并、拆分PDF文档

    处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...

  3. Java 插入附件到PDF文档

    在文档中插入附件,可以起到与源文档配套使用的目的,以一种更简便的方式对文档起到补充说明的作用.下面将介绍通过Java编程插入附件到PDF文档中的方法.这里插入的文档可以是常见的文档类型,如Word.E ...

  4. 【PDF】java使用Itext生成pdf文档--详解

    [API接口]  一.Itext简介 API地址:javadoc/index.html:如 D:/MyJAR/原JAR包/PDF/itext-5.5.3/itextpdf-5.5.3-javadoc/ ...

  5. Java实现HTML代码生成PDF文档

    1.IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源. 2.Flying Sauser实现html2pdf,纠错能力差,支 ...

  6. java实现在线浏览PDF文档功能

    实现在线浏览pdf文档功能(本代码适用于项目服务中固定的并且少量的pdf浏览,比如注册时的注册条款在线浏览等): //设置响应内容类型为PDF类型 response.setContentType(&q ...

  7. 将积累多年的java学习资料,pdf文档给大家分享一下,比如《大话设计模式》《算法》《Linux私房菜》等等

    话不多说,资料目录如下,需要的拿走,下载的同时别忘了点下推荐. 需要的点下面链接,到小编网盘进行下载: 2-大话设计模式.pdf 链接:https://pan.baidu.com/s/1b05puNO ...

  8. Java 打印PDF文档的3种情况

    以下内容归纳了通过Java程序打印PDF文档时的3种情形.即: 静默打印 显示打印对话框打印 打印PDF时自定义纸张大小 使用工具:Spire.PDF for Java Jar导入: 方法1:通过官网 ...

  9. Java 添加条码、二维码到PDF文档

    本文介绍如何通过Java程序在PDF文档中添加条码和二维码.创建条码时,可创建多种不同类型的条码,包括Codebar.Code11.Code128A.Code128B.Code32.Code39.Co ...

  10. 程序生成word与PDF文档的方法(python)

    程序导出word文档的方法 将web/html内容导出为world文档,再java中有很多解决方案,比如使用Jacob.Apache POI.Java2Word.iText等各种方式,以及使用free ...

随机推荐

  1. k8s使用心得

    查看当前所有namespaces [root@master ~]# kubectl get namespaces -A NAME STATUS AGE default Active 63d hkd A ...

  2. 关于使用git传输文件到GitHub

    git status(查看本地git仓库情况) git add "文件名(精确到文件拓展名)" git commit -m "说明"(提交到上传缓存区域) gi ...

  3. SpringBoot 2.5.5整合轻量级的分布式日志标记追踪神器TLog

    TLog能解决什么痛点 随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候.因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难. ...

  4. 深入浅出TCP与IP协议笔记

    TCP/IP 4层结构:应用层 传输层 网络层 链路层   探索过程问题:一个主机的数据要经过哪些过程才到达对方的主机上 一组电信号就是一个数据包,一个数据包称为一帧,制定这个规则的就是以太网协议   ...

  5. 用昇腾AI护航“井下安全”

    摘要:基于CANN(异构计算架构)打造的"智能矿山安全生产管理平台",能够更便捷和更高效地服务于更多矿山安全生产建设. 本文分享自华为云社区<华为携手云话科技助力矿山智能化, ...

  6. Trino Worker 规避 OOM 思路

    背景 Trino 集群如果不做任何配置优化,按照默认配置上线,Master 和 Worker 节点都很容易发生 OOM.本文从 Trino 内存设计出发, 分析 Trino 内存管理机制,到限制与优化 ...

  7. Django系列---开发二

    django.contrib.auth Django的用户验证框架,可以快速实现用户信息验证.登录.登出等用户操作 from django.contrib.auth import authentica ...

  8. 通过Jenkins,执行远程服务器的自动化脚本

    通过Jenkins,可自动执行写好的应用部署.自动化测试等的脚本工具,实现测试环境的应用自动定时更新.自动执行测试等. 1. 安装SSH插件 进入[系统管理]-[插件管理]-[可用插件],搜索Publ ...

  9. SQL Server 读写分离配置的一些问题

    1,新建发布服务器遇到此服务器上未安装复制组件 先执行以下sql use mastergoselect @@servername;select serverproperty('servername') ...

  10. <四>构造函数初始化列表

    示例代码1 点击查看代码 class CDate{ public: CDate(int _year,int _month, int _day){ this->year=_year; this-& ...