package com.test.springboot.pdfutils;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.test.springboot.commons.NumUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;

/**
 *PDF生成器,依赖包
<!-- 生成pdf要用的jar -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itextpdf</artifactId>
    <version>5.5.10</version>
</dependency>
<!-- pdf输出中文要用的jar -->
<dependency>
    <groupId>com.itextpdf</groupId>
    <artifactId>itext-asian</artifactId>
    <version>5.2.0</version>
</dependency>
<!-- 设置pdf的打开密码要用的jar -->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.54</version>
</dependency>
**/
@Slf4j
public class PDFGenerator {
    private static BaseFont baseFont;
    private static Font font;
    private static final String tempFilePath = "E:/java-project/code-case/test.pdf";
    private static FileOutputStream originFos;

    static {

    }

    public static void main(String[] args) {
        try {
            createDoc();
        } catch (Exception e) {
            e.printStackTrace();
            log.info("创建doc是失败,===>{}", e.getMessage());
        }
    }

    private static void createDoc() throws DocumentException, IOException {

        PdfWriter writer;
        Document doc = new Document(PageSize.A4);
        try {
            originFos = new FileOutputStream(tempFilePath);
            writer = PdfWriter.getInstance(doc, originFos);
        } catch (FileNotFoundException e) {
            log.info("生成文件路径不存在异常信息:FileNotFoundException, ===>{}", e.getMessage());
            e.printStackTrace();
            throw new FileNotFoundException(e.getLocalizedMessage());
        } catch (DocumentException e) {
            log.info("文档异常信息:DocumentException, ===>{}", e.getMessage());
            e.printStackTrace();
            throw new DocumentException(e.getMessage());
        }
        doc.open();
        initContent(doc);
        try {
            addImgWaterMark(doc);
        } catch (IOException e) {
            log.info("添加水印IO异常信息:IOException, ===>{}", e.getMessage());
            e.printStackTrace();
            throw new IOException(e.getMessage());
        }

        //给文件添加水印时必须关闭文件
        addTable(writer);
        doc.close();
        originFos.close();  //关闭流,不然删除不了文件
        addTextWaterMark(doc, tempFilePath);
        delFile(tempFilePath);
        writer.close();
    }

    private static void addTable(PdfWriter writer) {

        PdfContentByte content = writer.getDirectContent();
        PdfPTable table = new PdfPTable(4);
        table.setTotalWidth(500f);


        PdfPCell cell1 = new PdfPCell();
        cell1.setColspan(4);
        cell1.setBackgroundColor(BaseColor.CYAN);
        cell1.setFixedHeight(30);
        Paragraph p1 = new Paragraph("设置表头", new Font(baseFont, 16, Font.BOLD));
        p1.setAlignment(1);
        cell1.addElement(p1);

        PdfPCell cell2 = new PdfPCell();
        PdfPCell cell3 = new PdfPCell();
        PdfPCell cell4 = new PdfPCell();
        PdfPCell cell5 = new PdfPCell();


        cell2.addElement(new Paragraph("详细信息", new Font(baseFont, 14, Font.NORMAL)));

        cell3.addElement(new Paragraph("详细信息", new Font(baseFont, 14, Font.NORMAL)));

        cell4.addElement(new Paragraph("详细信息", new Font(baseFont, 14, Font.NORMAL)));

        cell5.addElement(new Paragraph("详细信息", new Font(baseFont, 14, Font.NORMAL)));

        table.addCell(cell1);
        table.addCell(cell2);
        table.addCell(cell3);
        table.addCell(cell4);
        table.addCell(cell5);
        table.writeSelectedRows(0, -1, 30, 265, content);
    }
    private static void addTextWaterMark(Document doc, String originName) throws IOException, DocumentException {
        //指定最终文件名
        String fileName = originName.substring(0, originName.lastIndexOf("/") + 1) + NumUtil.getDateNum() + ".pdf";
        FileOutputStream fos;
        PdfReader reader;
        PdfStamper stamper;
        try {
            fos = new FileOutputStream(fileName);
        } catch (FileNotFoundException e) {
            log.info("添加文字水印生成新文件不存在异常:===>{}", e.getMessage());
            e.printStackTrace();
            delFile(tempFilePath);
            throw new FileNotFoundException(e.getMessage());
        }
        try {
            reader = new PdfReader(originName);
            stamper = new PdfStamper(reader, fos);
        } catch (IOException e) {
            log.info("添加文字水印原文件异常:===>{}", e.getMessage());
            e.printStackTrace();
            delFile(tempFilePath);
            throw new IOException(e.getMessage());
        } catch (DocumentException e) {
            log.info("PdfStamper异常:===>{}", e.getMessage());
            e.printStackTrace();
            delFile(tempFilePath);
            throw new DocumentException(e.getMessage());
        }
        PdfContentByte content = stamper.getUnderContent(1);
        content.beginText();
        content.setColorFill(new BaseColor(211, 211, 211));
        content.setFontAndSize(baseFont, 38);
        content.setTextMatrix(1, 1);// 文字水印 起始位置
        content.showTextAligned(Element.ALIGN_CENTER, "绝密文件, 请勿泄露", doc.getPageSize().getWidth() / 2, doc.getPageSize().getHeight() / 2, 45);
        content.endText();
        stamper.close();
        reader.close();
    }

