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文件在前段無法生成縮略圖這個問題的解決方案,還在持續的學習中,如果有好的建議,歡迎留言大家一起學習。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Java pdf文件传输_java中pdf文件的管理(pdf文件转png文件,base64传输文件以及删除)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 肌肉拉伤应该怎么办
- 下一篇: java的scanner的方法_Java