文件相关工具类Utils(WORD,PDF,PNG)

导读,此工具类中包含以下功能:

1、文件后缀判断

2、图片后缀判断

3、word后缀判断

4、Excel后缀判断

5、PDF后缀判断

6、使用pdfbox将整个pdf转换成图片

7、pdf2word

8、word2PDF

9、向PDF指定页插入图片

10、PDF指定位置覆盖

11、删除文件夹及以下文件(可能出现删不全的情况)

12、zip文件返回

13、打压缩包

代码:

package cn.org.enst.report.office.utils.processdocument;import cn.org.enst.common.exception.DbptException;
import cn.org.enst.common.utils.StringUtils;
import cn.org.enst.common.utils.file.FileUtils;
import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.text.PDFTextStripper;import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.List;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class FileTypeUtils {/*** 文件后缀判断*/public static boolean verificationFile(String originFileName) {// 后缀String extName = originFileName.substring(originFileName.lastIndexOf(".") + 1);// 判断是不是图片、文档、excel、pdf、压缩包等文件后缀if (extName.matches("(tif|gif|png|jpg|jpeg|bmp|doc|docx|pdf|xls|xlsx|rar|zip)")) {return true;}// "文件格式错误"return false;}/*** 图片后缀判断*/public static boolean verificationImage(String originFileName) {// 后缀String extName = originFileName.substring(originFileName.lastIndexOf(".") + 1);// 判断是不是图片后缀if (extName.matches("(png|jpg|jpeg)")) {return true;}// "文件格式错误"return false;}/*** word后缀判断*/public static boolean verificationWord(String originFileName) {// 后缀String extName = originFileName.substring(originFileName.lastIndexOf(".") + 1);// 判断是不是图片后缀if (extName.matches("(doc|docx)")) {return true;}// "文件格式错误"return false;}/*** Excel后缀判断*/public static boolean verificationExcel(String originFileName) {// 后缀String extName = originFileName.substring(originFileName.lastIndexOf(".") + 1);// 判断是不是图片后缀if (extName.matches("(xls|xlsx)")) {return true;}// "文件格式错误"return false;}/*** PDF后缀判断*/public static boolean verificationPDF(String originFileName) {// 后缀String extName = originFileName.substring(originFileName.lastIndexOf(".") + 1);// 判断是不是图片后缀if (extName.matches("(pdf)")) {return true;}// "文件格式错误"return false;}/*** 使用pdfbox将整个pdf转换成图片** @param fileAddress 文件地址 如:C:\\Users\\user\\Desktop\\test* @param filename    PDF文件名不带后缀名* @param type        图片类型 png 和jpg* @param pathList    图片输出位置*/public static void pdf2png(String fileAddress, String filename, String type, List<String> pathList) {
//        long startTime = System.currentTimeMillis();// 将文件地址和文件名拼接成路径 注意:线上环境不能使用\\拼接File file = new File(fileAddress + "\\" + filename + ".pdf");try {// 写入文件PDDocument doc = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();for (int i = 0; i < pageCount; i++) {// dpi为144,越高越清晰,转换越慢BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI// 将图片写出到该路径下pathList.add(fileAddress + "\\" + filename + "_" + (i + 1) + "." + type);ImageIO.write(image, type, new File(fileAddress + "\\" + filename + "_" + (i + 1) + "." + type));}long endTime = System.currentTimeMillis();
//            System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒");  //转化用时} catch (IOException e) {e.printStackTrace();}}/*** @param source 要转换的word文件* @param target 要转换成为的pdf文件*/public static void pdf2word(String source, String target) {try {//将pdf加载到对象中去PDDocument doc = PDDocument.load(new File(source));//得到pdf的页数int pagenumber = doc.getNumberOfPages();//设置转换后的名字
//            pdfFile = pdfFile.substring(0, pdfFile.lastIndexOf("."));
//            String fileName = pdfFile + ".doc";File file = new File(target);if (!file.exists()) {file.createNewFile();}FileOutputStream fos = new FileOutputStream(target);//设置输出字符集为UTF-8 因此该word应该使用UTF-8格式打开 如果你出现乱码那么你可以自己修改一下这里的格式Writer writer = new OutputStreamWriter(fos, "UTF-8");PDFTextStripper stripper = new PDFTextStripper();stripper.setSortByPosition(true);// 排序stripper.setStartPage(1);// 设置转换的开始页stripper.setEndPage(pagenumber);// 设置转换的结束页stripper.writeText(doc, writer);writer.close();doc.close();System.out.println("pdf转换word成功!");} catch (IOException e) {e.printStackTrace();}}/*** \** @param sourceUrl 要转换的word文件* @param targetUrl 要转换成为的pdf文件*/public static void word2PDF(String sourceUrl, String targetUrl) {int wdFormatPDF = 17;// PDF 格式ActiveXComponent app = null;Dispatch doc = null;try {app = new ActiveXComponent("Word.Application");app.setProperty("Visible", new Variant(false));Dispatch docs = app.getProperty("Documents").toDispatch();//转换前的文件路径String startFile = sourceUrl;//转换后的文件路劲String overFile = targetUrl;doc = Dispatch.call(docs, "Open", startFile).toDispatch();File tofile = new File(overFile);if (tofile.exists()) {tofile.delete();}Dispatch.call(doc, "SaveAs", overFile, wdFormatPDF);} catch (Exception e) {System.out.println(e.getMessage());} finally {Dispatch.call(doc, "Close", false);if (app != null)app.invoke("Quit", new Variant[]{});}//结束后关闭进程ComThread.Release();}/*** @param tempContentPathString pdf文件路径* @param tempSignPathList      jpg图片路径集合* @param i                     图片放在pdf第几页(下标从0开始)* @param pdfUrl                pdf输出位置*/public static void PDFMergeJPGIndex(String tempContentPathString, List<String> tempSignPathList, int i, String pdfUrl) throws Exception {new File(pdfUrl.substring(0,pdfUrl.lastIndexOf(File.separator))).mkdirs();//"D:\\temp\\电力行标-报告.pdf"//打开PDF文件PDDocument doc = PDDocument.load(new FileInputStream(tempContentPathString));//获取所有页PDPageTree pages = doc.getDocumentCatalog().getPages();//获取第一页PDPage pdPage0 = pages.get(0);//获取第一页纸张信息PDRectangle mediaBox = pdPage0.getMediaBox();float lowerLeftX = mediaBox.getLowerLeftX();float lowerLeftY = mediaBox.getLowerLeftY();float width = mediaBox.getWidth();float height = mediaBox.getHeight();//有几张照片循环几次for (String s : tempSignPathList) {// 根据第一个纸张信息创建一张空白页PDPage pageOne = new PDPage(mediaBox);//获取照片PDImageXObject pdImage = PDImageXObject.createFromFile(s, doc);// 获取此页内容流PDPageContentStream contentStream = new PDPageContentStream(doc, pageOne, PDPageContentStream.AppendMode.APPEND, true);//照片写入contentStream.drawImage(pdImage, lowerLeftX, lowerLeftY, width, height);// 关闭内容流contentStream.close();pages.insertBefore(pageOne, pages.get(i + tempSignPathList.indexOf(s)));}doc.save(new File(pdfUrl));doc.close();}/*** pdf遮盖(不通用)* pdfUrl pdf路径* type 文档类型(区分不同文档类型,区分覆盖位置)*/public static void PDFFill(String pdfUrl, int type) throws Exception {//初始化数据float x = 0; // 替换为您需要遮盖的区域的X轴坐标float y = 0; // 替换为您需要遮盖的区域的Y轴坐标float w = 0; // 替换为遮盖区域的宽度float h = 0; // 替换为遮盖区域的高度//打开PDF文件PDDocument doc = PDDocument.load(new FileInputStream(pdfUrl));PDPageTree pages = doc.getDocumentCatalog().getPages();PDPage pdPage0 = pages.get(0);PDRectangle mediaBox = pdPage0.getMediaBox();// 创建内容流,将第一页的内容绘制到新页上(如果需要删除/遮盖某个区域,请在此内容流中进行相应操作)PDPageContentStream contentStream = new PDPageContentStream(doc, pdPage0, PDPageContentStream.AppendMode.APPEND, true);// 设置填充颜色(这里设置为白色,您可以根据需要更改颜色)contentStream.setNonStrokingColor(255, 255, 255); // 白色if (0 == type) {//方案、测评表x = 0f; // 替换为您需要遮盖的区域的X轴坐标y = 200f; // 替换为您需要遮盖的区域的Y轴坐标w = 500f; // 替换为遮盖区域的宽度h = 300f; // 替换为遮盖区域的高度}else if(1 == type){//调查表x = 0f; // 替换为您需要遮盖的区域的X轴坐标y = 145f; // 替换为您需要遮盖的区域的Y轴坐标w = 600f; // 替换为遮盖区域的宽度h = 150f; // 替换为遮盖区域的高度}// 绘制矩形遮盖指定区域contentStream.addRect(x, y, w, h);contentStream.fill();// 结束内容流contentStream.close();// 保存修改后的文档doc.save(pdfUrl);// 关闭文档doc.close();}/*** 删除文件夹及以下的文件*/public static void deleteFolder(File folder) {File[] files = folder.listFiles();if (files != null) {for (File file : files) {if (file.isDirectory()) {deleteFolder(file);} else {file.delete();}}}folder.delete();}/*** 文件返回*/public static void downloadZip(HttpServletRequest request, HttpServletResponse response, String zipPath) {//截取文件名String fileName = zipPath.substring(zipPath.lastIndexOf(File.separator) + 1);try {response.setCharacterEncoding("utf-8");// 导出使用"application/octet-stream"更标准response.setContentType("application/octet-stream");response.setHeader("Content-Disposition","attachment;filename=" + FileUtils.setFileDownloadHeader(request, fileName));FileUtils.writeBytes(zipPath, response.getOutputStream());} catch (IOException e) {e.printStackTrace();throw new DbptException(StringUtils.format("导出文件 ({}) !", fileName, e));}}/*** 打压缩包*/public static void compress(String fromPath, String toPath) throws Exception {File fromFile = new File(fromPath);File toFile = new File(toPath);if (!fromFile.exists()) {throw new DbptException(fromPath + "不存在!");}try (FileOutputStream outputStream = new FileOutputStream(toFile); CheckedOutputStream checkedOutputStream = new CheckedOutputStream(outputStream, new CRC32()); ZipOutputStream zipOutputStream = new ZipOutputStream(checkedOutputStream)) {//区分重载方法,无实际意义String baseDir = "";//进行一次循环为了去除最外层文件夹File[] files = fromFile.listFiles();for (File file : files) {compress(file, zipOutputStream, baseDir);}}}private static void compress(File file, ZipOutputStream zipOut, String baseDir) throws IOException {if (file.isDirectory()) {compressDirectory(file, zipOut, baseDir);} else {compressFile(file, zipOut, baseDir);}}private static void compressFile(File file, ZipOutputStream zipOut, String baseDir) throws IOException {if (!file.exists()) {return;}try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {ZipEntry entry = new ZipEntry(baseDir + file.getName());zipOut.putNextEntry(entry);int count;byte[] data = new byte[1024];while ((count = bis.read(data, 0, 1024)) != -1) {zipOut.write(data, 0, count);}}}private static void compressDirectory(File dir, ZipOutputStream zipOut, String baseDir) throws IOException {File[] files = dir.listFiles();if (files != null && ArrayUtils.isNotEmpty(files)) {for (File file : files) {compress(file, zipOut, baseDir + dir.getName() + File.separator);}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/231356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【为数据之道学习笔记】5-7五类数据主题联接的应用场景

在数字化转型的背景下&#xff0c;华为的数据消费已经不再局限于传统的报表分析&#xff0c;还要支持用户的自助分析、实时分析&#xff0c;通过数据的关联&#xff0c;支持业务的关联影响分析以及对目标对象做特征识别&#xff0c;进行特定业务范围圈定、差异化管理与决策等。…

Linux CentOS7安装harbor

1、下载harbor离线包 wget https://github.com/goharbor/harbor/releases/download/v2.4.2/harbor-offline-installer-v2.4.2.tgz 2、解压安装 tar -zxvf harbor-offline-installer-v2.4.2.tgz #解压离线安装包 3、配置harbor cd harbor #切换到harbor目录下…

RabbitMQ入门指南(二):架构和管理控制台的使用

专栏导航 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、RabbitMQ架构 二、RabbitMQ管理控制台的使用 1.Exchange交换机 2.Queue队列 3.绑定Exchange交换机和Queue队列 4.发送消息 5.数据隔离 总结 前言 RabbitMQ是一个高效、可靠的开源消息队列系统…

阅览窗格功能虽然便利,但有时会出错,特别是在Word和Excel文件中更为常见

当你打开预览窗格功能时&#xff0c;每次你打开Windows文件资源管理器并选择任何文件&#xff0c;你将在屏幕的右窗格上看到该文件的小预览缩略图。 由于这个新功能&#xff0c;你可以在Windows资源管理器的右窗格上以缩略图的形式看到文件的小预览。此功能在更快地识别文件方…

Redis之INCR命令,通常用于统计网站访问量,文章访问量,分布式锁

前言 Redis的INCR命令用于将键的值增加1。如果键不存在&#xff0c;则会先将键的值设置为0&#xff0c;然后再执行INCR操作。INCR命令的作用是对计数器进行自增操作&#xff0c;可以用于实现多种场景&#xff0c;比如统计网站访问量、文章访问量、分布式锁等。 一、Redis键之…

打破“造车”嫌疑,华为“造车”另辟蹊径

9月25日&#xff0c;在华为秋季全场景发布会的一片“遥遥领先”呐喊声中&#xff0c;余承东并没有如市场预期那般&#xff0c;给主角Mate60系列补上应有的聚光灯&#xff0c;但却给汽车业务留下满满的彩蛋。 在升任华为汽车BU董事长不到一周&#xff0c;余承东就先向特斯拉开出…

Axure交互样式,交互事件,交互动作,情形基本介绍及使用,完成ERP的菜单跳转到各个页面的跳转案例,省市联动案例,下拉刷新案例

目录 一.Axure交互样式 二.交互事件 三.情形 四.交互动作 五. 完成ERP的菜单跳转到各个页面的跳转 ​编辑 五. 省市联动 ​六.下拉刷新 一.Axure交互样式 鼠标悬停;鼠标按下;选中;禁用;获取焦点; 悬停就是鼠标放上去时&#xff0c;按下是鼠标左键单击&#xff0c;选中是…

【深度学习目标检测】九、基于yolov5的路标识别(python,目标检测)

YOLOv5是目标检测领域一种非常优秀的模型&#xff0c;其具有以下几个优势&#xff1a; 1. 高精度&#xff1a;YOLOv5相比于其前身YOLOv4&#xff0c;在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进&#xff0c;如更深的网络结构、更多的特征层和更高分辨率的输入图…

14:00面试,14:05就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

【Vue2】Component template should contain exactly one root element.

问题描述 [plugin:vite:vue2] Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.原因分析 这个错误通常是由于 Vue 组件的模板中包含多个根元素导致的。Vue 要求组件模板中只…

HTML基础

目录 1.格式化文本1.1.& nbsp1.2.设置水平分割线粗细为51.3.粗细为5且颜色为 #0033ff1.4.对齐方式1.5.两端对齐代码小结 2.段落2.1.块级标记2.2.那些块级标记不能包含其他块级标记&#xff0c;哪些可以2.3.hr标签如何设置高度2.4.拼音音标注释ruby标记和rt/rp标记2.5.block…

.bash_history|.bashrc|.bash_logout|.profile的作用分别是啥

这些文件都是与 Bash shell&#xff08;在 Unix 和 Linux 系统上常用的命令行界面&#xff09;相关的配置文件。它们的作用如下&#xff1a; .bash_history 这是一个隐藏文件&#xff0c;存储了用户在命令行中输入的命令历史。每当用户退出 shell 时&#xff0c;新的命令历史…

纵横字谜的答案 Crossword Answers

纵横字谜的答案 Crossword Answers - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 翻译后大概是&#xff1a; 有一个 r 行 c 列 (1<r,c<10) 的网格&#xff0c;黑格为 * &#xff0c;每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格&…

Wireshark在云计算中的应用

第一章&#xff1a;Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧&#xff1a;过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章&#xff1a;网络协议分析 2.1 网络协议分析&#xff1a;TCP、UDP、ICMP等 2.2 高级协议分析&#xff1a;HTTP…

React中渲染html结构---dangerouslySetInnerHTML

dangerouslySetInnerHTML胡子{}语法绑定的内容全部作为普通文本渲染&#xff0c;渲染html结构基于---dangerouslySetInnerHTMLdangerouslySetInnerHTML是React标签的一个属性&#xff0c;类似于vue的v-html有2个{{}},第一个{}代表jsx语法开始&#xff0c;第二个是代表dangerous…

三大主流前端框架介绍

在前端项目中&#xff0c;可以借助某些框架&#xff08;如React、Vue、Angular等&#xff09;来实现组件化开发&#xff0c;使代码更容易复用。此时&#xff0c;一个网页不再是由一个个独立的HTML、CSS和JavaScript文件组成&#xff0c;而是按照组件的思想将网页划分成一个个组…

JS的浅拷贝和深拷贝

首先理解什么是浅拷贝和深拷贝&#xff1a; 浅拷贝&#xff1a; 浅拷贝只会复制对象的第一层属性&#xff0c;而不会递归地复制嵌套的对象。浅拷贝仅复制对象的引用&#xff0c;新对象和原始对象仍然共享相同的引用&#xff0c;因此对新对象的修改可能会影响到原始对象。浅拷…

三子棋程序的讲解(4)

前期的准备工作基本上已经差不多了&#xff0c;还差一个如何判断胜负&#xff0c;我们的三子棋就大功告成了。相信大家都玩过三子棋&#xff0c;胜利的方式实际上非常的简单&#xff0c;只需要任意一行&#xff08;或者任意一列&#xff0c;或者任意对角线&#xff09;&#xf…

普通的GET和POST请求

一般使用步骤 使用HttpClient发送请求、接收响应&#xff0c;一般需要以下步骤。 HttpGet请求响应的一般步骤&#xff1a; 1). 创建HttpClient对象,可以使用HttpClients.createDefault()&#xff1b; 2). 如果是无参数的GET请求&#xff0c;则直接使用构造方法HttpGet(String u…

Java小案例-SpringBoot火车票订票购票票务系统

目录 前言 详细资料 源码获取 前言 SpringBoot火车票订票购票票务系统 前端使用技术&#xff1a;HTML5,CSS3、JavaScript、VUE等 后端使用技术&#xff1a;Spring boot&#xff08;SSM&#xff09;等 数据库&#xff1a;Mysql数据库 数据库管理工具&#xff1a;phpstud…