    private static void addImgWaterMark(Document doc) throws DocumentException, IOException {
        final float docWidth = doc.getPageSize().getWidth();
        final float docHeight = doc.getPageSize().getHeight();
        URL url = PDFGenerator.class.getClassLoader().getResource("img/cherry.png");
        String imgPath = url.getFile();
        Image img;
        try {
            img = Image.getInstance(imgPath);
        } catch (BadElementException e) {
            log.info("水印图片元素异常信息提示:BadElementException,===>{}", e.getMessage());
            e.printStackTrace();
            delFile(tempFilePath);
            throw new BadElementException(e.getMessage());
        } catch (IOException e) {
            log.info("水印图片IO异常信息提示:IOException,===>{}", e.getMessage());
            e.printStackTrace();
            delFile(tempFilePath);
            throw new IOException(e.getMessage());
        }
        img.setAbsolutePosition(docWidth - img.getPlainWidth(), docHeight - img.getPlainHeight());
        doc.add(img);
    }

    private static void initContent(Document document) throws DocumentException {
        Paragraph pa = new Paragraph("热爱劳动,从我做起", new Font(baseFont, 14, Font.BOLD));
        pa.setAlignment(1);
        pa.setSpacingAfter(15);
        document.add(pa);
        Paragraph p1 = new Paragraph("大家好!今天我演讲的题目是《热爱劳动,从我做起》。", font);
        p1.setFirstLineIndent(25);
        document.add(p1);
        p1 = new Paragraph("民生在勤,勤则不匮”,劳动是财富的源泉,也是幸福的源泉。宋范成大《四时田园杂兴》诗云“" +
                "昼出耘田夜绩麻,村庄儿女各当家。童孙未解供耕织,也傍桑阴学种瓜。”与毛岸英的谈话中也曾说过:“你在苏联的大学毕业" +
                "了,这很好,但学的是书本上的知识,可以说这只是知识的一半。你还需要上一个大学,就是劳动大学。” 可见,不管是古代还是现在," +
                "不管是诗人还是政治家,都很重视劳动。", font);
        p1.setFirstLineIndent(25);
        document.add(p1);
        p1 = new Paragraph("“夙兴夜寐,洒扫庭内”,热爱劳动是中华民族的优秀传统,绵延至今。作为学生,劳动可能并不直接创造" +
                "财富,但可以培养优良品质。可是现实生活中,也有一些同学不理解劳动,不愿意劳动。有的说:“我们学习这么忙,劳动太占时间了!”" +
                "真是这样么?", font);
        p1.setFirstLineIndent(25);
        document.add(p1);
        p1 = new Paragraph("我们学习的是科学文化知识,而劳动也是科学文化的源泉。古有鲁班造锯,现有杂交水稻。现代科技,再" +
                "也不是“四体不勤,五谷不分”的人闭门造车的产物,你看袁隆平,为了研究杂交水稻,吃住在田间地头,才解决了几亿人的温饱问题,现在又" +
                "研究出了海水稻,离开一线劳动,这些都是不可想象的。学习怎么能离得开劳动?劳动是最好的学校!", font);
        p1.setFirstLineIndent(25);
        document.add(p1);
        p1 = new Paragraph("有的说:“科技进步这么快,劳动的事,以后可以交给人工智能啊!”那现在呢?人工智能就不需要人工操作" +
                "了吗?可见,这种论调也是站不住脚的。霍金不能说话,要靠一个电子设备发声,但也离不开两个指头的敲击。人工智能是机器的高级阶段,但" +
                "制造工具的是人,最终操作工具的也是人。随着科技的进步,人类出现了两极分化的现象——制造工具的越来越聪明,但使用工具的越来越“愚蠢”。" +
                "后者往往容易被工具“反制”,而一旦离开了所谓的高级工具,就会成为一个 “废人”,一定要警惕!", font);
        p1.setFirstLineIndent(25);
        document.add(p1);
        p1 = new Paragraph("也有的说:“劳动这么苦,这么累,干吗非得自己干?花点钱让别人去做好了!”这也是为自己的懒惰找借口!别" +
                "人能干,你为什么就不能干?今天你坐办公室,明天你就保证不去送外卖?不要歧视劳动,更不要歧视劳动者。劳动者最光荣!人类的进化,固然是出" +
                "于大脑的发达,但也有赖于肢体的完善。“头脑简单,四肢发达”固然偏颇,但“头脑发达,四肢萎缩”也不可取,那跟一台座机有何分别?我想没有人会" +
                "要那样的人生,你看看那么多体育明星和他们的粉丝就知道了。", font);
        p1.setFirstLineIndent(25);
        document.add(p1);
        p1 = new Paragraph("当然,我们身边也还有着一些不尊重劳动的现象。既不尊重劳动者,也不尊重别人的劳动成果,特别是破坏公共卫生。" +
                "这是认识问题,更是品质问题。我们要切实改变观念,从我做起,从现在做起,做一个爱劳动的人,为社会创造财富,为自己赢得幸福!", font);
        p1.setFirstLineIndent(25);
        document.add(p1);
    }

    private static void delFile(String path) {
        File file = new File(path);
        boolean f;
        if(file.exists()) {
            f = file.delete();
            System.out.println(f);
        }
    }
}