Java pdf文件传输_java中pdf文件的管理(pdf文件转png文件,base64传输文件以及删除)...

org.apache.pdfbox

pdfbox

2.0.12

影像文件转为base64编码使用java自带的BASE64Encoder类

代码部分:

前端上传文件的保存:

@RequestMapping("upLoadImgs")

@ResponseBodypublic String upLoadAgreementsImg(HttpServletResponse response, HttpServletRequest request) throwsException {//获取前台传输的文件数据

MultipartHttpServletRequest mreq =(MultipartHttpServletRequest) request;

JSONObject rt= newJSONObject();//默认保存成功,失败时再修改对应状态

rt.put("status",0);

rt.put("message","文件保存成功");//上传的合同影像列表

Iterator fileNames =mreq.getFileNames();

MultipartFile file= null;

String fileName= null;//文件保存地址,从配置文件中获取 :F:\imgs

String folderPath = ResourceBundle.getBundle("systemconfig").getString("imagesDownloadPath");//自定义影像文件的名字(以当前系统时间+编码区分)

String imgName = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss");//用来区分同次上传多个文件的命名计数器01,02,03

int count = 1;//循环存入前端传来的影像文件

while(fileNames.hasNext()) {

String countStr= "0";

fileName=(String) fileNames.next();

file=mreq.getFile(fileName);if (file == null) {

logger.info("影像件上传;文件已损坏,请稍后再试");

rt.put("status",1);

rt.put("message", "文件已损坏,请稍后再试");

}//获取前台传参文件名

fileName =file.getOriginalFilename();//创建上传文件目录

File folder = newFile(folderPath);if (!folder.exists()) {

folder.mkdirs();

}//获取文件的后缀名

String extension = fileName.substring(fileName.lastIndexOf("."));//保存的文件名

String saveName = imgName + countStr + Integer.toString(count++);

String savePath= folderPath + File.separator + saveName +extension;try{

file.transferTo(newFile(savePath));

}catch(IOException e) {

e.printStackTrace();

rt.put("status",1);

rt.put("message", "文件保存失败");

}//如果上传的是pdf文件,转换为png文件

if(extension.equals(".pdf")){//转换为jpg文件

try{

pdf2Png(savePath,folderPath,300,1);

}catch(IOException e) {

e.printStackTrace();

rt.put("status",1);

rt.put("message", "pdf缩略图保存失败");

}

}

logger.info("file path:" +savePath);

}returnrt.toJSONString();

}

pdf文件转为png文件,并将转换后的png文件保存到pdf同级指定文件夹中:

这里需要注意的是,使用PDDocument 对象转换pdf文件后,使用该对象的close()方法关闭,不然会导致对应的pdf文件时出现因文件被占用而导致无法删除。

/*** 把pdf文件转换为jpg文件同步保存到服务器上

*@paramsavePath 保存的pdf文件路径

*@paramfolderPath 文件所在的文件夹

*@paramdpi 转换后的文件清晰度,

*@paramflag 转换的pdf文件页数,为0时转换全部页数,也可以指定转换页数

*@throwsException*/

private void pdf2Png (String savePath,String folderPath,int dpi,int flag) throwsException {//获取pdf文件

File file = newFile(savePath);

PDDocument pdDocument;//创建生成的文件保存路径

String newFolderPath = folderPath +File.separator+ "thumbnail";

File folder= newFile(newFolderPath);if (!folder.exists()) {

folder.mkdirs();

}//转换新的文件名,123.pdf转换为123.png

int dot = file.getName().lastIndexOf(".");

String imgName= file.getName().substring(0, dot);

pdDocument=PDDocument.load(file);

PDFRenderer renderer= newPDFRenderer(pdDocument);int pages =pdDocument.getNumberOfPages();//确定要打印的页数

if (flag > 0) {if (flag

pages=flag;

}

}//生成新的文件

StringBuffer imgFilePath = null;for (int i = 0; i < pages; i++) {

String imgSavePath= newFolderPath + File.separator +imgName;

imgFilePath= newStringBuffer();

imgFilePath.append(imgSavePath);//因为只转换1页,所以生成的图片只有一张,不用分开命名,如果转换多页pdf文件到多个png图片,须加上命名区分//imgFilePath.append("-");//imgFilePath.append(String.valueOf(i + 1));

imgFilePath.append(".png");

File dstFile= newFile(imgFilePath.toString());

BufferedImage image=renderer.renderImageWithDPI(i, dpi);//引入一个输出流,方便关闭,不然会因为文件被占用而导致无法删除

OutputStream ops = newFileOutputStream(dstFile);

ImageIO.write(image,"png", dstFile);

pdDocument.close();

ops.close();

}

}

