shichongfu
2023-06-07 c28e9990179f5573ea94f41130fcec8c64f7902a
文档转换新转换方式,在properties中配置,open office是否启用
已添加1个文件
已修改3个文件
318 ■■■■■ 文件已修改
pom.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/util/AsposeUtil.java 269 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/util/FileUtils.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/file/util/PdfConcurrenceUtil.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -11,7 +11,6 @@
    <artifactId>product-server-file</artifactId>
    <name>product-server-file</name>
    <description>product-server-file</description>
    <version>2.0.0-release</version>
    <dependencies>
        <dependency>
            <groupId>com.lx</groupId>
@@ -81,6 +80,21 @@
            <artifactId>pdfbox</artifactId>
            <version>2.0.6</version>
        </dependency>
                <dependency>
          <groupId>org.aspose</groupId>
          <artifactId>cells-line</artifactId>
          <version>15.9.0</version>
        </dependency>
        <dependency>
          <groupId>org.aspose</groupId>
          <artifactId>slides-line</artifactId>
          <version>15.9.0</version>
        </dependency>
        <dependency>
          <groupId>org.aspose</groupId>
          <artifactId>words-line</artifactId>
          <version>15.9.0</version>
        </dependency>
    </dependencies>
</project>
src/main/java/com/product/file/util/AsposeUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,269 @@
package com.product.file.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import com.aspose.cells.PdfSaveOptions;
import com.aspose.cells.Workbook;
import com.aspose.slides.Presentation;
import com.aspose.words.Document;
import com.product.core.exception.BaseException;
import com.product.core.spring.context.SpringMVCContextHolder;
public class AsposeUtil {
    //是否初始了license
    private static boolean isInitLicense=false;
    /**
     * èŽ·å–license
     * @return
     */
    public static boolean getLicense(int type)throws BaseException {
        //已经初始过,不再初始
        if(isInitLicense) {
            return true;
        }
        boolean result = true;
        InputStream is = null;
        try {
            is =  AsposeUtil.class.getClassLoader().getResourceAsStream("license.xml");
            com.aspose.cells.License excel = new com.aspose.cells.License();
            excel.setLicense(is);
            is =  AsposeUtil.class.getClassLoader().getResourceAsStream("license.xml");
            com.aspose.words.License word = new com.aspose.words.License();
            word.setLicense(is);
            is =  AsposeUtil.class.getClassLoader().getResourceAsStream("license.xml");
            com.aspose.slides.License ppt = new com.aspose.slides.License();
            ppt.setLicense(is);
            isInitLicense=true;
        } catch (Exception e) {
            result=false;
            throw new BaseException(e);
        }finally{
            if(is!=null) {
                try {
                    is.close();
                }catch(IOException e) {
                    throw new BaseException(e);
                }
            }
        }
        return result;
    }
    /**
     *
     * @param officePath
     * @param OutPutPath
     * @throws BaseException
     */
    public static void Excel2Pdf(String officePath,String OutPutPath)throws BaseException {
        // éªŒè¯License
        if (!getLicense(1)) {
            return;
        }
        FileOutputStream fileOS=null;
        try {
            File file = new File(OutPutPath);
            if (!file.exists()) {
                file.mkdirs();
            }
            Workbook wb = new Workbook(officePath);// åŽŸå§‹excel路径
            File pdfFile = new File(OutPutPath);// è¾“出路径
            fileOS = new FileOutputStream(pdfFile);
            //wb.save(fileOS, com.aspose.cells.SaveFormat.PDF);
            PdfSaveOptions pdfSaveOptions = new PdfSaveOptions();
            pdfSaveOptions.setAllColumnsInOnePagePerSheet(true);
            wb.save(fileOS, pdfSaveOptions);
        } catch (Exception e) {
            throw new BaseException(e);
        }finally{
            if(fileOS!=null) {
                try {
                    fileOS.flush();
                    fileOS.close();
                }catch(IOException e) {
                    throw new BaseException(e);
                }
            }
        }
    }
    /**
     *
     * @param officePath
     * @param OutPutPath
     * @throws BaseException
     */
    public static void Word2Pdf(String officePath,String OutPutPath) throws BaseException {
        // éªŒè¯License
        if (!getLicense(2)) {
            return;
        }
        FileOutputStream fileOS=null;
        try {
            File file = new File(OutPutPath);
            if (!file.getParentFile().exists()) {
                file.getParentFile().mkdirs();
            }
            Document doc = new Document(officePath);// åŽŸå§‹word路径
            File pdfFile = new File(OutPutPath);// è¾“出路径
            fileOS = new FileOutputStream(pdfFile);
            doc.save(fileOS, com.aspose.words.SaveFormat.PDF);
        } catch (Exception e) {
            throw new BaseException(e);
        }finally{
            if(fileOS!=null) {
                try {
                    fileOS.flush();
                    fileOS.close();
                }catch(IOException e) {
                    throw new BaseException(e);
                }
            }
        }
    }
    /**
     *
     * @param officePath
     * @param OutPutPath
     * @throws BaseException
     */
    public static void PPT2Pdf(String officePath,String OutPutPath)throws BaseException {
        // éªŒè¯License
        if (!getLicense(3)) {
            return;
        }
        FileOutputStream fileOS=null;
        try {
            File PathFile = new File(OutPutPath);
            if (!PathFile.exists()) {
                PathFile.mkdirs();
            }
            InputStream slides = new FileInputStream(new File(officePath));// åŽŸå§‹ppt路径
            Presentation pres = new Presentation(slides);
            File file = new File(OutPutPath);// è¾“出pdf路径
            fileOS = new FileOutputStream(file);
            pres.save(fileOS, com.aspose.slides.SaveFormat.Pdf);
            fileOS.flush();
            fileOS.close();
        } catch (Exception e) {
            throw new BaseException(e);
        }finally{
            if(fileOS!=null) {
                try {
                    fileOS.flush();
                    fileOS.close();
                }catch(IOException e) {
                    throw new BaseException(e);
                }
            }
        }
    }
    /**
     * æ–‡æ¡£è½¬æ¢
     * @param officePath
     * @param outFile
     * @return
     * @throws BaseException
     */
    public static String OfficeToPdf(String officePath,String outFile,String officeType )throws BaseException {
        SpringMVCContextHolder.getSystemLogger().info("The file of office type:"+officePath);
        SpringMVCContextHolder.getSystemLogger().info("The file of PDF type:"+outFile);
        File file = new File(officePath);
        //判断当前office文件是否已经转为PDF,如果已转为PDF就不需要再次转换。
        if (file.exists()&& !"pdf".equals(officeType)) {
            double bytes = file.length();
            double kilobytes = (bytes / 1024);
            double megabytes = (kilobytes / 1024);
            DecimalFormat df = new DecimalFormat("0.00");
            df.setRoundingMode(RoundingMode.HALF_UP);
            String MB = df.format(megabytes);
            Double Size = Double.parseDouble(MB);
//            if(Size>10){
            SpringMVCContextHolder.getSystemLogger().info("The file size:"+Size+"MB");
//            }
            //"doc", "docx", "xls","xlsx", "ppt", "pptx"
            if(officeType.equals("doc")||officeType.equals("docx")){
                Word2Pdf(officePath,outFile);
            }else if(officeType.equals("xls")||officeType.equals("xlsx")){
                Excel2Pdf(officePath,outFile);
            }else if(officeType.equals("ppt")||officeType.equals("pptx")){
                PPT2Pdf(officePath,outFile);
            }else{
                SpringMVCContextHolder.getSystemLogger().info("File types that cannot be converted:"+officeType);
            }
        } else {
            SpringMVCContextHolder.getSystemLogger().info("File Not Exist");
        }
        return outFile;
    }
    /**
     * æ–‡æ¡£è½¬æ¢
     * @param officePath
     * @return
     */
    public static String OfficeToPdf(String officePath) {
        //G:/product/WebApp/fwis_develop/com/is/flywings/oa/attchfile/1000000000/i0002/101951.docx⌒101951.docx⌒feiyu.docx
        String[] split = officePath.split("⌒");
        int lastIndex = split[0].lastIndexOf(".");
        int lastNameIndex = split[0].lastIndexOf("/");
        String officeType = split[0].substring(lastIndex+1);
        String officeName = split[0].substring(lastNameIndex+1,lastIndex)+".pdf";
        String OutPutPath = split[0].substring(0,lastNameIndex+1)+"office/";
        System.out.println("输出目录:"+OutPutPath);
        File file = new File(split[0]);
        File pdfFile = new File(OutPutPath+officeName);
        //判断当前office文件是否已经转为PDF,如果已转为PDF就不需要再次转换。
        if(pdfFile.exists()){
            return OutPutPath+officeName;
        }
        if (file.exists()) {
            double bytes = file.length();
            double kilobytes = (bytes / 1024);
            double megabytes = (kilobytes / 1024);
            DecimalFormat df = new DecimalFormat("0.00");
            df.setRoundingMode(RoundingMode.HALF_UP);
            String MB = df.format(megabytes);
            Double Size = Double.parseDouble(MB);
            if(Size>10){
                return Size+"MB";
            }
            //"doc", "docx", "xls","xlsx", "ppt", "pptx"
            try {
                if(officeType.equals("doc")||officeType.equals("docx")){
                    Word2Pdf(split[0],OutPutPath+"/"+officeName);
                }else if(officeType.equals("xls")||officeType.equals("xlsx")){
                    Excel2Pdf(split[0],OutPutPath+"/"+officeName);
                }else if(officeType.equals("ppt")||officeType.equals("pptx")){
                    PPT2Pdf(split[0],OutPutPath+"/"+officeName);
                }else{
                    System.out.println("无法识别该文件!");
                    return "Error";
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            return "NotExists";
        }
        return OutPutPath+officeName;
    }
    public static void main(String args[]) {
        String file="E:/work/沄崃/FE6.6产品报价工具-新 - å‰¯æœ¬.xlsx";
        AsposeUtil.OfficeToPdf(file);
    }
}
src/main/java/com/product/file/util/FileUtils.java
@@ -557,9 +557,10 @@
            if (placeLocation.indexOf("/") != 0) {
                placeLocation += "/";
            }
            //线程同步
            if (threadSync) {
                boolean b = convertPdf(uploadServer, isEncrypt, file, placeLocation, fileName);
                boolean b = convertPdf(uploadServer, isEncrypt, file, placeLocation, fileName +"."+tail);
                if (deleteFile && file.isFile()) {
                    file.delete();
                }
@@ -569,7 +570,7 @@
                String finalPlaceLocation = placeLocation;
                final File ff = FileUtil.copyFile(file, Global.getSystemConfig("temp.dir", "") + "/" + "temp_convert_pdf_" + RandomUtil.randomString(5) + "_" + file.getName(), 0);
                executorService.submit(() -> {
                    convertPdf(uploadServer, isEncrypt, ff, finalPlaceLocation, fileName);
                    convertPdf(uploadServer, isEncrypt, ff, finalPlaceLocation, fileName+"."+tail);
                    if (ff.isFile()) {
                        ff.delete();
                    }
@@ -588,20 +589,30 @@
        String tempPath = Global.getSystemConfig("temp.dir", "./attachment/temp") + "/" + "convertPDF_" + random + "_" + file.getName();
        String tempPathSuccess = Global.getSystemConfig("temp.dir", "./attachment/temp") + "/" + "convertPDF_success_" + random + ".pdf";
        try {
            int lastIndex = fileName.lastIndexOf(".");
            String officeType = fileName.substring(lastIndex+1);
            fileName=fileName.substring(0,lastIndex);
            FileUtil.copyFile(file, tempPath, 0);
            pdfFile = PdfConcurrenceUtil.convertToPdf(tempPath, tempPathSuccess);
            if(Global.getPropertyToBoolean("open.office.isEnable", "true")) {//启用oepn office转换
                pdfFile = PdfConcurrenceUtil.convertToPdf(tempPath, tempPathSuccess);
            }else{
                pdfFile = new File(AsposeUtil.OfficeToPdf(tempPath, tempPathSuccess,officeType));
            }
            String s = Global.getSystemConfig("temp.dir", "") + "/" + "convertPDF_encryptTemp_" + random + ".pdf";
            FileUtil.copyFile(pdfFile, s, isEncrypt ? 1 : 0);
            pdfFile.delete();
            pdfFile = new File(s);
            uploadOtherFile(false, uploadServer, placeLocation, pdfFile, fileName);
            return true;
        } catch (Exception e) {
        }
        catch (BaseException e) {
            throw e;
        }catch (Exception e) {
            e.printStackTrace();
            throw new BaseException(FileCode.CONVERT_PDF_FILE_FAIL);
        } finally {
            try {
                if (pdfFile.isFile()) {
                if (pdfFile !=null && pdfFile.isFile()) {
                    pdfFile.delete();
                }
                com.product.common.io.FileUtils.delFile(tempPath);
src/main/java/com/product/file/util/PdfConcurrenceUtil.java
@@ -2,6 +2,7 @@
import com.alibaba.druid.util.StringUtils;
import com.product.core.config.Global;
import com.product.core.exception.BaseException;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.file.config.FileCode;
import org.artofsolving.jodconverter.OfficeDocumentConverter;
@@ -45,6 +46,9 @@
     * åˆå§‹åŒ–转换服务
     */
    public static boolean init() {
        if(!Global.getPropertyToBoolean("open.office.isEnable", "true")) {//不启用oepn office转换
            return true;
        }
        SpringMVCContextHolder.getSystemLogger().info("初始化转换服务->");
        openOfficeHome = Global.getSystemConfig("open.office.home","");
        portInfo = Global.getSystemConfig("open.office.port.info","");
@@ -148,22 +152,20 @@
     * @param output
     * @return
     */
    public static File convertToPdf(String input, String output) {
    public static File convertToPdf(String input, String output) throws Exception {
        File inputFile = null;
        File outFile = null;
        OfficeManager officeManager = null;
        try {
            SpringMVCContextHolder.getSystemLogger().info("从队列中提取转换端口...");
            officeManager = officeManagerQueue.take();
            inputFile = new File(input);
            outFile = new File(output);
            SpringMVCContextHolder.getSystemLogger().info("开始转换文档:" + input + "=>" + output);
            OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
            converter.convert(inputFile, outFile); // è½¬æ¢æ–‡æ¡£
        } catch (Exception e) {
            e.printStackTrace();
            SpringMVCContextHolder.getSystemLogger().error("转换文档出错" + e);
        }catch (Exception e) {
            outFile = null;
            throw e;
        } finally {
            SpringMVCContextHolder.getSystemLogger().info("结束转换文档");
            if (officeManager != null) {