using System;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Net;
using System.Text;

namespace Edu.Common.Plugin
{
    /// <summary>
    /// 公共帮助类
    /// </summary>
    public class ToPdfHelper
    {
        /// <summary>
        /// HtmlWJtoPdf
        /// </summary>
        /// <param name="path"></param>
        /// <param name="url"></param>
        /// <param name="noMargin"></param>
        /// <param name="wkhtmltopdfConfig">工具路径</param>
        /// <param name="headerHtmlPath">HeaderHTML路劲</param>
        /// <param name="footerHtmlPath">HeaderHTML路劲</param>
        /// <returns></returns>
        public bool HtmlWJtoPdf(string path, string url, int noMargin = 0, string wkhtmltopdfConfig = "", string headerHtmlPath = "", string footerHtmlPath = "")
        {
            try
            {
                HtmlConvertToPdf(url, path, noMargin, wkhtmltopdfConfig, headerHtmlPath, footerHtmlPath);
                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }

        /// <summary>
        /// HTML转换为PDF
        /// </summary>
        /// <param name="htmlPath">可以是本地路径,也可以是网络地址</param>
        /// <param name="savePath">PDF文件保存的路径</param>
        /// <param name="noMargin">PDF文件保存的路径</param>
        /// <param name="wkhtmltopdfConfig">工具路径</param>
        /// <param name="headerHtmlPath">headerHtml路劲</param>
        /// <param name="footerHtmlPath">footerHtml路劲</param>
        /// <returns></returns>
        public bool HtmlConvertToPdf(string htmlPath, string savePath, int noMargin, string wkhtmltopdfConfig = "", string headerHtmlPath = "", string footerHtmlPath = "")
        {
            bool flag = false;
            CheckFilePath(savePath);
            //这个路径为程序集的目录,因为我把应用程序 wkhtmltopdf.exe 放在了程序集同一个目录下
            string exePath = string.Empty;
            if (wkhtmltopdfConfig == "")
            {
                exePath = Config.wkhtmltopdfConfig + "wkhtmltopdf.exe ";
            }
            else
            {
                exePath = wkhtmltopdfConfig + "wkhtmltopdf.exe ";
            }
            if (!File.Exists(exePath))
            {
                throw new Exception("No application wkhtmltopdf.exe was found.");
            }
            try
            {
                ProcessStartInfo processStartInfo = new ProcessStartInfo
                {
                    FileName = exePath,
                    WorkingDirectory = Path.GetDirectoryName(exePath),
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    RedirectStandardInput = true,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    Arguments = GetArguments(htmlPath, savePath, noMargin, headerHtmlPath, footerHtmlPath)
                };

                Process process = new Process
                {
                    StartInfo = processStartInfo
                };
                process.Start();
                process.WaitForExit(6000);

                //用于查看是否返回错误信息
                StreamReader srone = process.StandardError;
                string ss1 = srone.ReadToEnd();
                srone.Close();
                srone.Dispose();

                process.Close();
                process.Dispose();

                flag = true;
            }
            catch (Exception ex)
            {
                LogHelper.Write(ex, "HtmlConvertToPdf");
                flag = false;
            }
            return flag;
        }

        /// <summary>
        /// 获取命令行参数
        /// </summary>
        /// <param name="htmlPath"></param>
        /// <param name="savePath"></param>
        /// <param name="noMargin"></param>
        /// <param name="headerHtmlPath">headerHTML路劲</param>
        /// <param name="footerHtmlPath">footerHTML路劲</param>
        /// <returns></returns>
        private string GetArguments(string htmlPath, string savePath, int noMargin, string headerHtmlPath = "", string footerHtmlPath = "")
        {
            if (string.IsNullOrEmpty(htmlPath))
            {
                throw new Exception("HTML local path or network address can not be empty.");
            }

            if (string.IsNullOrEmpty(savePath))
            {
                throw new Exception("The path saved by the PDF document can not be empty.");
            }

            StringBuilder stringBuilder = new StringBuilder();
            //stringBuilder.Append(" --page-height 100 ");        //页面高度100mm
            //stringBuilder.Append(" --page-width 100 ");         //页面宽度100mm
            //stringBuilder.Append(" --header-center 我是页眉 ");  //设置居中显示页眉
            //stringBuilder.Append(" --header-line ");         //页眉和内容之间显示一条直线
            if (headerHtmlPath != null && !string.IsNullOrEmpty(headerHtmlPath))
            {
                //stringBuilder.Append(" --disable-smart-shrinking ");//禁止智能缩放
                stringBuilder.Append(" --header-html " + headerHtmlPath + " ");
            }
            if (footerHtmlPath != null && !string.IsNullOrEmpty(footerHtmlPath))
            {
                stringBuilder.Append(" --footer-html " + footerHtmlPath + " ");
                stringBuilder.Append(" --margin-left 5mm ");
                stringBuilder.Append(" --margin-right 5mm ");
            }
            //stringBuilder.Append(" --footer-left \"" + DateTime.Now.ToString("yyyy/MM/dd") + "\" ");    //设置居中显示页脚
            //stringBuilder.Append(" --footer-right \"[page]/[topage]\" ");    //设置居中显示页脚
            stringBuilder.Append(" --footer-font-size 7 ");
            stringBuilder.Append(" --footer-spacing 5 ");
            if (noMargin == 1)
            {
                stringBuilder.Append(" --margin-left 0");
                stringBuilder.Append(" --margin-right 0");
                stringBuilder.Append(" --margin-top 0");
                stringBuilder.Append(" --margin-bottom 0");
            }

            //stringBuilder.Append(" --footer-line ");       //页脚和内容之间显示一条直线
            stringBuilder.Append(" " + htmlPath + " ");       //本地 HTML 的文件路径或网页 HTML 的URL地址
            stringBuilder.Append(" " + savePath + " ");       //生成的 PDF 文档的保存路径

            return stringBuilder.ToString();
        }

        /// <summary>
        /// 验证保存路径
        /// </summary>
        /// <param name="savePath"></param>
        private void CheckFilePath(string savePath)
        {
            string ext = string.Empty;
            string path = string.Empty;
            string fileName = string.Empty;

            ext = Path.GetExtension(savePath);
            if (string.IsNullOrEmpty(ext) || ext.ToLower() != ".pdf")
            {
                throw new Exception("Extension error:This method is used to generate PDF files.");
            }

            fileName = Path.GetFileName(savePath);
            if (string.IsNullOrEmpty(fileName))
            {
                throw new Exception("File name is empty.");
            }

            try
            {
                path = savePath.Substring(0, savePath.IndexOf(fileName));
                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                }
            }
            catch
            {
                throw new Exception("The file path does not exist.");
            }
        }
    }
}