package com.boco.nbd.wios.flow.util;


import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.aspose.words.*;
import com.boco.nbd.cams.core.constant.CamsConstant;
import com.boco.nbd.wios.flow.entity.pdf.BlockPairBo;
import com.boco.nbd.wios.flow.entity.pdf.SurveyDataBo;
import com.boco.nbd.wios.manage.contants.WiosConstant;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.util.BytePictureUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Date;


/**
 * @author miaoguoqing
 * @version V1.0
 * @ClassName PdfUtils
 * @description 生成pdf 工具类
 * @email miaoguoqing@boco.com.cn
 * @date 2022/10/25
 */
@Slf4j
public class PdfUtil {

    /**
     * 用于判断导出的word是否转pdf
     */
    public static int judgment = 0;

    public void pdfUtils() {
        judgment = 0;
    }

    private static boolean getLicense() {
        boolean result = false;

        try {
            InputStream is = PdfUtil.class.getClassLoader().getResourceAsStream("License.xml");
            License aposeLic = new License();
            aposeLic.setLicense(is);
            result = true;
        } catch (Exception var3) {
            var3.printStackTrace();
        }

        return result;
    }

    /**
     * 根据模板生成word
     *
     * @param path     模板的路径
     * @param fileName 生成word文件的文件名
     */
    public void getWord(String path, BlockPairBo blockPairBo, String fileName, HttpServletResponse response) throws Exception {
        ClassPathResource resource = new ClassPathResource(path);
        InputStream is = resource.getInputStream();
        String saveRoute = path.substring(0, path.lastIndexOf("/"));
        XWPFTemplate xwpfTemplate = XWPFTemplate.compile(is);
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        if (judgment == 0) {
            fileName = java.net.URLDecoder.decode(fileName, CamsConstant.UTF_8);
            xwpfTemplate.render(blockPairBo).write(output);
            String pdf = fileName.substring(0, fileName.lastIndexOf(".")) + DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN) + ".pdf";
            ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
            doc2pdf(input, saveRoute + "/" + pdf);
            File file = new File(saveRoute + "/" + pdf);
            //判断文件大小,并压缩
            if (file.length() > WiosConstant.FILE_SIZE) {
                file.delete();
                for (SurveyDataBo bo : blockPairBo.getExperiences()) {
                    compressPictures(bo);
                }
                getWord(path, blockPairBo, fileName, response);
                return;
            }
            try {
                log.info("========================{}下载开始========================", pdf);
                is = new BufferedInputStream(new FileInputStream(saveRoute + "/" + pdf));
                byte[] buffer = new byte[is.available()];
                is.read(buffer);
                response.reset();
                // 设置response的Header
                response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), CamsConstant.UTF_8));
                response.addHeader("Content-Length", "" + file.length());
                response.setContentType("application/octet-stream");
                response.setCharacterEncoding("utf-8");
                OutputStream os = new BufferedOutputStream(response.getOutputStream());
                os.write(buffer);
                os.flush();
                log.info("========================{}下载结束========================", pdf);
                //删除缓存文件
                file.delete();
            } catch (IOException ex) {
                log.error(pdf + "下载异常:", ex);
                ex.printStackTrace();
            }
        } else {
            fileName = java.net.URLDecoder.decode(fileName, CamsConstant.UTF_8);
            output = new ByteArrayOutputStream();
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            xwpfTemplate.write(output);
            judgment = 0;
        }
        this.close(output);
        this.close(is);
    }

    /**
     * 关闭输入流
     *
     * @param is
     */
    public void close(InputStream is) {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭输出流
     *
     * @param os
     */
    public void close(OutputStream os) {
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 修改图片大小
     *
     * @param
     */
    public SurveyDataBo compressPictures(SurveyDataBo bo) {
        //原始图片的长度和宽度
        int height = bo.getPicture().getHeight();
        int width = bo.getPicture().getWidth();
        //通过比例压缩
        float scale = 0.8f;
        //压缩之后的长度和宽度
        int doWithHeight = (int) (scale * height);
        int dowithWidth = (int) (scale * width);
        bo.setPicture(new PictureRenderData(dowithWidth, doWithHeight, ".png", BytePictureUtils.getUrlBufferedImage(bo.getUrlPath())));
        return bo;
    }

    /**
     * word 转 pdf
     *
     * @param wordPath word 的路径 word 的路径
     * @param pdfPath  pdf 的路径
     */
    public static void doc2pdf(String wordPath, String pdfPath) {
        if (getLicense()) {
            try {
                long old = System.currentTimeMillis();
                File file = new File(pdfPath);
                FileOutputStream os = new FileOutputStream(file);
                Document doc = new Document(wordPath);

                doc.save(os, 40);
                long now = System.currentTimeMillis();
                os.close();
                log.info("共耗时:" + (double) (now - old) / 1000.0D + "秒");
            } catch (Exception var9) {
                var9.printStackTrace();
            }

        }
    }

    public static void doc2pdf(InputStream is, String pdfPath) {
        if (getLicense()) {
            try {
                long old = System.currentTimeMillis();
                File file = new File(pdfPath);
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                FileOutputStream os = new FileOutputStream(pdfPath);
                Document doc = new Document(is);
                PdfSaveOptions options = new PdfSaveOptions();
                // 文字和图像压缩
                options.setExportDocumentStructure(true);
                options.setTextCompression(PdfTextCompression.FLATE);
                options.setImageCompression(PdfImageCompression.AUTO);
                // 接收修订
                doc.acceptAllRevisions();
                doc.save(os, options);
                long now = System.currentTimeMillis();
                os.close();
                log.info("共耗时:" + (double) (now - old) / 1000.0D + "秒");
            } catch (Exception var9) {
                var9.printStackTrace();
            }
        }
    }
}