PDF压缩(全图片PDF压缩)
依赖导入
<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压缩)相关推荐
- 图片怎么在线压缩?图片在线压缩方法分享
通过压缩图片,可以减小图片的大小,从而减少所需的存储空间.这对于在有限存储空间的设备上存储大量照片和视频非常有用.此外,还可以减少在设备之间传输和处理图片所需的时间和精力,从而提高工作的效率.特别是在 ...
- pdf转wordpptexceljpg图片pdf编辑器转换修改
PDF格式和Word .PPT. Excel图片等格式相互转换编辑专业版 发表评论 302 A+ 所属分类:社交电商 PDF格式和Word .PPT. Excel图片等格式相互转换编辑专业版 pdf转 ...
- 配置nginx的Gzip功能实现网页的压缩和图片的压缩
1.为什么要用GZIP实现网页和图片的压缩?nginx怎么实现压缩的? 使用Gzip压缩可以提高CPU 使用率,可以减少服务器发送的字节数量.这就使人们觉得页速度加快了,并且还减少了带宽的用量. 根据 ...
- ie js html 压缩,H5图片裁剪-压缩-上传-神奇的Croppie.js
Croppie.js之图片裁剪压缩上传 h5图片裁剪, 压缩, 上传, 预览是常见功能, 幸运的是我们有cropp.js这款利器. 1. style .actions button, .actions ...
- java pdf文件转换图片,pdf文件转图片(java实现)
项目中pdf文件太大,在手机端打开缓慢.需要将pdf文件转换成图片.加载比较快,增加用户体验.话不多说,直接上干货. 一.在pom引入依赖的jar org.apache.pdfbox fontbox ...
- 【Android 内存优化】图片文件压缩 ( Android 原生 API 提供的图片压缩功能能 | 图片质量压缩 | 图片尺寸压缩 )
文章目录 一. 图片压缩 二. 图片文件压缩类型 三. Android 原生 API 提供的质量压缩 四. Android 原生 API 提供的尺寸压缩 一. 图片压缩 图片压缩 : ① 文件压缩 : ...
- itext 生成pdf 输出特殊符号_JAVA提取PDF内容及转换PDF为图片
今天给大家分享一下使用java处理pdf文件,包括提取pdf文本.提取pdf图片.pdf转图片三种操作. 主要使用到的库是apache开源的pdfbox,目前最新版本是2.0.x,网上的资料一般是1. ...
- 图片怎么压缩到200K以内,这3个图片压缩方法,简单有效
你没有遇到过上传图片到网站的时候,图片太大不能上传的情况?还有,许多报名照片要求小于200K,可是照片超过这个大小,应该如何压缩呢?下面我给大家带来3个图片压缩的方法,既能快速压缩图片大小,又保存画质 ...
- gif动图可以压缩大小吗?gif图片怎么压缩?
转自:http://www.weidianyuedu.com/content/0012341722200.html 现在网络上的gif动图真的是遍地都是,微信聊天要gif动图表情包,微博聊天要gif动 ...
最新文章
- 中国编程第一人,李开复欣赏他,百度留不住他...
- 学历高和学历低的眼界差距有多大?
- 网站建设想要出类拔萃还要从基础上做创新
- hssfworkbook 单元格合并后宽度不生效_Excel表格“假”合并,有多牛?
- Flex里监听mouseDownOutside事件解决弹出窗口点击空白关闭功能
- 进程handle获取线程_获取进程中的线程列表
- supersu_SuperSU已从Play商店中删除,这是替代使用的方法
- 经典面试题(32):以下代码将输出的结果是什么?
- C# Excel导入、导出
- ibatis常用16条SQL语句
- Gentoo下搭建DNS中转服务器基本配置
- PHP中的session分析与使用
- SQL Develoer 连接到hr数据库
- 将World中的向下箭头替换为回车符
- R语言使用order函数对dataframe数据进行排序、基于多个字段(变量)进行降序排序(DESCENDING)
- [ABAP] PBOM历史版本函数展开 CSAP_MAT_BOM_READ
- Linux用户标识符UID与GID和用户账号
- gcc ld链接脚语法简明讲解
- 计算机视觉:摄像机标定(循序渐进理解到应用)
- 科研必备的9款科研神器