package com.tofly.common.core.util.io;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;


/**
 * 生成PDF文件
 */
public class PdfUtil {
    
    
    private static final String SEPARATOR=File.separator;

    /**
     *
     * @param fileName
     *            生成pdf文件
     * @param imagesPath
     *            需要转换的图片路径的数组
     */
    public static void imagesToPdf(String fileName, String imagesPath) {
        Document document = null;
        PdfCopy copy = null;
        try {
            fileName = fileName+".pdf";
            File file = new File(fileName);
            // 第一步：创建一个document对象。
            if(file.exists()){
                document = new Document(new PdfReader(fileName).getPageSize(1));
            }else{
                document = new Document(PageSize.A4, 20, 20, 20, 20); //new一个pdf文档
                // 第二步：
                // 创建一个PdfWriter实例，
                PdfWriter.getInstance(document, new FileOutputStream(file));
            }
            // 第三步：打开文档。
            document.open();
            // 第四步：在文档中增加图片。
            File files = new File(imagesPath);
            String[] images = files.list();

            PdfPTable table = new PdfPTable(2);
            handlerPdfCell(images,table,imagesPath);
            document.add(table);

            document.newPage();
            // 第五步：关闭文档。
            document.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if(document!=null){
                document.close();
            }
        }
    }

    /**
     *
     * @param fileName
     *            生成pdf文件
     * @param imagesPath
     *            需要转换的图片路径的数组
     */
    public static void imagesToPdfWithFristPic(String fileName,byte[] fristbytes, String imagesPath) {
        Document document = null;
        PdfCopy copy = null;
        try {
            fileName = fileName+".pdf";
            File file = new File(fileName);
            // 第一步：创建一个document对象。
            document = new Document(PageSize.A4, 20, 20, 20, 20); //new一个pdf文档
            // 第二步：
            // 创建一个PdfWriter实例，
            PdfWriter.getInstance(document, new FileOutputStream(file));
            // 第三步：打开文档。
            document.open();
            // 第四步：在文档中增加图片。
            //先加入第一张截图
            Image imgfrist = Image.getInstance(fristbytes); // 控制图片大小
            //imgfrist.scaleToFit(document.getPageSize());
//            float x = document.getPageSize().getLeft();
//            float y = document.getPageSize().getBottom();
            imgfrist.scaleToFit(document.getPageSize().getWidth()-40, document.getPageSize().getHeight()-40);
            //imgfrist.setAbsolutePosition(x, y);
            document.add(imgfrist);
            document.newPage();

            File files = new File(imagesPath);
            String[] images = files.list();
            PdfPTable table = new PdfPTable(2);
            handlerPdfCell(images,table,imagesPath);
            document.add(table);
            document.newPage();
            // 第五步：关闭文档。
            document.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if(document!=null){
                document.close();
            }
        }
    }


    private static  void handlerPdfCell(String[] images,PdfPTable table, String imagesPath) throws IOException, BadElementException {

        try{
            Arrays.sort(images,(f1,f2)->Integer.parseInt(f1.substring(0,f1.lastIndexOf(".")))-Integer.parseInt(f2.substring(0,f2.lastIndexOf("."))));
        }catch (Exception e){

        }
        int len = images.length;
        int num=0;
        for (int i = 0; i < len; i++)
        {
            if (images[i].toLowerCase().endsWith(".bmp")
                    || images[i].toLowerCase().endsWith(".jpg")
                    || images[i].toLowerCase().endsWith(".jpeg")
                    || images[i].toLowerCase().endsWith(".gif")
                    || images[i].toLowerCase().endsWith(".png")) {

                String temp = imagesPath + SEPARATOR + images[i];
                Image img = Image.getInstance(temp);
                PdfPCell cell = new PdfPCell();
                cell.addElement(img);
                if(num%2==1){
                    img.setAlignment(Image.RIGHT);
                }
                cell.setPadding(25f);
                cell.setRowspan(2);
                cell.setBorder(0);
                table.addCell(cell);
                table.setSplitLate(false);
                table.setSplitRows(false);
                num++;
            }
        }
        if(num%2==1){
            PdfPCell cell = new PdfPCell();
            Phrase phrase=new Phrase("");
            cell.addElement(phrase);
            cell.setPadding(25f);
            cell.setRowspan(2);
            cell.setBorder(0);
            table.addCell(cell);
            table.setSplitLate(false);
            table.setSplitRows(false);
        }
    }

