Procházet zdrojové kódy

完成客户端pdf下载,以及相关依赖引入

zhoupeng před 1 rokem
rodič
revize
2423cf996f

+ 62 - 12
chuanyi_client/src/utils/export.js

@@ -1,4 +1,5 @@
 import FileSaver from 'file-saver'
+import request from '@/utils/request';
 
 const Excel = require('exceljs')
 
@@ -41,7 +42,7 @@ var setBorder = function (luckyBorderInfo, worksheet) {
             //   color: '#d0d4e3'
             //   style: 1
             // }
-            const {col_index, row_index} = elem.value
+            const { col_index, row_index } = elem.value
             const borderData = Object.assign({}, elem.value)
             delete borderData.col_index
             delete borderData.row_index
@@ -73,7 +74,7 @@ var setStyleAndValue = function (cellArr, worksheet) {
             let value = ''
 
             if (cell.f) {
-                value = {formula: cell.f, result: cell.v}
+                value = { formula: cell.f, result: cell.v }
             } else if (!cell.v && cell.ct && cell.ct.s) {
                 // xls转为xlsx之后,内部存在不同的格式,都会进到富文本里,即值不存在与cell.v,而是存在于cell.ct.s之后
                 // value = cell.ct.s[0].v
@@ -130,7 +131,7 @@ const getImagePosition = function (num, arr) {
 }
 
 const getCellSize = function (table, worksheet, r, c) {
-    const {cs, rs} = table.data[r][c].mc;
+    const { cs, rs } = table.data[r][c].mc;
     const rowhidden = table.config.rowhidden && Object.keys(table.config.rowhidden) || '';
     const rowArr = [];
     for (let i = 0; i < rs; i++) {
@@ -182,8 +183,8 @@ var setImages = function (table, worksheet, workbook) {
             imgWidth = systemPlatform() === "mac" ? size.w * 6.9 : (systemPlatform() === "win" ? size.w * 7.9 : size.w * 7.4);
             imgHeight = size.h / 0.75;
             cellConfig = {
-                tl: {col: col_st, row: row_st},
-                ext: {width: imgWidth, height: imgHeight}
+                tl: { col: col_st, row: row_st },
+                ext: { width: imgWidth, height: imgHeight }
             }
             // console.log("Image:Insert Mode");
         } else {
@@ -198,8 +199,8 @@ var setImages = function (table, worksheet, workbook) {
             let col_ed = getImagePosition(w_ed, visibledatacolumn);
             let row_ed = getImagePosition(h_ed, visibledatarow);
             cellConfig = {
-                tl: {col: col_st, row: row_st},
-                br: {col: col_ed, row: row_ed},
+                tl: { col: col_st, row: row_st },
+                br: { col: col_ed, row: row_ed },
             }
             // console.log("Image:Setting Mode");
         }
@@ -215,7 +216,7 @@ var fillConvert = function (bg) {
     const fill = {
         type: 'pattern',
         pattern: 'solid',
-        fgColor: {argb: bg.replace('#', '')}
+        fgColor: { argb: bg.replace('#', '') }
     }
     return fill
 }
@@ -254,7 +255,7 @@ var fontConvert = function (
         name: typeof ff === 'number' ? luckyToExcel[ff] : ff,
         family: 1,
         size: fs,
-        color: {argb: fc.replace('#', '')},
+        color: { argb: fc.replace('#', '') },
         bold: luckyToExcel.num2bl(bl),
         italic: luckyToExcel.num2bl(it),
         underline: luckyToExcel.num2bl(ul),
@@ -342,7 +343,7 @@ var borderConvert = function (borderType, style = 1, color = '#000') {
     }
     const template = {
         style: luckyToExcel.style[style],
-        color: {argb: color.replace('#', '')}
+        color: { argb: color.replace('#', '') }
     }
     const border = {}
     if (luckyToExcel.type[borderType] === 'all') {
@@ -389,12 +390,12 @@ function addborderToCell(borders, rowIndex, colIndex) {
         if (borders[bor].color.indexOf('rgb') === -1) {
             border[luckyExcel.type[bor]] = {
                 style: luckyExcel.style[borders[bor].style],
-                color: {argb: borders[bor].color.replace('#', '')}
+                color: { argb: borders[bor].color.replace('#', '') }
             }
         } else {
             border[luckyExcel.type[bor]] = {
                 style: luckyExcel.style[borders[bor].style],
-                color: {argb: borders[bor].color}
+                color: { argb: borders[bor].color }
             }
         }
     }
@@ -448,3 +449,52 @@ export var exportExcel = function (luckysheet, value) {
     })
     return buffer
 }
+
+export var exportPdf = function (luckysheet, value) {
+    // 1.创建工作簿,可以为工作簿添加属性
+    const workbook = new Excel.Workbook()
+    // 2.创建表格,第二个参数可以配置创建什么样的工作表
+    luckysheet.forEach(function (table) {
+        if (table.data.length === 0) return true
+        const worksheet = workbook.addWorksheet(table.name)
+        const merge = (table.config && table.config.merge) || {}
+        const borderInfo = (table.config && table.config.borderInfo) || {}
+        // 3.设置单元格合并,设置单元格边框,设置单元格样式,设置值,导出图片
+        setStyleAndValue(table.data, worksheet)
+        setMerge(merge, worksheet)
+        try {
+            setBorder(borderInfo, worksheet)
+        } catch (e) {
+            console.log(e)
+        }
+        setImages(table, worksheet, workbook)
+        return true
+    })
+
+    // 4.写入 buffer
+    const buffer = workbook.xlsx.writeBuffer().then(data => {
+        console.log(data)
+        const blob = new Blob([data], {
+            type: 'application/vnd.ms-excel;charset=utf-8'
+        })
+        let formData = new FormData();
+        // 第一个参数是后台接收的文件参数名,第二个参数是blob数据,第三个参数是文件名
+        formData.append('file', blob, `${value}.xlsx`);
+
+        // 发送ajax请求
+        request.post('/file/fileToPdfDownload', formData, {
+            headers: {
+                'Content-Type': 'multipart/form-data'
+            },
+        }).then(response => {
+            if (response.data) {
+                const fileUrl = localStorage.getItem('SYS_HOST') + '/file/download?outPath=' + response.data.outPath + '&pdfFileName=' + response.data.pdfFileName
+                //执行下载文件
+                window.location.href = fileUrl
+            }
+        }).catch(error => {
+            // 处理错误
+        });
+    })
+    return buffer
+}

+ 7 - 2
chuanyi_client/src/views/my_report/index.vue

@@ -398,7 +398,7 @@
         :append-to-body="true">
       <div style="text-align: center;">
         <el-radio v-model="downloadType" label="1">Excel</el-radio>
-        <!--        <el-radio v-model="downloadType" label="2" disabled>PDF</el-radio>-->
+        <el-radio v-model="downloadType" label="2">PDF</el-radio>
       </div>
       <div style="text-align: center; margin-top: 40px;">
         <el-button type="primary" @click="downloadReportEvent">确定</el-button>
@@ -563,7 +563,7 @@ import {
 } from '@/api/datasource'
 import Print from 'print-js'
 import {getUsername} from '@/utils/auth'
-import {exportExcel} from '@/utils/export'
+import {exportExcel,exportPdf} from '@/utils/export'
 import {getAllUserGroup} from "@/api/user";
 import {mapGetters} from "vuex";
 import {insertLuckysheetEChart, setSheetDatas} from "@/utils/luckysheettool";
@@ -2261,6 +2261,11 @@ export default {
         setTimeout(() => {
           this.dialogDownloadReportTypeVisible = false
         }, 500)
+      } else if (downloadType == "2") {
+          exportPdf(luckysheet.getAllSheets(), reportName);
+          setTimeout(() => {
+              this.visible = false;
+          }, 500);
       }
     },
     /** 从表格操作进入的运行记录 */

+ 1 - 1
chuanyi_client/src/views/run_config/downloadReportType.vue

@@ -4,7 +4,7 @@
         :visible.sync="visible" :close-on-click-modal="false" :append-to-body="true">
         <div style="text-align: center">
             <el-radio v-model="downloadType" label="1">Excel</el-radio>
-            <!--        <el-radio v-model="downloadType" label="2" disabled>PDF</el-radio>-->
+            <el-radio v-model="downloadType" label="2">PDF</el-radio>
         </div>
         <div style="text-align: center; margin-top: 40px">
             <el-button type="primary" @click="downloadReportEvent">确定</el-button>

+ 7 - 2
chuanyi_client/src/views/run_config/index.vue

@@ -844,7 +844,7 @@
     >
       <div style="text-align: center">
         <el-radio v-model="downloadType" label="1">Excel</el-radio>
-        <!--        <el-radio v-model="downloadType" label="2" disabled>PDF</el-radio>-->
+        <el-radio v-model="downloadType" label="2">PDF</el-radio>
       </div>
       <div style="text-align: center; margin-top: 40px">
         <el-button type="primary" @click="downloadReportEvent">确定</el-button>
@@ -1050,7 +1050,7 @@ import {
 import { getAllPrintConfig } from "@/api/printConfig";
 import Print from "print-js";
 import { getUsername } from "@/utils/auth";
-import { exportExcel } from "@/utils/export";
+import { exportExcel,exportPdf } from "@/utils/export";
 import { getAllUserGroup } from "@/api/user";
 import { mapGetters } from "vuex";
 import { insertLuckysheetEChart, setSheetDatas } from "@/utils/luckysheettool";
@@ -3054,6 +3054,11 @@ export default {
         setTimeout(() => {
           this.dialogDownloadReportTypeVisible = false;
         }, 500);
+      } else if(downloadType == "2") {
+          exportPdf(luckysheet.getAllSheets(), reportName);
+          setTimeout(() => {
+              this.visible = false;
+          }, 500);
       }
     },
     /** 从表格操作进入的运行记录 */

+ 6 - 1
chuanyi_client/src/views/run_config/showReport.vue

@@ -63,7 +63,7 @@ import { showAlertMsgWin, getNowFormatDate, showLoading, withDateFormatLength }
 import { delReportTableById, getAutoChReportTable, getReportTableById } from "@/api/datasource";
 import { getUsername } from "@/utils/auth";
 import { insertLuckysheetEChart, setSheetDatas } from "@/utils/luckysheettool";
-import { exportExcel } from "@/utils/export";
+import { exportExcel,exportPdf } from "@/utils/export";
 import BreadcrumbView from "@/components/BreadcrumbView";
 import { print } from "@/utils/print.js";
 export default {
@@ -136,6 +136,11 @@ export default {
                 setTimeout(() => {
                     this.visible = false;
                 }, 500);
+            } else if (downloadType == "2") {
+                exportPdf(luckysheet.getAllSheets(), reportName);
+                setTimeout(() => {
+                    this.visible = false;
+                }, 500);
             }
         },
         getPrintSheetArea() {

+ 16 - 0
cqcy-ei/cqcy-ei-da/pom.xml

@@ -112,6 +112,22 @@
             <artifactId>verify</artifactId>
             <version>1.0</version>
         </dependency>
+        <!--jacob依赖-->
+        <dependency>
+            <groupId>com.jacob</groupId>
+            <artifactId>jacob</artifactId>
+            <version>1.20</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.pdfbox</groupId>
+            <artifactId>pdfbox</artifactId>
+            <version>2.0.9</version>
+        </dependency>
+        <dependency>
+            <groupId>com.aspose</groupId>
+            <artifactId>aspose-cells</artifactId>
+            <version>23.10</version>
+        </dependency>
 
         <!--opcDa读取依赖-->
         <!--utgard -->

+ 1 - 0
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/config/InterceptorConfig.java

@@ -34,6 +34,7 @@ public class InterceptorConfig implements WebMvcConfigurer {
                 .excludePathPatterns("/role/getMenuTreeByRoleList")
                 .excludePathPatterns("/user/getUserById")
                 .excludePathPatterns("/file/uploadFiles")
+                .excludePathPatterns("/file/download")
                 .excludePathPatterns("/reportTable/getReportTableById")
                 //针对的后台系统放行的拦截
                 .excludePathPatterns("/")

+ 69 - 4
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/controller/FileController.java

@@ -1,18 +1,83 @@
 package com.example.opc_da.controller;
 
+import com.alibaba.fastjson.JSONObject;
 import com.example.opc_common.util.Result;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import com.example.opc_da.util.FileParam;
+import com.example.opc_da.util.XlsToPdfUtil;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.Date;
+
 @RestController
 @RequestMapping("file")
 public class FileController {
 
+    @Value("${file.path}")
+    private String filePath;
+
     @PostMapping("/uploadFiles")
     public Result uploadFiles(@RequestParam(value = "files", required = false) MultipartFile[] files) {
         return null;
     }
+
+    /**
+     * 文件转换为pdf,并下载
+     *
+     * @param file
+     * @param response
+     */
+    @RequestMapping(value = "/fileToPdfDownload", method = RequestMethod.POST)
+    public Result fileToPdfDownload(@RequestParam MultipartFile file, HttpServletResponse response) {
+        //将接受的文件转换为pdf
+        String orgFilename = file.getOriginalFilename();
+        String type = orgFilename.substring(orgFilename.lastIndexOf("."));
+        String fileName = (new Date()).getTime() + ((int) (Math.random() * 90000) + 10000) + type;
+        String newFilePath = filePath + fileName;
+        File newFile = new File(newFilePath);
+        try {
+            file.transferTo(newFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        String outPath = filePath + fileName.substring(0, fileName.lastIndexOf(".")) + ".pdf";
+        XlsToPdfUtil.excelToPDF(newFilePath, outPath, new FileParam());
+        newFile.delete();
+
+        String pdfFileName = orgFilename.substring(0, orgFilename.lastIndexOf("."))+ ".pdf";
+        JSONObject jsonObject=new JSONObject();
+        jsonObject.put("outPath",outPath);
+        jsonObject.put("pdfFileName",pdfFileName);
+        return Result.ok(jsonObject);
+    }
+
+    @RequestMapping(value = "/download", method = RequestMethod.GET)
+    public void download(String outPath, String pdfFileName, HttpServletResponse response) {
+        try {
+            // path是指欲下载的文件的路径。
+            File pdfFile = new File(outPath);
+            // 以流的形式下载文件。
+            InputStream fis = new BufferedInputStream(new FileInputStream(outPath));
+            byte[] buffer = new byte[fis.available()];
+            fis.read(buffer);
+            fis.close();
+            // 清空response
+            response.reset();
+            // 设置response的Header
+            response.setHeader("Content-Disposition", "attachment;filename=" + pdfFileName + ";" + "filename*=utf-8''" + pdfFileName);
+//            response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
+            response.addHeader("Content-Length", "" + pdfFile.length());
+            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
+            response.setContentType("application/x-www-form-urlencoded");
+            toClient.write(buffer);
+            toClient.flush();
+            toClient.close();
+            pdfFile.delete();
+        } catch (IOException ex) {
+            ex.printStackTrace();
+        }
+    }
 }

+ 121 - 0
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/util/FileParam.java

@@ -0,0 +1,121 @@
+package com.example.opc_da.util;
+
+import lombok.Data;
+
+@Data
+public class FileParam {
+    /**
+     * (print)
+     * 作业名称
+     */
+    private String jobName = "EI Auto Print Job";
+
+    /**
+     * (print)
+     * 打印机名称
+     */
+    private String printName = "";
+
+    /**
+     * (print)
+     * 打印方向  0 自动(停用) 1 横向 2 纵向
+     */
+    private Integer orientation = 1;
+
+    /**
+     * (print)
+     * 打印份数
+     */
+    private Integer copies = 1;
+
+    /**
+     * (jacob)
+     * 打印页面类型 1 A3  2 A4 ...
+     */
+    private Integer pageType=2;
+    /**
+     * (print/jacob)
+     * 打印区域
+     */
+    private Integer width = 210;
+    private Integer height = 297;
+    private Integer marginLeft = 10;
+    private Integer marginTop = 10;
+    private Integer marginRight = 10;
+    private Integer marginBottom = 10;
+
+    /**
+     * 未使用
+     * 纸张单位类型 1 毫米 2 英寸
+     */
+    private Integer unit = 1;
+
+    /**
+     * 未使用(print)
+     * 单双面 1 单面打印 2 双面打印,长边翻转 3 双面打印,短边翻转
+     */
+    private Integer sides = 1;
+
+    /**
+     * 未使用
+     * 颜色 1 黑白打印 2 彩打
+     */
+    private Integer chromaticity = 1;
+
+    /**
+     * (jacob)
+     * 缩放比例 0 自适应(停用)  x x%
+     * 打印缩放fitToPages=4时,scale参数有用
+     */
+    private Float scale = 100f;
+
+    /**
+     * (print)
+     * 页码范围类型 1 全部 2 部分页码
+     */
+    private Integer pageRange=1;
+
+
+    /**
+     * (print)
+     * 页码范围类型pageRange=2时,pageRangeStart参数有用
+     * 页码范围 开始页码 1 。。。
+     */
+    private Integer pageRangeStart=1;
+
+    /**
+     * (print)
+     * 页码范围类型pageRange=2时,pageRangeEnd参数有用
+     * pageRangeEnd > pageRangeStart时,取pageRangeStart~pageRangeEnd
+     * pageRangeEnd <= pageRangeStart时,取pageRangeStart时
+     * 页码范围 结束页码 1 。。。
+     */
+    private Integer pageRangeEnd=1;
+
+    /**
+     * 打印区域  1 整个工作表 2 选定区域
+     */
+    private Integer printArea=1;
+
+    /**
+     * 打印区域参数 A1:H6
+     * 打印区域printArea=2时,printAreaValue参数有用
+     */
+    private String printAreaValue="";
+
+    /**
+     * (jacob)
+     * 打印缩放  1 无打印缩放 2 将所有列打印在一页 3 将所有行打印在一页 4 自定义缩放
+     */
+    private Integer fitToPages = 2;
+
+    /**
+     * 毫米转像素
+     *  px = mm * 72 / 25.4
+     * @return int
+     */
+    public int mm2px(double value){
+        return (int)(value * 72 / 25.4);
+    }
+
+}

+ 137 - 0
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/util/PaperSize.java

@@ -0,0 +1,137 @@
+package com.example.opc_da.util;
+
+public enum PaperSize {
+    // value请查询https://learn.microsoft.com/zh-cn/office/vba/api/excel.xlpapersize
+    xlPaperA3(1, 8, "A3:297mm X 420mm", 297, 420),
+    xlPaperA4(2, 9, "A4:210mm X 297mm", 210, 297),
+    xlPaperA5(3, 11, "A5:148mm X 210mm", 148, 210),
+    xlPaperB5(4, 13, "B5:182mm X 257mm", 182, 257),
+    xlPaperDC5(5, 28, "Devolop C5:162mm X 229mm", 162, 229),
+    xlPaperDDL(6, 27, "Devolop DL:110mm X 220mm", 110, 220),
+    xlPaperDB5(7, 34, "Devolop B5:176mm X 250mm", 176, 250),
+    xlPaperDM(8, 37, "Devolop Monarch:3.875inch X 7.5inch", (int) (3.875 / 0.0394), (int) (7.5 / 0.0394)),
+    xlPaperD9(9, 19, "Devolop 9:3.875inch X 8.875inch", (int) (3.875 / 0.0394), (int) (8.875 / 0.0394)),
+    xlPaperD10(10, 20, "Devolop 10:4.125inch X 9.5inch", (int) (4.125 / 0.0394), (int) (9.5 / 0.0394)),
+    xlPaperLT(11, 1, "Letter:8.5inch X 11inch", (int) (8.5 / 0.0394), (int) (11 / 0.0394)),
+    xlPaperLG(12, 5, "Legal:8.5inch X 14inch", (int) (8.5 / 0.0394), (int) (14 / 0.0394));
+    private int key;
+    private int value;
+    private String name;
+    private int width;
+    private int height;
+
+    private PaperSize(int key, int value, String name, int width, int height) {
+        this.key = key;
+        this.value = value;
+        this.name = name;
+        this.width = width;
+        this.height = height;
+    }
+
+    public int getValue() {
+        return this.value;
+    }
+
+    public int getWidth() {
+        return this.width;
+    }
+
+    public int getHeight() {
+        return this.height;
+    }
+
+
+    public static PaperSize resultKey2Value(int key) {
+        if (PaperSize.xlPaperA3.compareKey(key)) {
+            return PaperSize.xlPaperA3;
+        }
+        if (PaperSize.xlPaperA4.compareKey(key)) {
+            return PaperSize.xlPaperA4;
+        }
+        if (PaperSize.xlPaperA5.compareKey(key)) {
+            return PaperSize.xlPaperA5;
+        }
+        if (PaperSize.xlPaperB5.compareKey(key)) {
+            return PaperSize.xlPaperB5;
+        }
+        if (PaperSize.xlPaperDC5.compareKey(key)) {
+            return PaperSize.xlPaperDC5;
+        }
+        if (PaperSize.xlPaperDDL.compareKey(key)) {
+            return PaperSize.xlPaperDDL;
+        }
+        if (PaperSize.xlPaperDB5.compareKey(key)) {
+            return PaperSize.xlPaperDB5;
+        }
+        if (PaperSize.xlPaperDM.compareKey(key)) {
+            return PaperSize.xlPaperDM;
+        }
+        if (PaperSize.xlPaperD9.compareKey(key)) {
+            return PaperSize.xlPaperD9;
+        }
+        if (PaperSize.xlPaperD10.compareKey(key)) {
+            return PaperSize.xlPaperD10;
+        }
+        if (PaperSize.xlPaperLG.compareKey(key)) {
+            return PaperSize.xlPaperLG;
+        }
+        if (PaperSize.xlPaperLT.compareKey(key)) {
+            return PaperSize.xlPaperLT;
+        }
+        return PaperSize.xlPaperA3;
+    }
+
+    public static PaperSize resultPaperSize2Value(int width, int height) {
+        if (PaperSize.xlPaperA3.comparePageSize(width, height)) {
+            return PaperSize.xlPaperA3;
+        }
+        if (PaperSize.xlPaperA4.comparePageSize(width, height)) {
+            return PaperSize.xlPaperA4;
+        }
+        if (PaperSize.xlPaperA5.comparePageSize(width, height)) {
+            return PaperSize.xlPaperA5;
+        }
+        if (PaperSize.xlPaperB5.comparePageSize(width, height)) {
+            return PaperSize.xlPaperB5;
+        }
+        if (PaperSize.xlPaperDC5.comparePageSize(width, height)) {
+            return PaperSize.xlPaperDC5;
+        }
+        if (PaperSize.xlPaperDDL.comparePageSize(width, height)) {
+            return PaperSize.xlPaperDDL;
+        }
+        if (PaperSize.xlPaperDB5.comparePageSize(width, height)) {
+            return PaperSize.xlPaperDB5;
+        }
+        if (PaperSize.xlPaperDM.comparePageSize(width, height)) {
+            return PaperSize.xlPaperDM;
+        }
+        if (PaperSize.xlPaperD9.comparePageSize(width, height)) {
+            return PaperSize.xlPaperD9;
+        }
+        if (PaperSize.xlPaperD10.comparePageSize(width, height)) {
+            return PaperSize.xlPaperD10;
+        }
+        if (PaperSize.xlPaperLG.comparePageSize(width, height)) {
+            return PaperSize.xlPaperLG;
+        }
+        if (PaperSize.xlPaperLT.comparePageSize(width, height)) {
+            return PaperSize.xlPaperLT;
+        }
+        return PaperSize.xlPaperA3;
+    }
+
+    private boolean compareKey(int key) {
+        if (this.width == key) {
+            return true;
+        }
+        return false;
+    }
+
+    private boolean comparePageSize(int width, int height) {
+        if (this.width == width && this.height == height) {
+            return true;
+        }
+        return false;
+    }
+}

+ 86 - 0
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/util/XlsToPdfUtil.java

@@ -0,0 +1,86 @@
+package com.example.opc_da.util;
+
+import com.aspose.cells.PageSetup;
+import com.aspose.cells.PdfSaveOptions;
+import com.aspose.cells.Workbook;
+import com.aspose.cells.Worksheet;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.common.PDRectangle;
+
+import java.io.File;
+
+@Slf4j
+public class XlsToPdfUtil {
+
+    public static String excelToPDF(String inputFilePath, String outputFilePath, FileParam fileParam) {
+        try {
+            Workbook workbook = new Workbook(inputFilePath);
+            PdfSaveOptions options = new PdfSaveOptions();
+
+            Worksheet worksheet = workbook.getWorksheets().get(0);
+            // 设置页面参数
+            PageSetup pageSetup = worksheet.getPageSetup();
+            //缩放比例
+            float scale = fileParam.getScale();
+            //打印方向 0 自动 1 横向 2 纵向
+            int orientation = fileParam.getOrientation();
+            // 打印缩放 1 无打印缩放 2 将所有列打印在一页 3 将所有行打印在一页 4 自定义缩放
+            int fitToPages = fileParam.getFitToPages();
+            PaperSize paperSize = PaperSize.resultPaperSize2Value(fileParam.getWidth(),fileParam.getHeight());
+            //页面大小  A3是8,A4是9,A5是11等等
+            pageSetup.setPaperSize(paperSize.getValue());
+            // 页边距
+            pageSetup.setLeftMargin(fileParam.getMarginLeft()/10d);
+            pageSetup.setRightMargin(fileParam.getMarginRight()/10d);
+            pageSetup.setTopMargin(1 + (fileParam.getMarginTop()/10d));
+            pageSetup.setBottomMargin(fileParam.getMarginBottom()/10d);
+            //打印方向 0 自动 1 横向 2 纵向
+            if(orientation == 1) {
+                //设置横向打印2还是纵向打印1
+                pageSetup.setOrientation(2);
+            }else if(orientation == 2) {
+                //设置横向打印2还是纵向打印1
+                pageSetup.setOrientation(1);
+            }
+            // 打印缩放 1 无打印缩放 2 将所有列打印在一页 3 将所有行打印在一页 4 自定义缩放
+            if(fitToPages == 1){
+                pageSetup.setFitToPagesTall(-1);
+                pageSetup.setFitToPagesWide(-1);
+            }else if(fitToPages == 2){
+                pageSetup.setFitToPagesTall(-1);
+                pageSetup.setFitToPagesWide(1);
+            }else if(fitToPages == 3){
+                pageSetup.setFitToPagesTall(1);
+                pageSetup.setFitToPagesWide(-1);
+            }else if(fitToPages == 4){
+                //设置缩放,值为100或false
+                pageSetup.setZoom((int)scale);
+            }
+            String path = outputFilePath.split("\\.")[0] + "_yl.pdf";
+            workbook.save(path, options);
+
+            PDDocument document = PDDocument.load(new File(path));
+
+            // 获取要裁剪的页面(这里以第一页为例)
+            for (PDPage page : document.getPages()) {
+                // 创建新的裁剪框
+                PDRectangle mediaBox = page.getMediaBox();
+                PDRectangle cropBox = new PDRectangle(0, 0, mediaBox.getWidth(), mediaBox.getHeight() - fileParam.mm2px(10));
+
+                // 设置页面的裁剪框
+                page.setCropBox(cropBox);
+            }
+
+            // 保存裁剪后的 PDF
+            document.save(outputFilePath);
+            document.close();
+            new File(path).delete();
+            return outputFilePath;
+        } catch (Exception e) {
+            log.error("EXCEL转换PDF失败", e);
+            return null;
+        }
+    }
+}