依赖导入

<dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.2.1</version><type>pom</type>
</dependency>

工具类

import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;
import com.itextpdf.layout.element.Image;import javax.imageio.ImageIO;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.*;/*** <p>* ClassName: PdfZipUtils* </p>* <p>* Description: PDF压缩* </p>* <p>* author: yu* <p>* date: 2022年8月19日* </p>*/
public class PdfCompressUtils {private static final Logger LOGGER = LoggerFactory.getLogger(FileZipUtil.class);/*** <p>* Field FACTOR : 压缩因子* </p>*/private static final float FACTOR = 0.5F;private static int i = 0;/*** <p>* Description: PDF压缩(目前只支持全是图片的PDF)* </p>* * @param srcDir 源 文件/文件夹* @return: void*/public static void compress(String srcDir) {File file = new File(srcDir);if (file.exists()) {if (file.isFile()) {if (".pdf".equals(file.getName().substring(file.getName().lastIndexOf(".")))&& (file.length() / 1024) > 1024) {manipulatePdf(srcDir);}} else {File[] files = file.listFiles();for (File f : files) {if (f.isFile()) {if (".pdf".equals(f.getName().substring(f.getName().lastIndexOf(".")))&& (f.length() / 1024) > 1024) {manipulatePdf(f.getPath());}} else {compress(f.getAbsolutePath());}}}}}private static void manipulatePdf(String src) {File srcFile = new File(src);String targetUrl = srcFile.getParent() + File.separator + "@@@@@" + srcFile.getName();PdfDocument pdfDoc = null;boolean successFlag = false;try {pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(targetUrl));if (pdfDoc != null) {int pages = pdfDoc.getNumberOfPages();for (int i = 0; i < pages; i++) {PdfPage page = pdfDoc.getPage(i + 1);PdfDictionary pageDict = page.getPdfObject();PdfDictionary resources = pageDict.getAsDictionary(PdfName.Resources);PdfDictionary xObjects = resources.getAsDictionary(PdfName.XObject);PdfName imgRef = xObjects.keySet().iterator().next();PdfStream stream = xObjects.getAsStream(imgRef);Image img = convertToBlackAndWhite(new PdfImageXObject(stream));xObjects.put(imgRef, img.getXObject().getPdfObject());}}successFlag = true;} catch (Exception e) {pdfDoc.close();File file = new File(targetUrl);if (file.exists()) {file.delete();}LOGGER.info("PDF压缩异常:", e);}pdfDoc.close();if (successFlag) {srcFile.delete();new File(targetUrl).renameTo(new File(src));i++;LOGGER.info("第{}份PDF压缩成功:", i);}}private static Image convertToBlackAndWhite(PdfImageXObject image) {ByteArrayOutputStream baos = null;byte[] byteArray = null;try {BufferedImage bi = image.getBufferedImage();int width = (int) (bi.getWidth() * FACTOR);int height = (int) (bi.getHeight() * FACTOR);BufferedImage newBi = new BufferedImage(width, height, image.getBufferedImage().getType());AffineTransform at = AffineTransform.getScaleInstance(FACTOR, FACTOR);Graphics2D g = newBi.createGraphics();g.drawRenderedImage(bi, at);baos = new ByteArrayOutputStream();ImageIO.write(newBi, image.identifyImageType().name(), baos);byteArray = baos.toByteArray();} catch (IOException e) {e.printStackTrace();} finally {if (baos != null) {try {baos.close();} catch (IOException e) {e.printStackTrace();}}}return new Image(ImageDataFactory.create(byteArray));}
}

参考:https://blog.csdn.net/qq_44382452/article/details/123041584