    public static void imagesToPdf(String fileName,String filepath, byte[] bytes){
        try{
            fileName = filepath+SEPARATOR+fileName+".pdf";
            File pdffile = new File(fileName);
            // 第一步：创建一个document对象。
            Document document = new Document(PageSize.A4, 20, 20, 20, 20); //new一个pdf文档
            // 第二步：
            // 创建一个PdfWriter实例，

            PdfWriter.getInstance(document, new FileOutputStream(pdffile));

            // 第三步：打开文档。
            document.open();

            Image img = Image.getInstance(bytes); // 控制图片大小
            document.add(img);

            document.newPage();
            // 第五步：关闭文档。
            document.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public static void deleteFiles(String filePath){
        File file=new File(filePath);
        String[] images = file.list();
        if(images!=null){
            for(String img:images){
                if (img.toLowerCase().endsWith(".bmp")
                        || img.toLowerCase().endsWith(".jpg")
                        || img.toLowerCase().endsWith(".jpeg")
                        || img.toLowerCase().endsWith(".gif")
                        || img.toLowerCase().endsWith(".png")) {
                    String temp = filePath + SEPARATOR + img;
                    File imgfile = new File(temp);
                    imgfile.deleteOnExit();
                    if(imgfile.exists()){
                        imgfile.delete();
                    }
                }
            }
        }
        file.delete();
    }


    public static void mergePDF(String file1,String file2,String outfile){
        String sep = File.separator;
        Document document = null;
        PdfCopy copy = null;
        PdfReader reader = null;
        try {
            //验证 合并后的文件是否存在若 不存在则新建文件
            File outFile=new File(outfile);
            if(outFile.exists()){
                outFile.createNewFile();
            }
            document = new Document(new PdfReader(file1).getPageSize(1));
            copy = new PdfCopy(document, new FileOutputStream(outfile));
            document.open();
            //合并pdf文件
            reader = new PdfReader(file2);
            int numberOfPages = reader.getNumberOfPages();
            for (int j = 1; j <= numberOfPages; j++) {
                document.newPage();
                PdfImportedPage page = copy.getImportedPage(reader, j);
                copy.addPage(page);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (document != null){
                document.close();
            }
            if (reader != null){
                reader.close();
            }
            if (copy != null){
                copy.close();
            }
        }
    }


    public static void mergePDF(String outputPath, String outputFileName)  throws Exception{
        String sep = File.separator;
        Document document = null;
        PdfCopy copy = null;
        PdfReader reader = null;
        try {
            //首先验证输出文件是否存在，若不存在创建文件
            String outFilePath=outputPath + sep +outputFileName;
            File fileDir = new File(outputPath);
            if (!fileDir.exists()) {
                fileDir.mkdirs();
            }

            //验证 合并后的文件是否存在若 不存在则新建文件
            File outFile=new File(outFilePath);
            if(!outFile.exists()){
                outFile.createNewFile();
            }
            String[] fs = fileDir.list();
            List<String> files = Arrays.stream(fs).filter(s -> s.endsWith(".pdf")).collect(Collectors.toList());
            if(files.size()==0){
                return;
            }
            if(files.size()==1){
                outFile=new File(files.get(0));
                return;
            }
            document = new Document(new PdfReader(files.get(0)).getPageSize(1));
            copy = new PdfCopy(document, new FileOutputStream(outFilePath));
            document.open();
            //循环导入合并pdf文件
            for (String s:files) {
                reader = new PdfReader(s);
                int numberOfPages = reader.getNumberOfPages();
                for (int j = 1; j <= numberOfPages; j++) {
                    document.newPage();
                    PdfImportedPage page = copy.getImportedPage(reader, j);
                    copy.addPage(page);
                }
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (document != null){
                document.close();
            }
            if (reader != null){
                reader.close();
            }
            if (copy != null){
                copy.close();
            }
        }
    }


    public static void main(String[] args) throws Exception {
        String name = "ttttttttt";
        String imagesPath = "D:\\Users\\Administrator\\IdeaProjects\\MyQrqd\\out";
        imagesToPdf(name, imagesPath);
    }


}