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

PDF 转图片并插入到 EXCEL 再转PDF

pom.xml 引用

<dependency><groupId>com.aspose</groupId><artifactId>aspose-cells</artifactId><version>21.11</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>21.11</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version></dependency>

代码 PDF 转 图片 其中Excel 转PDF 可以参考 上一篇

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.IoUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.CustomCellWriteHeightConfig;
import com.CustomPictureHandler;
import com.PictureModel;
import com.TtIncomingInspectionReportExcel;
import com.AsposeCellsUtil;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class TestMain {public static void main(String[] args) {Long start = new Date().getTime();try{FileInputStream fis = new FileInputStream("E:\\workData\\ZYInspectionFillReport.xlsx");FileOutputStream fos = new FileOutputStream("E:\\workData\\old.xlsx");TtIncomingInspectionReportExcel reportExcel = new TtIncomingInspectionReportExcel();ExcelWriter excelWriter = EasyExcel.write(fos).registerWriteHandler(new CustomCellWriteHeightConfig()).withTemplate(fis).build();WriteSheet writeSheet = EasyExcel.writerSheet().build();//开启自动换行,自动换行表示每次写入一条list数据是都会重新生成一行空行,此选项默认是关闭的,需要提前设置为trueFillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(reportExcel.getClassList(), fillConfig, writeSheet);List<PictureModel> pictureModelList = getPictureModels();//设置 COA图片if(CollectionUtil.isNotEmpty(pictureModelList)){WriteSheet writeSheetCoa = EasyExcel.writerSheet("COA文件").registerWriteHandler(new CustomPictureHandler(pictureModelList, "COA文件")).build();//对象excelWriter.fill(reportExcel, writeSheetCoa);}//对象excelWriter.fill(reportExcel, writeSheet);excelWriter.finish();reportExcel = null;IoUtil.close(fis);IoUtil.close(fos);//创建Workbook 实例并加载示例文档String copyFilePath = "E:\\workData\\old.pdf";AsposeCellsUtil.excelToPdf("E:\\workData\\old.xlsx", new FileOutputStream(copyFilePath));}catch (Throwable t){t.printStackTrace();}Long end = new Date().getTime();System.out.println(end - start);}private static List<PictureModel> getPictureModels(){List<PictureModel> data = new ArrayList<>();String pdfPath = "E:\\BaiduNetdiskDownload\\WXWork\\202405080027_戴陆文2的试用期员工转正述职评分(数字产品BG).pdf";try{File pdf = new File(pdfPath);PDDocument document = PDDocument.load(new FileInputStream(pdf));List<BufferedImage> images = new ArrayList<>();// 创建PDF渲染器PDFRenderer pdfRenderer = new PDFRenderer(document);for (int i = 0; i < document.getNumberOfPages(); i++) {/*** 《 72 》 此处设置得越大像素越高,生成得时候也会越久* DPI 的设置一般根据具体的需求和使用场景来决定。DPI 越高,生成的图片分辨率越大,图像质量也越高,* 但同时文件大小也会变得更大。通常情况下,如果需要对生成的图片进行放大、裁剪等操作,建议将 DPI 设置得较高,* 以保证图像质量和细节的清晰度;如果只是需要简单地浏览或共享图片,可以适当降低 DPI 以减小文件大小。在实际开发中,* 可以根据不同的应用场景进行调整。一般来说,72 DPI 是一个比较常见的默认值,可以作为参考。*/BufferedImage image = pdfRenderer.renderImageWithDPI(i, 100, ImageType.RGB);images.add(image);}int row = 0;for(int i = 0; i < images.size(); i++){try{int statRow = row;int endRow = row+1;ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(images.get(i), "png", os);data.add(PictureModel.createPictureModel("COA文件", statRow, endRow, 0, 0, os.toByteArray(), "png"));row = endRow + 1;}catch (Throwable t){t.printStackTrace();}}}catch (Throwable t){t.printStackTrace();}return data;}
}

相关文章:

PDF 转图片并插入到 EXCEL 再转PDF

pom.xml 引用 <dependency><groupId>com.aspose</groupId><artifactId>aspose-cells</artifactId><version>21.11</version></dependency><dependency><groupId>com.aspose</groupId><artifactId>as…...

jmeter之变量随机参数化以及解决多线程不会随机变化

参考链接&#xff1a; https://www.cnblogs.com/Testing1105/p/12743475.html jmeter 使用random函数多线程运行时数据不会随机变化&#xff1f;_jmeter 线程组循环执行时 变量不变-CSDN博客 1、如下图所示&#xff0c;需要对请求参数 autor 和phone进行随机参数化 2、目前有…...

24/7/12总结

axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 get请求: <script>function…...

sentinel网关限流配置及使用

sentinel控制台源码&#xff1a;https://download.csdn.net/download/yixin605691235/89543923 sentinel控制台jar包&#xff1a;https://download.csdn.net/download/yixin605691235/89543931 不同环境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、网关限…...

# 如何解决 App Store 审核中的 4.3(a) 问题:Guideline 4.3(a) - Design - Spam

如何解决 App Store 审核中的 4.3(a) 问题&#xff1a;Guideline 4.3(a) - Design - Spam 4.3(a) 审核问题是指&#xff1a;你的应用与其他开发者提交的应用在二进制文件、元数据和/或概念上存在相似之处&#xff0c;仅有微小差别。这通常会导致你的应用被视为垃圾应用而被拒绝…...

最长上升子序列(LIS)

最长上升子序列(最长递增子序列,LIS) 给定长度为 n n n的序列 v v v&#xff0c;求此序列中严格递增(上升)的子序列长度最大值(子序列可由原序列中不连续的元素构成) 朴素DP( O ( n 2 ) O(n^2) O(n2)) 闫氏DP分析法 状态表示&#xff1a; 集合 d p dp dp&#xff1a;所有满足…...

自动驾驶车道线检测系列—3D-LaneNet: End-to-End 3D Multiple Lane Detection

文章目录 1. 摘要概述2. 背景介绍3. 方法3.1 俯视图投影3.2 网络结构3.2.1 投影变换层3.2.2 投影变换层3.2.3 道路投影预测分支 3.3 车道预测头3.4 训练和真实值关联 4. 实验4.1 合成 3D 车道数据集4.2 真实世界 3D 车道数据集4.3 评估结果4.4 评估图像仅车道检测 5. 总结和讨论…...

手工创建 postgres kamailio 数据库

测试环境如下&#xff1a; postgres server 16&#xff1a; ip 地址为 192.168.31.100&#xff0c;用户 postgres 的密码为 ****** kamailio v5.7.5&#xff1a; ip 地址为 192.168.31.101 1.1. 创建 kamailio 用户和 kamailio 数据库 ssh 登陆 kamailio (192.168.31.101)&a…...

装饰设计模式

装饰设计模式应用在IO流上面可以得到体现 装饰模式指的是在不改变原类, 不使用继承的基础上&#xff0c;动态地扩展一个对象的功能。 原来的inputstream已经可以读取数据了&#xff0c;但是是一个字节一个字节的读取的&#xff0c;为了优化这个我们采用了buffered&#xff0c…...

Linux 线程初步解析

1.线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列。在linux中&#xff0c;由于线程和进程都具有id,都需要调度等等相似性&#xff0c;因此都可以用PCB来描述和控制,线程含有PCB&am…...

为ppt中的文字配色

文字的颜色来源于ppt不可删去的图像的颜色 从各类搜索网站中搜索ppt如何配色&#xff0c;有如下几点&#xff1a; 1.可以使用对比色&#xff0c;表示强调。 2.可以使用近似色&#xff0c;使得和谐统一。 3.最好一张ppt中&#xff0c;使用的颜色不超过三种主要颜色。 但我想强调…...

python-区间内的真素数(赛氪OJ)

[题目描述] 找出正整数 M 和 N 之间&#xff08;N 不小于 M&#xff09;的所有真素数。真素数的定义&#xff1a;如果一个正整数 P 为素数&#xff0c;且其反序也为素数&#xff0c;那么 P 就为真素数。 例如&#xff0c;11&#xff0c;13 均为真素数&#xff0c;因为 11 的反序…...

TCP/IP、UDP、HTTP 协议介绍比较和总结

TCP/IP、UDP、HTTP是网络通信中的三种重要协议,各自具有不同的特点和应用场景。以下是对这三种协议的详细介绍、比较和总结。 TCP/IP协议 传输控制协议/互联网协议(TCP/IP, Transmission Control Protocol/Internet Protocol) 特点: 可靠性:TCP提供可靠的通信,通过握手…...

Unity Meta Quest 开发:如何在每只手指上添加 Poke 交互

XR 开发社区&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 找到玩家物体 OVRCameraRig 下的子物体 HandInteractorsRight/Left&#xff08;分别管理左右手的 Interactor&#xff09;下的 HandPokeInteractor 子物体&#x…...

MyBatis的原理?

MyBatis是一个优秀的持久层框架&#xff0c;它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数及获取结果集。MyBatis可以通过简单的XML或注解来配置和映射原生类型、接口和Java的POJOs&#xff08;Plain Old Java Objects&#xff09;为…...

数学基础【俗说矩阵】:齐次线性方程和非齐次线性方程求解-学习笔记

一、矩阵基础知识 二元一次方程的传统解法 不论是代入消元法还是加减消元法都统称 【高斯消元法】。 齐次方程组和非齐次方程组 线性方程组的解 线性方程的向量展示 向量规则 矩阵的高斯消元和初等行变行及其规则 高斯消元规则 初等行变换 矩阵经初等行变换成阶梯矩阵&…...

乐尚代驾项目概述

前言 2024年7月17日&#xff0c;最近终于在低效率的情况下把java及其生态的知识点背的差不多了&#xff0c;投了两个礼拜的简历&#xff0c;就一个面试&#xff0c;总结了几点原因。 市场环境不好 要知道&#xff0c;前两年找工作&#xff0c;都不需要投简历&#xff0c;把简历…...

脱发的 7 个原因,不能再瞒着大家了!

《黄帝内经》记载&#xff0c;“发为血之余,肾其华在发”。乌发飘逸的秀发&#xff0c;是年轻之体气血充盈、生机勃发的象征&#xff0c;更是纯粹天然、淡泊雅致的东方美学的体现。年轻一代不仅关注身体的养生&#xff0c;对头发的保护与保养也有了新的认识。头发已经成为当代年…...

Vim使用教程

目录 引言1. Vim的基本概念1.1 模式1.2 启动和退出 2. 基础操作2.1 导航2.2 插入文本2.3 删除和复制2.4 查找和替换 3. 高级功能3.1 多文件编辑3.2 宏录制和执行3.3 使用插件3.4 自定义快捷键 4. Vim脚本和自定义配置4.1 基本配置4.2 编写Vim脚本 5. 实用技巧5.1 快速移动5.2 批…...

前端开发体系+html文件详解

目录 html骨架 body主体内基本元素 基本元素 超文本&#xff08;超链接跳转&#xff09; 锚点 图片标签 列表标签 表格标签 框架标签&#xff08;窗口标签&#xff09; 音频标签 视频标签 VScode编译器 输入框 字体样式 实例展示&#xff1a; 首先简要介绍前端的整…...

从B站视频到高品质音频:BilibiliDown音频提取全攻略

从B站视频到高品质音频&#xff1a;BilibiliDown音频提取全攻略 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/bi/…...

获 800 万美元融资,MAU 超 40 万!「shapes」AI 社交能否成下一代聊天应用?

《「shapes」获 800 万美元种子轮融资&#xff0c;AI 助力社交“入场”&#xff0c;能否成下一代聊天应用&#xff1f;》这几天&#xff0c;我在「shapes」随机进了个陌生群聊&#xff0c;发了句 "hello"&#xff0c;三秒内就有 AI 角色接上&#xff0c;回了串热情有…...

cmder设置默认打开路径

从你发的截图来看&#xff0c;目前没有任何一项被选中&#xff08;右侧的代码框是空的&#xff0c;而且右下角的 Startup dir... 按钮也是灰色不可点击的状态&#xff09;&#xff0c;并且确实没有带 * 号的项。没关系&#xff0c;如果没有带 * 号&#xff0c;按照下面的步骤操…...

AnyFlip下载器:3分钟将在线翻页书转为PDF的完整指南

AnyFlip下载器&#xff1a;3分钟将在线翻页书转为PDF的完整指南 【免费下载链接】anyflip-downloader Download anyflip books as PDF 项目地址: https://gitcode.com/gh_mirrors/an/anyflip-downloader 你是否曾在AnyFlip上发现一本精彩的电子书&#xff0c;想要保存却…...

MapStruct实战:手把手教你处理SpringBoot API中的字段名不一致问题

MapStruct实战&#xff1a;SpringBoot API字段名不一致的优雅解决方案 在SpringBoot开发中&#xff0c;前后端数据交互时经常遇到字段命名规范不一致的问题。数据库使用user_name&#xff0c;前端却要求userName&#xff1b;或者需要隐藏敏感字段如password&#xff0c;转换成*…...

在树莓派4B上实战:用Electron-builder打包Linux ARM应用(含Wayland配置)

树莓派4B实战&#xff1a;Electron应用打包与Wayland适配全指南 树莓派4B作为一款性价比极高的ARM开发板&#xff0c;已经成为许多开发者和爱好者的首选平台。随着Electron框架的普及&#xff0c;越来越多的开发者希望将自己的桌面应用移植到树莓派上运行。本文将带你从零开始&…...

别再死记硬背了!用Python+SymPy玩转含参积分,从卷积到信号处理一次搞懂

用PythonSymPy玩转含参积分&#xff1a;从数学原理到信号处理实战 数学中的含参积分常常让学习者感到抽象难懂&#xff0c;尤其是当涉及到极限交换、求导与积分顺序交换等概念时。但如果我们换一种方式——用代码和可视化来探索这些数学概念&#xff0c;一切就会变得清晰起来。…...

6G通信中的HMA天线技术:原理、优势与应用

1. HMA天线技术概述在6G通信和大规模MIMO系统的发展背景下&#xff0c;Huygens Metasurface Antennas&#xff08;HMA&#xff09;技术正逐渐成为无线通信领域的研究热点。作为一名长期从事天线系统设计的工程师&#xff0c;我见证了从传统相控阵到现代超表面天线的技术演进历程…...

保姆级教程:在群晖DSM 7.2上为虚幻引擎5项目配置Perforce Helix Core(附TypeMap避坑清单)

群晖DSM 7.2上为虚幻引擎5配置Perforce Helix Core全指南 对于独立游戏开发者和小型工作室来说&#xff0c;版本控制系统是项目管理的基石。Perforce Helix Core以其卓越的大文件处理能力&#xff0c;成为虚幻引擎项目版本控制的首选方案。本文将手把手指导你在群晖NAS上搭建Pe…...

拓璞数控港股上市:市值142亿港元 年营收5.8亿,净利163万

雷递网 雷建平 5月20日上海拓璞数控科技股份有限公司&#xff08;简称&#xff1a;“拓璞数控”&#xff0c;股票代码&#xff1a;“07688”&#xff09;今日在港交所上市。拓璞数控此次发售6533万股&#xff0c;发售价26.39港元&#xff0c;募资总额为17.24亿港元&#xff1b;…...