package com.mortals.xhx.common.utils;

/**
 * @author: zxfei
 * @date: 2021/10/14 15:44
 * @description:
 **/

import com.aspose.words.Document;
import com.aspose.words.ImageSaveOptions;
import com.aspose.words.SaveFormat;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.util.DateUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class WordUtil {

    private Configuration configure = null;

    public Configuration getConfigure() {
        return configure;
    }

    public void setConfigure(Configuration configure) {
        this.configure = configure;
    }

    public WordUtil() {
        configure = new Configuration();
        configure.setDefaultEncoding("utf-8");
    }

    /**
     * 根据word模板生成word文件
     *
     * @param dataMap     ： 数据
     * @param outFilePath ： 输出word文件地址
     * @return
     */
    public boolean createWord(Map<String, Object> dataMap, String inputFilePath, String outFilePath) {
        boolean flag = false;

        try {
            // 指定路径方式（根据某个类的相对路径指定）
            configure.setClassForTemplateLoading(this.getClass(), "/test");

            // 以utf-8的编码读取ftl文件
            Template template = configure.getTemplate(inputFilePath, "utf-8");
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outFilePath)), "utf-8"),
                    10240);
            template.process(dataMap, out);

            out.close();

            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return flag;
    }

    /**
     * 将图片转换成二进制字符串
     *
     * @param imgFilePath ： 图片路径
     * @return
     */
    public String getImageStr(String imgFilePath) {

        InputStream in = null;
        byte[] data = null;
        try {
            in = new FileInputStream(imgFilePath);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);

    }

    public static String convertWordToJPEG(String inputFile, String jpegPath) {
        try {
            System.out.println(String.format("文件转换开始：%s", DateUtils.getCurrStrDateTime()));
            // 转换开始前时间
            long old = System.currentTimeMillis();
            // 新建的PDF文件路径
            File file = new File(jpegPath);
            //FileOutputStream os = new FileOutputStream(file);
            // 要转换的word文档的路径
            Document doc = new Document(inputFile);

            // 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换
            //doc.save(os, SaveFormat.JPEG);



            ImageSaveOptions options = new ImageSaveOptions(SaveFormat.JPEG);
            options.setPrettyFormat(true);
            options.setUseAntiAliasing(true);
            options.setUseHighQualityRendering(true);
            int pageCount = doc.getPageCount();

            List<BufferedImage> imageList = new ArrayList<BufferedImage>();
            for (int i = 0; i < pageCount; i++) {
                OutputStream output = new ByteArrayOutputStream();
                options.setPageIndex(i);
                doc.save(output, options);
                ImageInputStream imageInputStream = ImageIO.createImageInputStream(parse(output));
                imageList.add(ImageIO.read(imageInputStream));
            }

            BufferedImage mergeImage = mergeImage(false, imageList);

            ImageIO.write(mergeImage, "png", file);
            // 转换结束后时间
            long now = System.currentTimeMillis();
            //os.close();
            System.out.println("文件转换结束,共耗时：" + ((now - old) / 1000.0) + "秒");
            return jpegPath;
        } catch (Exception e) {
            e.printStackTrace();
            throw new AppException(String.format("文件转换异常!", e.getMessage()));
        }
    }


    /**
     * 合并任数量的图片成一张图片
     *
     * @param isHorizontal true代表水平合并，fasle代表垂直合并
     * @param imgs         待合并的图片数组
     * @return
     * @throws IOException
     */
    public static BufferedImage mergeImage(boolean isHorizontal, List<BufferedImage> imgs) throws IOException {
        // 生成新图片
        BufferedImage destImage = null;
        // 计算新图片的长和高
        int allw = 0, allh = 0, allwMax = 0, allhMax = 0;
        // 获取总长、总宽、最长、最宽
        for (int i = 0; i < imgs.size(); i++) {
            BufferedImage img = imgs.get(i);
            allw += img.getWidth();

            if (imgs.size() != i + 1) {
                allh += img.getHeight() + 5;
            } else {
                allh += img.getHeight();
            }


            if (img.getWidth() > allwMax) {
                allwMax = img.getWidth();
            }
            if (img.getHeight() > allhMax) {
                allhMax = img.getHeight();
            }
        }
        // 创建新图片
        if (isHorizontal) {
            destImage = new BufferedImage(allw, allhMax, BufferedImage.TYPE_INT_RGB);
        } else {
            destImage = new BufferedImage(allwMax, allh, BufferedImage.TYPE_INT_RGB);
        }
        Graphics2D g2 = (Graphics2D) destImage.getGraphics();
        g2.setBackground(Color.LIGHT_GRAY);
        g2.clearRect(0, 0, allw, allh);
        g2.setPaint(Color.RED);

        // 合并所有子图片到新图片
        int wx = 0, wy = 0;
        for (int i = 0; i < imgs.size(); i++) {
            BufferedImage img = imgs.get(i);
            int w1 = img.getWidth();
            int h1 = img.getHeight();
            // 从图片中读取RGB
            int[] ImageArrayOne = new int[w1 * h1];
            // 逐行扫描图像中各个像素的RGB到数组中
            ImageArrayOne = img.getRGB(0, 0, w1, h1, ImageArrayOne, 0, w1);
            if (isHorizontal) {
                // 水平方向合并
                // 设置上半部分或左半部分的RGB
                destImage.setRGB(wx, 0, w1, h1, ImageArrayOne, 0, w1);
            } else {
                // 垂直方向合并
                // 设置上半部分或左半部分的RGB
                destImage.setRGB(0, wy, w1, h1, ImageArrayOne, 0, w1);
            }
            wx += w1;
            wy += h1 + 5;
        }


        return destImage;
    }


    public static ByteArrayInputStream parse(OutputStream out) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        baos = (ByteArrayOutputStream) out;
        ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
        return swapStream;

    }

    public static void main(String[] args) {
        String docPath = "E:\\pic\\doc\\附件1-四川省危险废物经营许可证申请表（补办）空白.docx";

        String pdfPath = "E:\\pic\\pdf\\附件1-四川省危险废物经营许可证申请表（补办）空白.jpg";

        WordUtil.convertWordToJPEG(docPath, pdfPath);
    }


}
