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

java压缩pdf

    <!-- PDF操作,itext7全家桶 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.15</version><type>pom</type></dependency>

package org.example;

import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.xobject.PdfImageXObject;

import javax.imageio.ImageIO;
import java.awt.;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.
;

public class Main {

public static void main(String[] args) throws IOException {PdfName key = new PdfName("ITXT_SpecialId");PdfName value = new PdfName("123456789");// 读取pdf文件PdfReader reader = null;try {reader = new PdfReader(new FileInputStream(new File("E:\\mqdemo\\paixu\\src\\main\\resources\\static\\2024作品集 .pdf")));} catch (IOException e) {throw new RuntimeException(e);}ByteArrayOutputStream swapStream = new ByteArrayOutputStream();PdfDocument pdfDocument = new PdfDocument(reader,new PdfWriter(swapStream));long n = reader.getLastXref();PdfObject object;PdfStream stream;//查找图像并操作图像流for (int i = 0; i < n; i++) {object = pdfDocument.getPdfObject(i);if (object == null || !object.isStream())continue;stream = (PdfStream) object;PdfObject pdfsubtype = stream.get(PdfName.Subtype);if (pdfsubtype != null && pdfsubtype.toString().equals(PdfName.Image.toString())) {PdfImageXObject image = new PdfImageXObject(stream);int i1 = image.getPdfObject().getAsNumber(PdfName.BitsPerComponent).intValue();//小于8的都跳过,BitsPerComponent=4是提示报错The color depth BitsPerComponent的值 is not supported//this.bpc != 8 ImagePdfBytesInfo类下decodeTiffAndPngBytes//当位图不等于8时,直接跳过if (i1 != 8) {continue;}BufferedImage bi = image.getBufferedImage();if (bi == null) continue;int width = (int) (bi.getWidth() * 0.7f);int height = (int) (bi.getHeight() * 0.7f);BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);AffineTransform at = AffineTransform.getScaleInstance(0.7f, 0.7f);Graphics2D g = img.createGraphics();g.drawRenderedImage(bi, at);ByteArrayOutputStream imgBytes = new ByteArrayOutputStream();//标记此处,后面会修改ImageIO.write(img, "JPG", imgBytes);stream.clear();stream.setData(imgBytes.toByteArray(), false);stream.put(PdfName.Type, PdfName.XObject);stream.put(PdfName.Subtype, PdfName.Image);stream.put(key, value);stream.put(PdfName.Filter, PdfName.DCTDecode);stream.put(PdfName.Width, new PdfNumber(width));stream.put(PdfName.Height, new PdfNumber(height));stream.put(PdfName.BitsPerComponent, new PdfNumber(8));stream.put(PdfName.ColorSpace, PdfName.DeviceRGB);}}//将数据写入到输出流中pdfDocument.close();reader.close();System.out.println("pdf压缩完成, 文件大小="+ swapStream.size());FileOutputStream fileOut = new FileOutputStream("outputFile.pdf");fileOut.write(swapStream.toByteArray());}

}

http://www.lryc.cn/news/383297.html

相关文章:

  • [AIGC] ClickHouse:一款高性能列式数据库管理系统
  • 深度学习21-30
  • google浏览器无法访问大端口的处理方式
  • 微信小程序余额退费
  • 宁波银行票据案例解读,要注入科技赋能票据新形式
  • 博客已迁移
  • 大模型应用研发基础环境配置(Miniconda、Python、Jupyter Lab、Ollama等)
  • 24年嘉兴市索贝进出口有限公司--信息安全实施项目
  • 亚马逊云科技官方活动:一个月拿下助理架构师SAA+云从业者考试认证(送半价折扣券)
  • 【山东】2024年夏季高考文化成绩一分一段表
  • 栈与队列 Leetcode 347 前k个高频元素
  • windchill 相关配置
  • XGBoost算法深度解析:原理、实现与应用
  • 27-29、redis优化(令牌主动失效机制)-controllert额外添加参数接收请求头、拦截器
  • 【Linux】性能分析器 gperftools 详解
  • C语言基础——函数(2)
  • Kafka Stream 流处理设计概述
  • Centos7安装自动化运维Ansible
  • element-ui 下拉菜单el-dropdown-item添加点击事件
  • Day45
  • 新媒体矩阵系统是什么?怎么搭建矩阵系统?
  • HarmonyOS应用开发——Hello World
  • Ubuntu20.04使用Samba
  • 第9章:软件可靠性基础知识
  • Go 语言学习笔记之通道 Channel
  • 第 133 场 LeetCode 双周赛题解
  • 【仿真】UR机器人相机标定、立体标定、手眼标定、视觉追踪(双目)
  • 功能测试【测试用例模板、Bug模板、手机App测试★】
  • Android音频系统
  • Android开发系列(九)Jetpack Compose之ConstraintLayout