package com.emr;
import java.awt.Color;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Image;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfGState;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;

public class test {
    public static void main(String[] args) throws DocumentException, IOException {
        // 要输出的pdf文件
        //BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("E:/abc.pdf")));
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        // 将pdf文件先加水印然后输出
        //setWatermark(bos, "D:\\出差准备文档\\pdf\\ceshi - 副本.pdf", format.format(cal.getTime()) + "  下载使用人：" + "测试user", 16);
        addWaterMark("D:\\出差准备文档\\pdf\\ceshi - 副本.pdf","E:/cav.pdf",2,0.2f,"我很好好好好阿豪",200,200,
                null,50,55,"D:\\出差准备文档\\pdf\\9d17f073c61adfaf79438401bc6ffb7.jpg",100,100,150,200);
    }


    /**
     * 添加图片和文字水印
     *
     * @param srcFile 待加水印文件
     * @param destFile 加水印后存放地址
     * @param upOrUnder 加水印后存放地址
     * @param transparent 加水印透明度
     * @param text 加水印的文本内容
     * @param textWidth 文字横坐标
     * @param textHeight 文字纵坐标
     * @param textColor 文字颜色
     * @param textSize 文字字号
     * @param textRotation 文字旋转角度
     * @param imgFile 加水印图片文件
     * @param imgWidth 图片宽
     * @param imgHeight 图片高
     * @param imgX 图片横坐标
     * @param imgY 图片纵坐标
     * @throws IOException
     * @throws DocumentException
     */
    public static void addWaterMark(String srcFile, String destFile,int upOrUnder,float transparent, String text, int textWidth, int textHeight,
                                    String textColor,int textSize,int textRotation,
                                    String imgFile, int imgWidth, int imgHeight,int imgX,int imgY) throws IOException, DocumentException {
        // 待加水印的文件
        PdfReader reader = new PdfReader(srcFile);
        // 加完水印的文件
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destFile));
        // 设置字体
        BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
        // PDF总页数
        int total = reader.getNumberOfPages() + 1;
        // 循环对每页插入水印
        PdfContentByte content;
        PdfGState gs = new PdfGState();
        for (int i = 1; i < total; i++) {
            //upOrUnder = 1为在文本之上
            if(upOrUnder == 1){
                // 水印在之前文本之上
                content = stamper.getOverContent(i);
            }else{
                // 水印在文本之下
                content = stamper.getUnderContent(i);
            }
            //设置填充字体不透明度为0.2f
            gs.setFillOpacity(transparent);
            content.setGState(gs);
            // 图片水印
            if (imgFile != null) {
                Image image = null;
                if (imgFile != null) {
                    image = Image.getInstance(imgFile);
                    //位置
                    image.setAbsolutePosition(imgX, imgY);
                    // 设置图片的显示大小
                    image.scaleToFit(imgWidth, imgHeight);
                }
                content.addImage(image);
            }
            // 文字水印
            if (text != null) {
                content.beginText();
                // 设置颜色 默认为蓝色
                content.setColorFill(Color.BLUE);
                // 设置字体及字号
                content.setFontAndSize(font, textSize);
                // 设置起始位置
                content.setTextMatrix(textWidth, textHeight);
                // 中间水印
                content.showTextAligned(Element.ALIGN_LEFT, text, textWidth, textHeight, textRotation);
                // 底部水印
                /*for (int k = 0; k < text.length(); k++) {
                    // 距离底边的距离
                    content.setTextRise(10);
                    // 将char转成字符串
                    content.showText(String.valueOf(text.charAt(k)));
                }*/
                content.endText();
            }
        }
        stamper.close();
    }
    /**
     *
     * @param
     * @param input
     *            原PDF位置
     * @param waterMarkName
     *            页脚添加水印
     * @param permission
     *            权限码
     * @throws DocumentException
     * @throws IOException
     */
    public static void setWatermark(BufferedOutputStream bos, String input, String waterMarkName, int permission)
            throws DocumentException, IOException {
        PdfReader reader = new PdfReader(input);
        PdfStamper stamper = new PdfStamper(reader, bos);
        int total = reader.getNumberOfPages() + 1;
        PdfContentByte content;
        BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
        PdfGState gs = new PdfGState();
        for (int i = 1; i < total; i++) {
            // 在内容上方加水印
            //content = stamper.getOverContent(i);
            //在内容下方加水印
            content = stamper.getUnderContent(i);
            //设置填充字体不透明度为0.2f
            gs.setFillOpacity(0.2f);
            content.setGState(gs);
            //设置水印开始
            content.beginText();
            //设置文字水印字体颜色
            content.setColorFill(new Color(255,0,0));
            //设置文字水印字体大小
            content.setFontAndSize(base, 50);
            //设置字体的输出位置
            content.setTextMatrix(170, 300);
            //设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
            content.showTextAligned(Element.ALIGN_CENTER, "公司内部文件，请注意保密！", 300, 350, 55);
            //设置图片水印
            Image image = Image.getInstance("D:\\出差准备文档\\pdf\\9d17f073c61adfaf79438401bc6ffb7.jpg");
            //图片输出的文职
            image.setAbsolutePosition(200, 206); // set the first background
            // image of the absolute
            //设置图片宽高
            image.scaleToFit(100, 100);
            content.addImage(image);
            content.endText();

        }
        System.out.println("完成");
        stamper.close();
    }
}