根据文件路径查询该路径下的所有影像文件,组装成json返回给前台,注意的是pdf文件和其对应的png文件组装在同一个JsonObject中,方便前台显示:

/***

*@paramimgPath 要查找的文件路径

*@return返回对应的查询状态值和文件对应的base64编码

*@throwsException*/

public String queryAgreementsImgByProvOid(String imgPath) throwsException {

JSONObject rt= newJSONObject();//默认状态为查不到数据,查到数据后修改为0

rt.put("status",1);

String filePath= "";//服务器保存地址为null直接返回查询失败

if(!StringUtil.isEmpty(imgPath)) {

File file= newFile(filePath);//判断该路径是否存在

if (!file.exists()) {

rt.put("message", "没有相应的影像件");

}else{

File[] files=file.listFiles();//多个文件放在json数组里

JSONArray imgArray = newJSONArray();for (int i = 0; i < files.length; i++) {if(files[i].isFile()) {

JSONObject imgJson= newJSONObject();

String imgName=files[i].getName();

String imgBASE64Encoder=Base64Util.img2BASE64Encoder(files[i]);//如果是pdf文件,把对应的png、文件也转为base64编码传给前台

if (imgName.endsWith(".pdf")) {//找到对应的png文件的文件地址

StringBuffer imgPngFileName = newStringBuffer();

imgPngFileName.append(filePath+ File.separator + "thumbnail");int dot = imgName.lastIndexOf(".");

imgPngFileName.append(File.separator+ imgName.substring(0, dot) + ".png");

File pngFile= newFile(imgPngFileName.toString());//如果不存在,返回给前台对应的状态码

if(!pngFile.exists()){

imgJson.put("thumbnail", "");

}else{

String pngBASE64Encoder=Base64Util.img2BASE64Encoder(pngFile);

imgJson.put("thumbnail", pngBASE64Encoder);

}

}//组装进json对象里,方便返回给前台

imgJson.put("fileName", imgName);

imgJson.put("fileValue", imgBASE64Encoder);

imgArray.add(imgJson);

}

}if (imgArray.size() != 0) {

rt.put("status", 0);

rt.put("imgs", imgArray);

}else{

rt.put("message", "没有相应的影像件");

}

}

}else{

rt.put("message", "没有相应的影像件");

}returnrt.toJSONString();

}

其中Base64Util.img2BASE64Encoder(pngFile)的代码如下:

/*** 图片转为base64编码,其他文件也是通用的

*@paramfile 要转换的文件

*@return*@throwsException*/

public static String img2BASE64Encoder(File file) throwsException{

InputStream in= null;byte[] data = null;try{//读取图片字节数组

in = newFileInputStream(file);

data= new byte[in.available()];

in.read(data);

in.close();

}catch(IOException e) {

e.printStackTrace();

}

BASE64Encoder encoder= newBASE64Encoder();//返回Base64编码过的字节数组字符串

returnencoder.encode(data);

}

根据路径删除该路径下的选中的影像文件,pdf文件同时删除与之对应的png文件:

/***

*@paramdelFilePath 要删除的文件路径

*@paramfileNames 要删除的文件列表

*@return根据删除状态返回给前台对应的状态值

*@throwsException*/

public String delImgsByPath(String delFilePath, List fileNames) throwsException {

JSONObject rt= newJSONObject();

rt.put("status",0);

rt.put("message", "文件删除成功");if(StringUtil.isEmpty(delFilePath) || fileNames.size()==0){

rt.put("status", 1);

rt.put("message", "删除数据出错,请联系相关人员");

}//根据文件路径开始删除

if(!StringUtil.isEmpty(delFilePath)){

String fulllFileName= "";for (int j = 0; j < fileNames.size(); j++) {

String name=fileNames.get(j);//要删除的文件完整路径名

fulllFileName = delFilePath + File.separator +name;

File delFile= newFile(fulllFileName);if(delFile.exists()) {if (!delFile.delete()) {

rt.put("status", 1);

rt.put("message", "文件删除失败,请稍后重试");

}

}if (name.endsWith(".pdf")) {

StringBuffer imgPngFileName= newStringBuffer();

imgPngFileName.append(delFilePath+ File.separator + "thumbnail");int dot = name.lastIndexOf(".");

imgPngFileName.append(File.separator+ name.substring(0, dot) + ".png");

File pngFile= newFile(imgPngFileName.toString());if(pngFile.exists()){if (!pngFile.delete()) {

rt.put("status", 1);

rt.put("message", "文件删除失败,请稍后重试");

}

}

}

}

}returnrt.toJSONString();

}

