doc或docx(word)或image類型文件批量轉PDF腳本 1.實際生產環境中遇到文件展示只能適配PDF版本的文件,奈何一萬個文件有七千個都是word或者image類型的,由此搞個腳本批量轉換下上傳至OSS,為前端提供數據支撐。 2.環境準備,這裡使用的是aspose-words-18.6-j ...
doc或docx(word)或image類型文件批量轉PDF腳本
1.實際生產環境中遇到文件展示只能適配PDF版本的文件,奈何一萬個文件有七千個都是word或者image類型的,由此搞個腳本批量轉換下上傳至OSS,為前端提供數據支撐。
2.環境準備,這裡使用的是aspose-words-18.6-jdk16-crack.jar工具包,資源包就不提供了,網上百度一下即可。
3.javaMaven項目,jdk1.8.maven3.6
4.使用aspose-words-18.6-jdk16-crack.jar工具包會產生水印,需要配置resources下去除水印配置:
<?xml version="1.0" encoding="UTF-8" ?> <License> <Data> <Products> <Product>Aspose.Total for Java</Product> <Product>Aspose.Words for Java</Product> </Products> <EditionType>Enterprise</EditionType> <SubscriptionExpiry>20991231</SubscriptionExpiry> <LicenseExpiry>20991231</LicenseExpiry> <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber> </Data> <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature> </License>license.xml
5.工具類編寫:
package org.utiles.dongl.tools; import com.aspose.words.License; import com.aspose.words.SaveFormat; import com.itextpdf.text.*; import com.itextpdf.text.pdf.PdfWriter; import org.apache.log4j.Logger; import org.utiles.dongl.comment.WordTranPDF; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; import java.util.List; /** * @ClassName: FileTranPDFTool * @Description TODO * @Author: 東霖 * @Date: 2022/7/23 10:50 * @Version 1.0 **/ public class FileTranPDFTool { private static Logger logger = Logger.getLogger(FileTranPDFTool.class); public static boolean getLicense() { boolean result = false; try { InputStream is = WordTranPDF.class.getClassLoader().getResourceAsStream("\\license.xml"); // license.xml應放在..\WebRoot\WEB-INF\classes路徑下 License aposeLic = new License(); aposeLic.setLicense(is); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * ImageToPDF * 支持類型:jpg/tif/.. * * @param source * @param target */ public static void ImageToPDF(String source, String target) { Document document = new Document(); //設置文檔頁邊距 document.setMargins(0, 0, 0, 0); FileOutputStream fos = null; try { fos = new FileOutputStream(target); PdfWriter.getInstance(document, fos); //打開文檔 document.open(); //獲取圖片的寬高 Image image = Image.getInstance(source); float imageHeight = image.getScaledHeight(); float imageWidth = image.getScaledWidth(); //設置頁面寬高與圖片一致 Rectangle rectangle = new Rectangle(imageWidth, imageHeight); document.setPageSize(rectangle); //圖片居中 image.setAlignment(Image.ALIGN_CENTER); //新建一頁添加圖片 document.newPage(); document.add(image); } catch (Exception ioe) { System.out.println(ioe.getMessage()); } finally { //關閉文檔 document.close(); try { fos.flush(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } } /** * word 文檔類型轉pdf * * @param inPath * @param outPath * @return */ public static boolean doc2pdf(String inPath, String outPath) { if (!getLicense()) { // 驗證License 若不驗證則轉化出的pdf文檔會有水印產生 return false; } FileOutputStream os = null; try { File file = new File(outPath); // 新建一個空白pdf文檔 os = new FileOutputStream(file); com.aspose.words.Document doc = new com.aspose.words.Document(inPath); // Address是將要被轉化的word文檔 // doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, doc.save(os, SaveFormat.DOCX);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, // EPUB, XPS, SWF 相互轉換 } catch (Exception e) { e.printStackTrace(); return false; } finally { if (os != null) { try { os.flush(); os.close(); } catch (IOException e) { e.printStackTrace(); } } } return true; } /** * 遍歷指定目錄取文件名稱 * * @param foldPath 文件目錄絕對路徑 * @return */ public static List<String> listFileName(String foldPath) { List<String> listFiles = new ArrayList<>(); //創建文件對象 File f = new File(foldPath); //列出文件名稱存入數組 File[] files = f.listFiles(); for (int i = 0; i < Objects.requireNonNull(files).length; i++) { listFiles.add(files[i].getName()); } return listFiles; } /** * 刪除指定文件 * @param filePath * @return */ public static boolean deleteByFilePath(String filePath) { File file = new File(filePath); return file.delete(); } /** * 遍歷指定目錄取文件名稱並接入路徑 * * @param oldPath 遍歷文件目錄絕對路徑,也是要刪除的文件目錄 * @return */ public static Map<String, String> listFileNameAndPath(String oldPath) { Map<String, String> listFiles = new HashMap(); //創建文件對象 File f = new File(oldPath); //列出文件名稱存入數組 File[] files = f.listFiles(); for (int i = 0; i < Objects.requireNonNull(files).length; i++) { listFiles.put(files[i].getPath(), files[i].getName()); } return listFiles; } /** * 獲取指定文件目錄文件大小為0Size的 * @param foldPath * @return */ public static Integer getFileSize(String foldPath,String newFoldPath) { int j=1; //創建文件對象 File file = new File(foldPath); File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].length()==0){ Boolean aBoolean = WriteToFileExample.moveFileToTarget("D:\\OSS\\ghwb\\ghksj_1_copy\\《金東區衛生健康事業發展“十四五”規劃》.pdf", newFoldPath+files[i].getName(),null); if (aBoolean==true){ j++; logger.info("移動:"+files[i].getPath()+"到"+newFoldPath); } System.out.println(files[i].getPath()); } } return j; } /** * 文件對比刪除重覆文件 * @param oldFileNames * @param newPath 對比文件目錄 * @return */ public static Integer deleteByFileName(Map<String, String> oldFileNames, String newPath) { int j = 0; List<String> newListNames = listFileName(newPath); for (Map.Entry<String, String> entry : oldFileNames.entrySet()) { for (int i = 0; i < newListNames.size(); i++) { String value = entry.getValue(); String s = newListNames.get(i); if (value.substring(0,value.lastIndexOf(".")).equals(s.substring(0,s.lastIndexOf(".")))) { boolean b = deleteByFilePath(entry.getKey()); if (b==true){ logger.info("成功刪除指定文件:"+entry.getKey()+",共計:"+j+"個"); j++; }else{ logger.error("指定文件不存在:"+entry.getKey()); } } } } return j; } public static void main(String[] args) { //文件對比刪除 Map<String, String> map = listFileNameAndPath("D:\\OSS\\ghwb\\word"); int b = deleteByFileName(map, "D:\\OSS\\ghwb\\ghksj - 副本"); //word轉pdf doc2pdf("D:\\OSS\\ghwb\\13c5ad939a0b2001.doc", "D:\\OSS\\ghwb\\doc2docx\\13c5ad939a0b2001.docx"); //移動文件size為0的數據到指定文件夾 // getFileSize("D:\\OSS\\ghwb\\ghksj_3_copy","D:\\OSS\\ghwb\\test"); } }WordORImageTranPDF
6.邏輯代碼:
package org.utiles.dongl.comment; import org.apache.log4j.Logger; import org.utiles.dongl.tools.FileTranPDFTool; import org.utiles.dongl.tools.WriteToFileExample; import java.io.*; import java.util.HashMap; import java.util.Map; import static org.utiles.dongl.tools.FileTranPDFTool.doc2pdf; /** * @ClassName: WordTranPDF * @Description TODO * @Author: 東霖 * @Date: 2022/7/22 8:55 * @Version 1.0 **/ public class WordTranPDF { private static Logger logger = Logger.getLogger(WordTranPDF.class); /** * 獲取指定文件路徑下所有文件對象 * * @param inFilePath * @return */ public static Map<String, String> getFilePathName(String inFilePath,String replacePathOld ,String replacePathNew,String wjjl,String pdfToPath) { Map<String, String> fileList = new HashMap(); //創建文件對象 File f = new File(inFilePath); //列出文件名稱存入數組 File[] files = f.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].getName().endsWith("docx") || files[i].getName().endsWith("doc") || files[i].getName().endsWith("wps") || files[i].getName().endsWith("rtf")) { // String str=files[i].getPath().substring(0,files[i].getPath().lastIndexOf(".")+1)+"pdf"; String str=files[i].getPath().substring(0,files[i].getPath().lastIndexOf(".")+1)+"docx"; fileList.put(files[i].getPath()+"&"+"word",str.replace(replacePathOld,replacePathNew)); // logger.info("當前文件路徑為:"+files[i].getPath()); } else if (files[i].getName().endsWith(".png") || files[i].getName().endsWith(".jpg") || files[i].getName().endsWith(".gif") || files[i].getName().endsWith(".jpeg") || files[i].getName().endsWith(".tif")) { String str=files[i].getPath().substring(0,files[i].getPath().lastIndexOf(".")+1)+"pdf"; fileList.put(files[i].getPath()+"&"+"image", str.replace(replacePathOld,replacePathNew)); // logger.info("當前文件路徑為:"+files[i].getPath()); }else if(files[i].getName().endsWith(".pdf")) { WriteToFileExample.moveFileToTarget(files[i].getPath(),pdfToPath+files[i].getName(),""); logger.info("移動:"+files[i].getPath()+"到"+pdfToPath); }else{ WriteToFileExample.writeFileSQL("當前文件無法轉換:"+files[i].getPath(),wjjl); } } return fileList; } public static void start(Map<String, String> hashMap) throws InterruptedException { long old = System.currentTimeMillis(); int j = 0; for (Map.Entry<String, String> entry : hashMap.entrySet()) { // doc2pdf(entry.getKey(),entry.getValue()); String[] split = entry.getKey().split("&"); if(split[1].equals("word")){ System.out.println(entry.getValue()); doc2pdf(split[0],entry.getValue()); Thread.sleep(Long.parseLong("15")); }else if (split[1].equals("image")){ FileTranPDFTool.ImageToPDF(split[0],entry.getValue()); Thread.sleep(Long.parseLong("15")); }else { // break; } j++; logger.info("轉換第:"+j+"個!"+"文件名稱為:"+entry.getKey()); } long now = System.currentTimeMillis(); logger.info("pdf轉換成功,共耗時:" + ((now - old) / 1000.0) + "秒"); logger.info("共轉換:" + j + "個文件!"); } public static void main(String[] args) throws InterruptedException { /** * inFilePath: 需要轉換的文件夾路徑 * replacePathOld: 抓換後的文件要寫入新文件,直接替換文件的上級目錄關鍵字即可 * replacePathNew: 新的文件父路徑 * wjjl: 不能轉換的文件記錄位置及記錄名稱 * pdfToPath:當文件中已有pdf不用抓換的需配置文件留存方向。會從原文件目錄移動至新文件目錄 */ Map<String, String> filePathName = getFilePathName("D:\\OSS\\ghwb\\doc11", "doc11","doc2docx", "D:\\OSS\\ghwb\\"+System.currentTimeMillis()+".txt" ,"D:\\OSS\\yjbg\\gjxxzx\\ghksj_copy\\"); start(filePathName); } }View Code
7.上述就是word或者image類型的批量腳本,可以在工具類中單元測試之後在使用批量邏輯代碼。
本文來自博客園,作者:zhuzhu&you,轉載請註明原文鏈接:https://www.cnblogs.com/zhuzhu-you/p/16550232.html