package com.jwipc.finance.util;

import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

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

public class PdfUtilPageEvent extends PdfPageEventHelper {
    /**
     * 页眉
     */
	  private Image logoImage;  
	  private String fixedNumber;  
	  private String imgFilePath;
	  
	  public PdfUtilPageEvent(Image logoImage, String fixedNumber) {
	        this.logoImage = logoImage;  
	        this.fixedNumber = fixedNumber;  
	  }  
 
    /**
     * 文档字体大小，页脚页眉最好和文本大小一致
     */
    public int presentFontSize = 10;
 
 
    /**
     * 文档页面大小，最好前面传入，否则默认为A4纸张
     */
    public Rectangle pageSize = PageSize.A4;
 
 
    // 模板
    public PdfTemplate total;
 
 
    // 基础字体对象
    public BaseFont bf = null;
 
 
    // 利用基础字体生成的字体对象，一般用于生成中文文字
    public Font fontDetail = null;
 
 
 
 
    /**
     *
     * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
     *
     */
    public PdfUtilPageEvent() {
 
 
    }
 

    public PdfUtilPageEvent(String imgFilePath) {
        this.imgFilePath = imgFilePath;
    }
 
 

 
    public void setPresentFontSize(int presentFontSize) {
        this.presentFontSize = presentFontSize;
    }
 
 
 
 
    /**
     *
     * TODO 文档打开时创建模板
     *
     * @see PdfPageEventHelper#onOpenDocument(PdfWriter,
     * Document)
     */
    public void onOpenDocument(PdfWriter writer, Document document) {
        total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
    }
 
 
    /**
     *
     * TODO 关闭每页的时候，写入页眉，写入'第几页共'这几个字。
     *
     * @see PdfPageEventHelper#onEndPage(PdfWriter,
     * Document)
     */
    public void onEndPage(PdfWriter writer, Document document) {
        this.addPage(writer, document);
        try {
			this.addPageHeader(writer, document);
		} catch (Exception e) {
			e.printStackTrace();
			//生成页脚失败
		}
    }
 
 
    //加分页
    public void addPage(PdfWriter writer, Document document){
        //设置分页页眉页脚字体
        try {
            if (bf == null) {
                String fonts =  "/static/font/msyh.ttc,1";
                bf = BaseFont.createFont(fonts, BaseFont.IDENTITY_H, false);
            }
            if (fontDetail == null) {
                fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 2.写入前半部分的 第 X页/共
        int pageS = writer.getPageNumber();
       // String foot1 = "第 " + pageS + " 页 /共";
        String foot1 = pageS + " /";
        Phrase footer = new Phrase(foot1, fontDetail);
        // 3.计算前半部分的foot1的长度，后面好定位最后一部分的'Y页'这俩字的x轴坐标，字体长度也要计算进去 = len
        float len = bf.getWidthPoint(foot1, presentFontSize);
        // 4.拿到当前的PdfContentByte
        PdfContentByte cb = writer.getDirectContent();
        // 5.写入页脚1，x轴就是(右margin+左margin + right() -left()- len)/2.0F
        // 再给偏移20F适合人类视觉感受，否则肉眼看上去就太偏左了
        // ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了；注意Y轴是从下往上累加的，最上方的Top值是大于Bottom好几百开外的。
        ColumnText
                .showTextAligned(
                        cb,
                        Element.ALIGN_CENTER,
                        footer,
                        (document.rightMargin() + document.right()
                                + document.leftMargin() - document.left() - len) / 2.0F ,
                        document.bottom() - 20, 0);
 
 
        // 6.写入页脚2的模板（就是页脚的Y页这俩字）添加到文档中，计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F +
        // len ， y 轴和之前的保持一致，底边界-20
        cb.addTemplate(total, (document.rightMargin() + document.right()
                        + document.leftMargin() - document.left()) / 2.0F ,
                document.bottom() - 20); // 调节模版显示的位置
 
 
    }
 
    
    /**
     * 页眉
     * @throws IOException 
     * @throws MalformedURLException 
     * @throws DocumentException 
     */
    private void addPageHeader(PdfWriter writer, Document docment) throws MalformedURLException, IOException, DocumentException{

    	PdfContentByte canvas = writer.getDirectContent();
        Rectangle pageSize = docment.getPageSize();
        float x = pageSize.getLeft(docment.leftMargin());//36
        float y = pageSize.getTop(docment.topMargin());//806 772 772
        float headerHeight = 70; // 页眉高度，可根据需要调整
        logoImage = Image.getInstance(imgFilePath);
        // 添加图片到左侧
        if (logoImage != null) {
            logoImage.scaleToFit(50, headerHeight);
            logoImage.setAbsolutePosition(45.0f,805.9f);
            canvas.addImage(logoImage);
        }
        String fonts =  "/static/font/msyh.ttc,1";
    	Font font1 = null;
    	try {
    	    BaseFont baseFont = BaseFont.createFont(fonts, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    	    font1 = new Font(baseFont, 12); // 12是字体大小，可以根据实际需要调整
    	    // 然后将字体应用到你的 PDF 文档或者其他需要的地方
    	} catch (DocumentException | IOException e) {
    	    e.printStackTrace();
    	}

        // 添加固定编号到右侧
        fixedNumber= "JWIPC Technology Co.,Ltd.";
        if (fixedNumber != null) {
            Chunk chunk = new Chunk(fixedNumber);
            chunk.setFont(font1);
            Phrase phrase = new Phrase(chunk);
            ColumnText.showTextAligned(canvas, Element.ALIGN_RIGHT, phrase, pageSize.getRight() - 40, y+10, 0);

        }
        float leftWidth = 35.0f; // 左边宽度
        float rightWidth = 35.0f; // 右边宽度
        float startX = pageSize.getLeft() + leftWidth; // 计算起点X坐标
        float endX = pageSize.getRight() - rightWidth; // 计算终点X坐标
        canvas.setLineWidth(1);
        canvas.setColorStroke(BaseColor.BLACK);
        canvas.moveTo(startX, y - headerHeight + 74);
        canvas.lineTo(endX, y - headerHeight + 74);
        canvas.stroke();
    }

    //加水印
    public void addWatermark(PdfWriter writer) {
        // 水印图片
        BaseFont font = null;
        try {
            font = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        PdfGState gs = new PdfGState();
        //添加透明度
        gs.setFillOpacity(0.4f);
        PdfContentByte content = writer.getDirectContentUnder();
        content.beginText();
        //水印颜色
        content.setColorFill(BaseColor.DARK_GRAY);
        content.setGState(gs);
        //水印字体样式和大小
        content.setFontAndSize(font, 35);
        //插入水印 循环每页插入的条数
        for (int j = 0; j < 3; j++) {
            content.showTextAligned(Element.ALIGN_CENTER, "智微智能购销合同", 300, 200 * (j + 1), 30);
        }
        content.endText();
    }
 
 
    /**
     *
     * TODO 关闭文档时，替换模板，完成整个页眉页脚组件
     *
     * @see PdfPageEventHelper#onCloseDocument(PdfWriter,
     * Document)
     */
    public void onCloseDocument(PdfWriter writer, Document document) {
        String fonts =  "/static/font/msyh.ttc,1";
        try {
            BaseFont bfNew = BaseFont.createFont(fonts, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
            // 7.最后一步了，就是关闭文档的时候，将模板替换成实际的 Y 值,至此，page x of y 制作完毕，完美兼容各种文档size。
            total.beginText();
            total.setFontAndSize(bfNew, presentFontSize);// 生成的模版的字体、颜色
            String foot2 = " " + (writer.getPageNumber()) ; //页脚内容拼接 如 第1页/共2页 + " 页"
            total.showText(foot2);// 模版显示的内容
            total.endText();
            total.closePath();
        } catch (DocumentException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }


    public static void main(String[] args) {
        try {
            // 创建文档
            Document document = new Document();

            // 创建 PdfWriter 实例，设置输出文件
            PdfWriter.getInstance(document, new FileOutputStream("D:/1.pdf"));

            // 打开文档
            document.open();
            String fontPath =  "/static/font/msyh.ttc,1";
            Font myFont = FontFactory.getFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12);

            // 创建一个 5 列的表格
            PdfPTable table = new PdfPTable(5);

            // 设置表格宽度占满整个页面
            table.setWidthPercentage(100);

            // 为表格添加标题行
            table.addCell(new Phrase("项目", myFont));
            table.addCell(new Phrase("数量", myFont));
            table.addCell(new Phrase("单价", myFont));
            table.addCell(new Phrase("金额", myFont));
            table.addCell(new Phrase("备注", myFont));

            // 添加其他数据行
            table.addCell(new Phrase("产品1", myFont));
            table.addCell("5");
            table.addCell("100");
            table.addCell("500");
            table.addCell(new Phrase("无", myFont));

            table.addCell(new Phrase("产品2", myFont));
            table.addCell("10");
            table.addCell("200");
            table.addCell("2000");
            table.addCell(new Phrase("无", myFont));

            // 添加最后一行合计，金额大写占 3 列，金额小写占 1 列
            table.addCell(new Phrase("合计", myFont));

            // 合计金额大写占3列
            PdfPCell cell1 = new PdfPCell(new Phrase("大写金额：壹仟伍佰元整", myFont));
            cell1.setColspan(3);  // 合并 3 列
            cell1.setHorizontalAlignment(PdfPCell.ALIGN_LEFT);  // 设置左对齐
            table.addCell(cell1);

            // 金额小写占1列
            PdfPCell cell2 = new PdfPCell(new Phrase("小写金额：1500.00",myFont));
            cell2.setColspan(1);  // 合并 1 列
            cell2.setHorizontalAlignment(PdfPCell.ALIGN_LEFT);  // 设置左对齐
            table.addCell(cell2);

            // 添加表格到文档
            document.add(table);

            // 关闭文档
            document.close();

            System.out.println("PDF 文件创建成功！");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

        public static void main1(String[] args) {
            // 创建文档对象
            Document document = new Document();

            try {
                // 创建 PdfWriter 实例，指定输出路径和文档对象
                PdfWriter.getInstance(document, new FileOutputStream("D:/no_border_table_with_spacing.pdf"));

                // 打开文档以便添加内容
                document.open();

                // 设置微软雅黑字体路径（请根据您计算机的字体文件路径调整）
                String fontPath =  "/static/font/msyh.ttc,1";
                Font myFont = FontFactory.getFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, 12);

                // 创建一个表格，参数为列数
                int columns = 2;
                PdfPTable table = new PdfPTable(columns);

                // 设置表格没有边框
                table.getDefaultCell().setBorder(0);

                // 第一行
                PdfPCell cell1 = new PdfPCell(new Phrase("甲方", myFont));
                cell1.setBorder(0);  // 不显示边框
                table.addCell(cell1);

                PdfPCell cell2 = new PdfPCell(new Phrase("乙方", myFont));
                cell2.setBorder(0);  // 不显示边框
                table.addCell(cell2);

                // 插入一个空行，增加间距
                PdfPCell emptyCell1 = new PdfPCell(new Phrase(" "));
                emptyCell1.setBorder(0);  // 不显示边框
                emptyCell1.setFixedHeight(15f);  // 设置高度以增加间距
                table.addCell(emptyCell1);

                PdfPCell emptyCell2 = new PdfPCell(new Phrase(" "));
                emptyCell2.setBorder(0);  // 不显示边框
                emptyCell2.setFixedHeight(15f);  // 设置高度以增加间距
                table.addCell(emptyCell2);

                // 第二行
                PdfPCell cell3 = new PdfPCell(new Phrase("代表签字：", myFont));
                cell3.setBorder(0);  // 不显示边框
                table.addCell(cell3);

                PdfPCell cell4 = new PdfPCell(new Phrase("代表签字：", myFont));
                cell4.setBorder(0);  // 不显示边框
                table.addCell(cell4);

                // 插入一个空行，增加间距
                PdfPCell emptyCell3 = new PdfPCell(new Phrase(" "));
                emptyCell3.setBorder(0);  // 不显示边框
                emptyCell3.setFixedHeight(15f);  // 设置高度以增加间距
                table.addCell(emptyCell3);

                PdfPCell emptyCell4 = new PdfPCell(new Phrase(" "));
                emptyCell4.setBorder(0);  // 不显示边框
                emptyCell4.setFixedHeight(15f);  // 设置高度以增加间距
                table.addCell(emptyCell4);

                // 第三行
                PdfPCell cell5 = new PdfPCell(new Phrase("日期：", myFont));
                cell5.setBorder(0);  // 不显示边框
                table.addCell(cell5);

                PdfPCell cell6 = new PdfPCell(new Phrase("日期：", myFont));
                cell6.setBorder(0);  // 不显示边框
                table.addCell(cell6);

                // 将表格添加到文档中
                document.add(table);

                // 关闭文档
                document.close();

                System.out.println("PDF 文件创建成功，已输出到 D:/no_border_table_with_spacing.pdf");
            } catch (DocumentException  | IOException e) {
                e.printStackTrace();
            }
        }


}