PDF压缩(全图片PDF压缩)相关推荐

  1. 图片怎么在线压缩?图片在线压缩方法分享

    通过压缩图片,可以减小图片的大小,从而减少所需的存储空间.这对于在有限存储空间的设备上存储大量照片和视频非常有用.此外,还可以减少在设备之间传输和处理图片所需的时间和精力,从而提高工作的效率.特别是在 ...

  2. pdf转wordpptexceljpg图片pdf编辑器转换修改

    PDF格式和Word .PPT. Excel图片等格式相互转换编辑专业版 发表评论 302 A+ 所属分类:社交电商 PDF格式和Word .PPT. Excel图片等格式相互转换编辑专业版 pdf转 ...

  3. 配置nginx的Gzip功能实现网页的压缩和图片的压缩

    1.为什么要用GZIP实现网页和图片的压缩?nginx怎么实现压缩的? 使用Gzip压缩可以提高CPU 使用率,可以减少服务器发送的字节数量.这就使人们觉得页速度加快了,并且还减少了带宽的用量. 根据 ...

  4. ie js html 压缩,H5图片裁剪-压缩-上传-神奇的Croppie.js

    Croppie.js之图片裁剪压缩上传 h5图片裁剪, 压缩, 上传, 预览是常见功能, 幸运的是我们有cropp.js这款利器. 1. style .actions button, .actions ...

  5. java pdf文件转换图片,pdf文件转图片(java实现)

    项目中pdf文件太大,在手机端打开缓慢.需要将pdf文件转换成图片.加载比较快,增加用户体验.话不多说,直接上干货. 一.在pom引入依赖的jar org.apache.pdfbox fontbox ...

  6. 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )

    文章目录 一. 图片压缩 二. 图片文件压缩类型 三. Android 原生 API 提供的质量压缩 四. Android 原生 API 提供的尺寸压缩 一. 图片压缩 图片压缩 : ① 文件压缩 : ...

  7. itext 生成pdf 输出特殊符号_JAVA提取PDF内容及转换PDF为图片

    今天给大家分享一下使用java处理pdf文件,包括提取pdf文本.提取pdf图片.pdf转图片三种操作. 主要使用到的库是apache开源的pdfbox,目前最新版本是2.0.x,网上的资料一般是1. ...

  8. 图片怎么压缩到200K以内,这3个图片压缩方法,简单有效

    你没有遇到过上传图片到网站的时候,图片太大不能上传的情况?还有,许多报名照片要求小于200K,可是照片超过这个大小,应该如何压缩呢?下面我给大家带来3个图片压缩的方法,既能快速压缩图片大小,又保存画质 ...

  9. gif动图可以压缩大小吗?gif图片怎么压缩?

    转自:http://www.weidianyuedu.com/content/0012341722200.html 现在网络上的gif动图真的是遍地都是,微信聊天要gif动图表情包,微博聊天要gif动 ...

最新文章

  1. 中国编程第一人,李开复欣赏他,百度留不住他...
  2. 学历高和学历低的眼界差距有多大?
  3. 网站建设想要出类拔萃还要从基础上做创新
  4. hssfworkbook 单元格合并后宽度不生效_Excel表格“假”合并,有多牛?
  5. Flex里监听mouseDownOutside事件解决弹出窗口点击空白关闭功能
  6. 进程handle获取线程_获取进程中的线程列表
  7. supersu_SuperSU已从Play商店中删除,这是替代使用的方法
  8. 经典面试题(32):以下代码将输出的结果是什么?
  9. C# Excel导入、导出
  10. ibatis常用16条SQL语句
  11. Gentoo下搭建DNS中转服务器基本配置
  12. PHP中的session分析与使用
  13. SQL Develoer 连接到hr数据库
  14. 将World中的向下箭头替换为回车符
  15. R语言使用order函数对dataframe数据进行排序、基于多个字段(变量)进行降序排序(DESCENDING)
  16. [ABAP] PBOM历史版本函数展开 CSAP_MAT_BOM_READ
  17. Linux用户标识符UID与GID和用户账号
  18. gcc ld链接脚语法简明讲解
  19. 计算机视觉:摄像机标定(循序渐进理解到应用)
  20. 科研必备的9款科研神器

热门文章

  1. Teacher Forcing机制及Beam search详解
  2. 7-9 九宫格输入法 (15 分)
  3. OpenJudge 1.6.3
  4. vue滚动到底部,自动加载更多
  5. Linux Deepin新增美国詹姆斯•麦迪逊大学镜像源
  6. 计算机组成原理(1)课程概貌、地位、分割整合
  7. zookeeper的Leader选举机制详解
  8. Endpoint Security VPN(CheckPoint)禁止开机自动打开(macOS)
  9. 微信公众平台开发笔记
  10. [天权信安catf1ag] crypto,pwn部分