以上就是对影像文件进行增,删,查的功能的代码,其中pdf文件由于文件类型特殊,前段无法显示pdf文件的缩略图进行选中删除操作,所以把pdf文件转换为png文件后再保存到指定的文件夹中,查询的时候一起组装为一个json对象里传给前台,方便前台的显示,删除时同时把pdf文件对应的png文件删除,防止占用内存空间。关于pdf文件在前段无法生成缩略图这个问题的解决方案,还在持续的学习中,如果有好的建议,欢迎留言大家一起学习。

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

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

相关文章

【对比学习】koa.js、Gin与asp.net core——中间件

web框架中间件对比编程语言都有所不同&#xff0c;各个语言解决同一类问题而设计的框架&#xff0c;确有共通之处&#xff0c;毕竟是解决同一类问题&#xff0c;面临的挑战大致相同&#xff0c;比如身份验证&#xff0c;api授权等等&#xff0c;鄙人对node.js&#xff0c;golan…

java 传送解析8583报文_java发送ISO8583报文接口案例

【实例简介】java发送ISO8583报文实现平安银行支付接口【实例截图】【核心代码】pingAnBank└── pingAnBank├── build.xml├── client│ ├── ClientBean.java│ ├── UDPClient.java│ └── UdpClientSocket.java├── com│ └── solab│ └── i…

2020年终回顾:时间会回答成长,成长会回答梦想

前言2020年是脚踏实地&#xff0c;慢慢成长的一年&#xff0c;由于疫情的缘故&#xff0c;今年社区没有像去年一样举办多场线下活动&#xff0c;不过 .NET CONF CHINA 大会昨天也在苏州顺利召开&#xff0c;回顾这一年&#xff0c;也有不少惊喜与感悟2020年回顾公众号自从去年双…

java servlet 跳转_Servlet跳转方式sendReDirect()和forward()

在web应用服务中&#xff0c;经常会面对不同SERVLET之间的跳转&#xff0c;目前我们可以通过以下两种方式实现&#xff1a;1.RequestDispatcher.forward()2.ServletResponse.sendReDirect()两者的区别&#xff1a;1.redirect 方式可以跨应用访问,forward 只能在同一个应用中跳转…

明天面腾讯,我刷了这71道面试题...

激动人心的Conf 2020中国.NET开发者大会完美落幕&#xff0c;有幸去到现场&#xff0c;跟诸位.NET大佬、微软大咖、MVP面对面交流&#xff0c;内心很是鸡冻&#xff01;聊天中我注意到一个细节&#xff0c;很多公司的项目都在逐步用MySQL替换SQLServer&#xff0c;尤其是微服务…

java 毕向东 内部类_java基础内部类(毕向东老师)

内部类//特点&#xff1a;内部类可以直接访问外部类的成员&#xff0c;//外部类要访问内部类中的成员必须创建内部类的对象。//为什么要定义内部类呢&#xff1f;类是用于描述事物的&#xff0c;而事务中如果还有具体的事物&#xff0c;而且这个内部的事物在访问着所属事物中的…

java字符串切分_Java字符串分割(转)

