package cn.hmsoft.helper.pdf;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

import com.itextpdf.barcodes.BarcodeQRCode;
import com.itextpdf.barcodes.qrcode.EncodeHintType;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.EncryptionConstants;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.WriterProperties;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;

import cn.hmsoft.application.SpringHelper;
import cn.hmsoft.frame.exception.BusinessException;
import cn.hmsoft.helper.StringHelper;


/************************
 * 
 * @note 通用pdf辅助类
 * @author revisit@126.com
 * @Company: www.hmsoft.cn
 * @create 2017年11月19日 下午10:32:11
 * @version 4.0.0
 */
public final class ItextPdfHelper {

	/*********************
	 * 默认页面72像素/英寸
	 */
	public static int ItextPagePix = 72;
	// 一英寸等于25.4毫米
	public final static double InchMillimeter = 25.4;

	/********************
	 * 获取pdf默认字体
	 */
	public static PdfFont getPdfFont() {
		try {
			return PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",
					false);
		} catch (Exception e) {
			return null;
		}
	}

	/**********************
	 * 获取宋体字体，如无法获取，获取默认字体
	 */
	public static PdfFont getPdfFontSTSong() {
		try {
			return PdfFontFactory.createFont(
					SpringHelper.WebServletContext.getRealPath("/") + "fonts"
							+ File.separator + "STSONG.TTF",
					PdfEncodings.IDENTITY_H, false);
		} catch (Exception e) {
			e.printStackTrace();
			return getPdfFont();
		}
	}

	/************************
	 * 创建pdf临时文件
	 * 
	 * @param file 目标文件
	 * @param pageSize 纸张大小
	 * @param passwd 加密密钥
	 * @return
	 */
	public static Document createPdf(File file, PageSize pageSize, String passwd) {
		PdfDocument pdfDoc = null;
		Document doc = null;
		try {

			if (StringHelper.isNotEmpty(passwd))
				pdfDoc = new PdfDocument(
						new PdfWriter(
								file.getPath(),
								new WriterProperties().setStandardEncryption(
										null,
										passwd.getBytes(),
										EncryptionConstants.ALLOW_PRINTING,
										EncryptionConstants.ENCRYPTION_AES_128
												| EncryptionConstants.DO_NOT_ENCRYPT_METADATA)));
			else
				pdfDoc = new PdfDocument(new PdfWriter(file.getPath()));
			doc = new Document(pdfDoc, pageSize);
			// doc.setFont(getPdfFont());
			return doc;
		} catch (Exception e) {
			throw new BusinessException("无法创建临时文件，请联系系统管理员！");
		}
	}

	/**********************
	 * 创建A4，自带加密
	 */
	public static Document createPdf(File file, String passwd) {
		return createPdf(file, PageSize.A4, passwd);
	}

	/**********************
	 * 创建A4，自带加密
	 */
	public static Document createPdf(File file, PageSize pageSize) {
		return createPdf(file, pageSize, null);
	}

	public static Document createPdf(File file) {
		return createPdf(file, PageSize.A4, null);
	}

	/******************
	 * 关闭文件并保存指定
	 * 
	 * @param doc
	 * @param file
	 */
	public static void closePdf(Document doc) {
		if (doc != null) {
			try {

				doc.flush();
				doc.close();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			try {
				doc.getPdfDocument().close();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			doc = null;

		}
	}

	/****************
	 * 根据毫米返回itext的像素
	 */
	public static int getPixByMillimeter(int millimeter) {
		return (int) Math.round((double) millimeter / InchMillimeter
				* ItextPagePix);
	}

	/****************
	 * 根据itext像素返回的毫米
	 */
	public static int getMillimeterByPix(int pix) {
		return (int) Math.round((double) pix / ItextPagePix * InchMillimeter);
	}

	/*********************
	 * 获取纸张大小
	 * 
	 * @param width 宽度 单位毫米
	 * @param heigth 高度 单位毫米 72像素/英寸=28.346像素/厘米 A4:595, 842 A3:842, 1190
	 */
	public static PageSize getPageSizeByMillimeter(int width, int heigth) {
		return new PageSize(getPixByMillimeter(width),
				getPixByMillimeter(heigth));

	}

	/*************************
	 * 生成二维码
	 */
	public static Image createQrCode(String value, Document doc) {
		// 二维码
		return createQrCode(value, doc, 48);
	}

	/*************************
	 * 生成二维码
	 */
	public static Image createQrCode(String value, Document doc, float width) {

		return createQrCode(value, doc, width, width);
	}

	/*************************
	 * 生成二维码
	 */
	public static Image createQrCode(String value, Document doc, float width,
			float height) {
		// 二维码
		Map<EncodeHintType, Object> hints = new HashMap<>();
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
		// Create the QR-code
		BarcodeQRCode qrCode = new BarcodeQRCode(value, hints);
		Image qrCodeAsImage = new Image(qrCode.createFormXObject(doc
				.getPdfDocument()));
		qrCodeAsImage.scaleAbsolute(width, height);
		return qrCodeAsImage;
	}

	/*********************
	 * 调整图片大小
	 * 
	 * @param image
	 */
	public static void scaleImage(Image image, float width, float height) {
		// 调整大小，
		float img_h = image.getImageScaledHeight(), img_w = image
				.getImageScaledWidth();
		// 计算他们的比率
		float img_wp = width / img_w, img_hp = height / img_h;

		if (img_wp > img_hp) {
			// 宽度太宽
			height = img_h * img_wp;
		} else {
			// 高度太高
			width = img_w * img_hp;
		}
		image.scaleAbsolute(width, height);
	}

	/***********************
	 * 判断是否可以转换为图片
	 */
	public static boolean isImage(String file) {
		try {
			new Image(ImageDataFactory.create(file));
		} catch (Exception e) {
			return false;
		}
		return true;
	}

}
