package com.mortals.xhx.common.utils;

import com.documents4j.api.DocumentType;
import com.documents4j.api.IConverter;
import com.documents4j.job.LocalConverter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;

import java.io.*;

import static com.mortals.framework.service.IMessageProduceService.log;

/**
 * @author ZYW
 * @date 2024-10-30 15:04
 */

public class PdfUtil {

    /**
     * windows系统word转pdf
     * @param wordPath 转换后的pdf文件
     * @param pdfPath word源文件
     */
    public static void winWordToPdf( String wordPath, String pdfPath) {
        File inputWord = new File(wordPath);
        File outputFile = new File(pdfPath);
        try  {
            InputStream docxInputStream = new FileInputStream(inputWord);
            OutputStream outputStream = new FileOutputStream(outputFile);
            IConverter converter = LocalConverter.builder().build();
            converter.convert(docxInputStream).as(DocumentType.DOCX).to(outputStream).as(DocumentType.PDF).execute();
            outputStream.close();
            log.info("word转换成PDF成功！");
        } catch (Exception e) {
            log.error("word转pdf失败",e);
            e.printStackTrace();
        }
    }

    /**
     * linux系统word转pdf
     　　　* 使用LibreOffice转换。系统需安装LibreOffice
     　　　* 转换命令 libreoffice --invisible --convert-to pdf --outdir output_dir source_path
     　　　* 转换后的pdf文件名使用的是源文件的名称，所以如果要指定输出文件名称，就需把源文件名称改成想要输出的名称
     * @param wordPath 转换后的pdf文件夹
     * @param pdfPath word源文件
     */
    public static void linuxWordToPdf(String wordPath, String pdfPath) {

        // 构建LibreOffice的命令行工具命令
        String command = "libreoffice --invisible --convert-to pdf --outdir " + pdfPath + " " + wordPath;
        log.info(command);
        // 执行转换命令
        try {
            executeLinuxCmd(command);
            log.info("word转换成PDF成功！");
        } catch (Exception e) {
            log.error("linuxWordToPdf linux环境word转换为pdf时出现异常：", e);
        }
    }

    /**
     * 执行命令行
     *
     * @param cmd 命令行
     * @return
     */
    private static boolean executeLinuxCmd(String cmd)  {
        try {
            Process process = Runtime.getRuntime().exec(cmd);
            process.waitFor();
        } catch (InterruptedException e) {
            log.error("executeLinuxCmd 执行Linux命令异常：", e);
            Thread.currentThread().interrupt();
            return false;
        } catch (IOException e) {
            log.error("获取系统命令执行环境异常", e);
        }
        return true;
    }

    /**
     * word转pdf
     * @param imgPath  图片路径
     * @param pdfPath  pdf路径
     */
    public static void imgToPdf(String imgPath, String pdfPath){
        try {

            // 创建PDF文档
            PDDocument document = new PDDocument();

            // 添加一个页面
            PDPage page = new PDPage();
            document.addPage(page);

            // 加载图片并添加到PDF页面上
            PDImageXObject pdImage = PDImageXObject.createFromFile(imgPath, document);
            PDPageContentStream contentStream = new PDPageContentStream(document, page);
            contentStream.drawImage(pdImage, 0, 0, pdImage.getWidth(), pdImage.getHeight());
            contentStream.close();

            // 保存PDF文档
            document.save(pdfPath);
            document.close();

            log.info("图片转换成PDF成功！");
        } catch (IOException e) {
            log.error("转换过程中发生错误：" + e.getMessage());
        }

    }
}