java.lang.String的split()方法, JDK 1.4 or laterpublic String[] split(String regex,int limit)示例代码public class StringSplit {public static void main(String[] args) {String sourceStr "1,2,3,4,5";String[] sourceStrArray sourceStr.split(",&q…

面试官:. NET5源码里用到了哪些设计模式?懵!

作为微软最早迈向开源的重要软件之一&#xff0c;.NET 5的发布具有重要意义&#xff01;微软希望 .NET Framework 开发者能够迁移他们的代码和应用到 .NET 5.0 上&#xff0c;为明年发布的 .NET 6.0 将 Xamarin 开发者过渡到统一平台奠定基础。版本发布时间轴&#xff1a;.NET …

ldap java 密码_用java进行LDAP用户登陆(用户认证)及修改密码

一、用户认证public String execute(){Hashtable env new Hashtable();String LDAP_URL "ldap://8.8.8.8:389"; // LDAP访问地址env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");env.put(Context.PROVIDER_URL, LDAP_URL)…

C# 中 ConcurrentDictionary 一定线程安全吗?

根据 .NET 官方文档的定义&#xff1a;ConcurrentDictionary<TKey,TValue> Class 表示可由多个线程同时访问的线程安全的键/值对集合。这也是我们在并发任务中比较常用的一个类型&#xff0c;但它真的是绝对线程安全的吗&#xff1f;仔细阅读官方文档&#xff0c;我们会发…

java 3des 32位密钥_3des,java_java 中32位秘钥长度的 3des加密方法?,3des,java - phpStudy...

java 中32位秘钥长度的 3des加密方法&#xff1f;java中 3des加密 默认是24位秘钥的现在需求是 32位秘钥加密尝试很多种方法 解决 结果都不正确// 密钥private final static String secretKey "11111111111111111111111111111111";// 向量// private final static S…

2020 .NET 开发者峰会顺利在苏州落幕,相关数据很喜人以及线上直播回看汇总

在2019年上海中国.NET开发者大会的基础上&#xff0c;2020年12月19-20日 继续以“开源、共享、创新” 为主题的第二届中国 .NET 开发者峰会&#xff08;.NET Conf China 2020&#xff09;在苏州人工智能智能产业创新中心落下帷幕&#xff0c;本次大会以线下城市苏州为中心&…

java怎么判断数据类型_数据类型判断

[java]代码库import java.util.*; public class Main{public static void main(String[] args) {Scanner scan = new Scanner(System.in); String s = scan.nextLine(); String []str = s.split(" "); int i, j; for(i = 0; i < str.length; i++) {if(i != 0) Sys…

.NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记

2.3.1 Web API -- REST && RESTful什么是 REST&#xff0c;什么是 RESTfulRESTful API 设计RESTful 成熟度模型什么是 REST&#xff0c;什么是 RESTful理解RESTful架构&#xff1a;https://www.ruanyifeng.com/blog/2011/09/restful.htmlREST&#xff08;Representatio…

vue 一个组件内多个弹窗_论如何用Vue实现一个弹窗-一个简单的组件实现

前言最近在使用element-ui框架&#xff0c;用到了Dialog对话框组件&#xff0c;大致实现的效果&#xff0c;跟我之前自己在移动端项目里面弄的一个弹窗组件差不太多。然后就想着把这种弹窗组件的实现方式与大家分享一下&#xff0c;下面本文会带着大家手摸手实现一个弹窗组件。…

拆分路径 java_JAVA 类文件中的路径如何拆分和替换

我做Swing的时候文件要放绝对路径&#xff0c;相对路径出不来&#xff01;所以我用如果我的类放在D:\aaa\Class里Thread.currentThread().getContextClassLoader().getResource("");MenuTest.class.getClas...我做Swing的时候文件要放绝对路径&#xff0c;相对路径出…

为 CefSharp 应用内置 C++ 运行环境并启用 AnyCPU 支持

一个 CefSharp 应用程序要想正确运行&#xff0c;有两个必要条件&#xff1a;.NET Framework 4.5.2VC 2015在部署 CefSharp 应用时经常会遇到因为没有 VC 2015 而无法运行的问题&#xff1a;通过事件查看器&#xff0c;可以观察到一个类型为&#xff1a;System.IO.FileNotFound…

java file rename 失败_java重命名文件造成文件不可读写

我想使用java代码对nginx日志文件进行拆分&#xff0c;但是我发现代码执行之后&#xff0c;拆分出来的日志文件没有读写权限&#xff0c;查看文件属性&#xff0c;显示的很诡异&#xff1a;点击高级按钮&#xff0c;显示你没有权限查看或者编辑这个对象的权限设置&#xff1a;反…

如何在 ASP.NET Core 中使用 Route 特性

ASP.NET Core 中的 Route 中间件的职责在于将 request 匹配到各自 Route 处理程序上&#xff0c;Route 分两种&#xff1a;基于约定 和 基本特性 模式。基于约定 模式的Route采用集中化的方式&#xff0c;而 基于特性 的方式允许你在 Action 或者 Controller 上单独定义&#x…

java opencsv_用opencsv文件读写CSV文件

首先明白csv文件长啥样儿&#xff1a;用excel打开就变成表格了&#xff0c;看不到细节推荐用其它简单粗暴一点儿的编辑器&#xff0c;比如Notepad&#xff0c;csv文件内容如下&#xff1a;csv文件默认用逗号分隔各列。有了基础的了解就进入主题&#xff0c;用Opencsv读写csv文件…