public abstract void AddPicture(CRect rect, string[] sParams, string sTimeStamp, 
     double fLenRatio, double fWidRatio, string sDisplay,
     string sUserID);
 public abstract void AddPicture(CRect rect, string[] sParams, string sTimeStamp,
                                 double fLenRatio, double fWidRatio, string sDisplay,
                                 string sUserID);
 /// <summary>
 /// 插入图片到WORD打印模板中
 /// </summary>
 /// <param name="rect">待插入图片设置的区域大小</param>
 /// <param name="sParams">待写入参数</param>
 /// <param name="sTimeStamp">生成图片时写入的时间戳</param>
 /// <param name="fLenRatio">图片长比例</param>
 /// <param name="fWidRatio">图片宽比例</param>
 public override void AddPicture(CRect rect, string[] sParams, string sTimeStamp,
     double fLenRatio, double fWidRatio, string sDisplay,
     string sUserID)
 {
     KeyPosition kp = new KeyPosition();
     for (int idx = 0; idx < m_arKeyPosition.Length; idx++)
     {
         if ((ArrayList)m_arKeyPosition.GetValue(idx) != null)
         {
             kp = GetPositionByKey(sParams[0], (ArrayList)m_arKeyPosition.GetValue(idx));
             if (kp.RowIndex != 0)
             {
                 switch (sParams[1].ToLower())
                 {
                     case "down":
                         InsertPicture(m_doc.Tables[kp.TblIndex].Rows[kp.RowIndex + 1].Cells[kp.ColIndex].Range,
                                       rect, sTimeStamp, fLenRatio, fWidRatio, sDisplay, sUserID);
                         return;
                     case "right":
                         InsertPicture(m_doc.Tables[kp.TblIndex].Rows[kp.RowIndex].Cells[kp.ColIndex + 1].Range,
                                       rect, sTimeStamp, fLenRatio, fWidRatio, sDisplay, sUserID);
                         return;
                     case "downs":
                         string[] arrStamp = sTimeStamp.Split(new char[]{'\n'}, StringSplitOptions.RemoveEmptyEntries);
                         string[] arrsUserID = sUserID.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
                         for (int i = 1; i <= m_doc.Tables[kp.TblIndex].Rows.Count; i++)
                         {
                             sTimeStamp = arrStamp[i-1]; sUserID = arrsUserID[i-1];
                             InsertPicture(m_doc.Tables[kp.TblIndex].Rows[kp.RowIndex + i].Cells[kp.ColIndex].Range,
                                           rect, sTimeStamp, fLenRatio, fWidRatio, sDisplay, sUserID);
                         }
                         break;
                 }
             }
         }
     }
 }
        /// <summary>
        /// 将生成的图片插入到range描述的WORD文档位置
        /// </summary>
        /// <param name="range">WORD文档位置</param>
        /// <param name="rect">待插入图片设置的区域大小</param>
        /// <param name="sTimeStamp">生成图片时写入的时间戳</param>
        /// <param name="fLenRatio">图片长比例</param>
        /// <param name="fWidRatio">图片宽比例</param>
        private void InsertPicture(Range range, CRect rect, string sTimeStamp, 
            double fLenRatio, double fWidRatio, string sDisplay,
            string sUserID)
        {
            int iCur = 0;
            string[] Stamps = null;
            if (sTimeStamp.Contains("\n"))
            {
                Stamps = sTimeStamp.Split(new char[]{'\n'}, StringSplitOptions.RemoveEmptyEntries);
            }
            object Link2File = false;
            object SaveWithDoc = true;

            object Left = null;
            object Top = null;
            object Width = null;
            object Height = null;

            Left = rect.Left;
            Top = rect.Top;
            // 长宽比例若无效则从配置中(Width Height)取得对应长宽值,否则更具长宽比例计算长宽值
            if ((fLenRatio >= -double.Epsilon && fLenRatio <= double.Epsilon) ||
                (fWidRatio >= -double.Epsilon && fWidRatio <= double.Epsilon))
            {

                Width = rect.Width;
                Height = rect.Height;
            }
            else
            {
                // 配置高度无效则根据长宽比例计算处高度
                if (Height == null || rect.Height == 0)
                {
                    Width = rect.Width;
                    Height =(fWidRatio / fLenRatio) * rect.Width;
                }
                // 配置宽度无效则根据高宽比例计算处长度
                if (Width == null || rect.Width == 0)
                {
                    Width = (fLenRatio / fWidRatio) * rect.Height;
                    Height = rect.Height;
                }
            }

            for (int i = 1; i <= range.Paragraphs.Count; i++)
            {
                try
                {
                    string sName = HandleString(range.Paragraphs[i].Range.Text).Trim();
                    if (!string.IsNullOrEmpty(sUserID))
                    {
                        string sdbName = OAUser.GetUserName(sUserID);
                        if (sName != sdbName)
                        {
                            range.Paragraphs[i].Range.Font.Color = WdColor.wdColorWhite;
                            continue;
                        }
                        else
                        {
                            sName = sdbName;
                        }
                    }
                    string sFilePath = HttpContext.Current.Server.MapPath(@"~\template\Singer\" + sName + ".png");
                    if (!File.Exists(sFilePath))
                    {
                        if (Stamps == null)
                        {
                            sFilePath = GenSingerPic(sName, sFilePath, sTimeStamp, sDisplay);
                        }
                        else
                        {
                            if (Stamps.Length > iCur)
                                sFilePath = GenSingerPic(sName, sFilePath, Stamps[iCur], sDisplay);
                        }
                    }

                    if (File.Exists(sFilePath))
                    {
                        object objRange = range.Paragraphs[i].Range;

                        //int iCount = 0;
                        //while (range.Paragraphs[1].Range.Text != "\r\a")
                        //{
                        //    range.Paragraphs[i].Range.Font.Color = WdColor.wdColorWhite;
                        //    //if (iCount++ >= range.Paragraphs.Count) break;
                        //}

                        m_doc.Shapes.AddPicture(sFilePath,
                                                ref Link2File,
                                                ref SaveWithDoc,
                                                ref Left, ref Top,
                                                ref Width, ref Height,
                                                ref objRange);
                        File.Delete(sFilePath);
                        iCur++;
                    }
                    range.Paragraphs[i].Range.Font.Color = WdColor.wdColorWhite;
                }
                catch {
                    range.Paragraphs[i].Range.Font.Color = WdColor.wdColorWhite;
                    continue;
                }
            }
        }
        public void BatchAddPicture(string sProcess, string sTemplate, EntityBase entity)
        {
            if (!ChkSingerFolder()) return;
            XmlDocument doc = new XmlDocument();
            if (sProcess.Equals("程序文件")){
                doc.Load(HttpContext.Current.Server.MapPath(@"~\template\SingerCfgProcess.xml"));
            } else {
                doc.Load(HttpContext.Current.Server.MapPath(@"~\template\SingerCfg.xml"));
            }

            #region 处理签名图片缩放比例
            /**********************处理签名图片缩放比例 START******************************/
            XmlNode rootNode = doc.SelectSingleNode("/Signer");
            double fLenRatio = 0.0;
            double fWidRatio = 0.0;
            if (rootNode.Attributes.Count != 0)
            {
                string sRatio = rootNode.Attributes["Ratio"].Value;
                string[] arrRatio = sRatio.Split(':');

                if (arrRatio != null && arrRatio.Length == 2)
                {
                    if (!Double.TryParse(arrRatio[0], out fLenRatio))
                    {
                        fLenRatio = 0;
                    }
                    if (!Double.TryParse(arrRatio[1], out fWidRatio))
                    {
                        fWidRatio = 0;
                    }
                }
            }
            /**********************处理签名图片缩放比例 END*********************************/
            #endregion

            //XmlNode sNode = doc.SelectSingleNode("/Signer/Process[@Name='" + sProcess + "']/Template[@Name='" + sTemplate + "']");
            //sNode.AppendChild(
            XmlNodeList nodes = doc.SelectNodes("/Signer/Process[@Name='" + sProcess + "']/Template[@Name='" + sTemplate + "']");
            if (nodes == null) return;

            DataTable dtStepComleted = B_FormsData.GetStepInfo(entity.ProcessID, entity.ReceiveDateTime);

            for (int i = 0; i < nodes.Count; i++)
            {
                for (int j = 0; j < nodes[i].ChildNodes.Count; j++)
                {
                    try
                    {
                        XmlNode node = nodes[i].ChildNodes[j];
                        //string skey = node.Attributes["Name"].Value;
                        //string sFileName = HttpContext.Current.Server.MapPath(@"~\template\Singer\" + skey + ".png");
                        CRect rect = new CRect();
                        if (node.Attributes["Left"] != null)
                            rect.Left = Convert.ToInt32((string.IsNullOrEmpty(node.Attributes["Left"].Value) ? "0" : node.Attributes["Left"].Value));
                        if (node.Attributes["Top"] != null)
                            rect.Top = Convert.ToInt32((string.IsNullOrEmpty(node.Attributes["Top"].Value) ? "0" : node.Attributes["Top"].Value));
                        if (node.Attributes["Width"] != null)
                            rect.Width = Convert.ToInt32((string.IsNullOrEmpty(node.Attributes["Width"].Value) ? "0" : node.Attributes["Width"].Value));
                        if (node.Attributes["Height"] != null)
                            rect.Height = Convert.ToInt32((string.IsNullOrEmpty(node.Attributes["Height"].Value) ? "0" : node.Attributes["Height"].Value));
                        string[] sParams = node.InnerText.Split('|');
                        if (sParams.Length != 2) return;

                        #region Display属性处理
                        string sDisplay = "";
                        if (node.Attributes["Display"] != null)
                        {
                            sDisplay = node.Attributes["Display"].Value.ToLower();
                        }
                        #endregion
                        string sTimeStamp = "";
                        string sUserID = "";

                        #region StampName属性处理
                        /*
                        if (node.Attributes["StampName"] != null)
                        {
                            string[] result = node.Attributes[4].Value.Split(new char[] { ';', ',' });

                            //string value = node.Attributes[4].Value;
                            string value = "";
                            try
                            {
                                value = entity.GetVal(result[0]).ToString();
                            }
                            catch
                            {
                                word.AddPicture(rect, sParams, "", fLenRatio, fWidRatio, sDisplay, sUserID);
                                continue;
                            }
                            if (string.IsNullOrEmpty(value))
                            {
                                if (result.Length == 2 &&
                                    (entity.GetVal(result[1]).GetType().Name == "DateTime"
                                    || entity.GetVal(result[1]).GetType().Name == "String")
                                   )
                                {
                                    sTimeStamp = entity.GetVal(result[1]).ToString();
                                    DateTime dt = Convert.ToDateTime(sTimeStamp);
                                    if (dt == DateTime.MinValue)
                                        sTimeStamp = "";
                                }
                            }
                            else
                            {
                                if (entity.GetVal(result[0]).GetType().Name == "DateTime"
                                    || entity.GetVal(result[0]).GetType().Name == "String")
                                {
                                    sTimeStamp = entity.GetVal(result[0]).ToString();
                                    if (result[0] == "niGaoRenDate")
                                    {
                                        string[] res = sTimeStamp.Split(' ');
                                        if (res.Length > 2)
                                            sTimeStamp = res[1] + ' ' + res[2];
                                        else
                                            sTimeStamp = "";
                                    }
                                    //if (result[0] == "huiqianDates")
                                    //{
                                    //    string[] res = sTimeStamp.Split(' ');
                                    //    if (res.Length > 2)
                                    //        sTimeStamp = res[1] + ' ' + res[2];
                                    //    else
                                    //        sTimeStamp = "";
                                    //}
                                    DateTime dt = Convert.ToDateTime(sTimeStamp);
                                    if (dt == DateTime.MinValue)
                                        sTimeStamp = "";
                                }
                            }
                            #region 忽略
                            ////renjinquan+ 针对函件发文时间格式异常做的处理('姓名 日期 时间'),去掉姓名
                            //if (ProcessConstString.TemplateName.LETTER_SEND.Contains(this.UCTemplateName) &&
                            //    (result[0].Equals("niGaoRenDate", StringComparison.CurrentCultureIgnoreCase) ||
                            //    result[0].Equals("huiqianDates", StringComparison.CurrentCultureIgnoreCase)))
                            //{
                            //    //会签时可能有多个人
                            //    foreach (string str in value.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
                            //    {
                            //        if (str.Split(' ').Length > 2)
                            //        {
                            //            sTimeStamp = str.Substring(str.IndexOf(' ') + 1);
                            //        }
                            //        word.AddPicture(rect, sParams, sTimeStamp);

                            //    }
                            //    continue;
                            //}

                            //}
                            //else if (this.UCTemplateName == ProcessConstString.TemplateName.COMPANY_SEND && node.InnerText.Contains("会签"))
                            //{
                            //    string[] results = FormsMethod.GetSingers4Print(entity.ProcessID, entity.WorkItemID, "部门会签", "公司发文").Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
                            //    for (int k = 1; k < results.Length; k += 2)
                            //    {
                            //        word.AddPicture(rect, sParams, results[k]);
                            //    }
                            //    continue;
                            //}
                            #endregion

                        }
                        */
                        #endregion

                        #region Step属性节点处理
                        DataRow[] rowsStamp = null;

                        if (node.Attributes["Step"] != null)
                        {
                            string[] sResult = node.Attributes["Step"].Value.Split(':');
                            string sDateFlag = ""; // 较早 较晚
                            if (sResult != null && sResult.Length == 2) //sResult[0] 步骤 sResult[1] 较早/较晚
                            {
                                #region 多人会签/多人核稿 签名图片处理
                                /********多人会签/多人核稿 签名图片处理 START********/
                                /*
                                    党纪工团发文
                                        党委公文首页纸模板:
                                            会签
                                        工会首页纸
                                            会签
                                        共青团首页纸
                                            会签
                                        纪律检查委员会首页纸
                                            会签
                                    公司发文
                                        公文首页纸
                                            会签、核稿
                                    函件发文
                                        函件发文表单
                                            会签
                                 */
                                if (IsMultiSigners(sProcess, sTemplate, sParams,
                                                    sParams[0], rect, entity,
                                                    fLenRatio, fWidRatio, sDisplay))
                                {
                                    continue;
                                }
                                /*******多人会签/多人核稿 签名图片处理 END***********/
                                #endregion
                                if (sParams[1].ToLower() == "downs")
                                {
                                    if (sResult[1] == "较早")
                                        sDateFlag = "COMPLETED_DATE ASC";
                                    if (sResult[1] == "较晚")
                                        sDateFlag = "COMPLETED_DATE DESC";
                                    rowsStamp = dtStepComleted.Select("NAME='" + sResult[0] + "' and  COMPLETED_DATE IS NOT NULL", sDateFlag);
                                    if (rowsStamp != null && rowsStamp.Length > 0)
                                    {
                                        for (int n = 0; n < rowsStamp.Length; n++)
                                        {
                                            sTimeStamp += rowsStamp[n]["COMPLETED_DATE"].ToString() + "\n";
                                            sUserID += rowsStamp[n]["USER_ID"].ToString() + "\n";
                                        }
                                    }
                                }
                                else
                                {
                                    if (sResult[1] == "较早")
                                        sDateFlag = "COMPLETED_DATE ASC";
                                    if (sResult[1] == "较晚")
                                        sDateFlag = "COMPLETED_DATE DESC";
                                    rowsStamp = dtStepComleted.Select("NAME='" + sResult[0] + "' and  COMPLETED_DATE IS NOT NULL", sDateFlag);
                                    if (rowsStamp != null && rowsStamp.Length > 0)
                                    {
                                        sTimeStamp = rowsStamp[0]["COMPLETED_DATE"].ToString();
                                        sUserID = rowsStamp[0]["USER_ID"].ToString();
                                    }
                                }
                            }
                        }
                        #endregion

                        word.AddPicture(rect, sParams, sTimeStamp, fLenRatio, fWidRatio, sDisplay, sUserID);
                    }
                    catch (Exception ex)
                    {
                        continue;
                    }
                }
            }
            // 清除签名图片所在的临时目录下的文件
            //ClearFileListTmpDirectory(@"~\template\Singer\");
        }
        /// <summary>
        /// 党纪工团发文	
        ///    党委公文首页纸模板:
        ///        会签:
        ///    工会首页纸
        ///        会签:
        ///    共青团首页纸
        ///        会签:
        ///    纪律检查委员会首页纸
        ///        会签:
        /// 公司发文
        ///    公文首页纸
        ///        会签:核稿:
        /// 函件发文
        ///    函件发文表单
        ///        会签:
        /// </summary>
        /// <param name="sProcess"></param>
        /// <param name="sTemplate"></param>
        /// <param name="sNodeName"></param>
        /// <returns>如果待签名图片在如上流程模板的节点中出现则返回TRUE,否则返回FALSE</returns>
        private bool IsMultiSigners(string sProcess, string sTemplate, string[] sParams,
            string sNodeName, CRect rect, EntityBase entity,
            double fLenRatio, double fWidRatio, string sDisplay)
        {
            bool bRet = false;
            DataTable dt = null; //new DataTable();
            Dictionary<string, string> dictSigners = new Dictionary<string, string>();
            switch (sProcess)
            {
                case "党纪工团发文":
                    if ((sTemplate == "党委公文首页纸模板" ||
                        sTemplate == "工会首页纸" ||
                        sTemplate == "共青团首页纸" ||
                        sTemplate == "纪律检查委员会首页纸") && sNodeName == "会签:")
                    {
                        bRet = true;

                        //string DetpSigners = FormsMethod.GetSingers4Print(entity.ProcessID, entity.WorkItemID, "部门会签", "党纪工团发文");
                        //string[] results = DetpSigners.Split(new char[] { '[', ']', '\n', ' ' }, StringSplitOptions.RemoveEmptyEntries);
                        //string Stamp = "";
                        //for (int k = 1; k < results.Length; k += 3)
                        //{
                        //    Stamp += (results[k] + " " + results[k + 1] + "\n");
                        //}
                        dt = B_FormsData.GetStepInfo(entity.ProcessID, entity.ReceiveDateTime);
                        DataRow[] rows = dt.Select("NAME = '部门会签'  and  COMPLETED_DATE IS NOT NULL", "COMPLETED_DATE DESC");
                        for (int i = 0; i < rows.Length; i++)
                        {
                            if (!dictSigners.ContainsKey(rows[i]["USER_ID"].ToString()))
                            {
                                dictSigners.Add(rows[i]["USER_ID"].ToString(), rows[i]["COMPLETED_DATE"].ToString());
                                word.AddPicture(rect, sParams, rows[i]["COMPLETED_DATE"].ToString(), fLenRatio, fWidRatio, sDisplay, rows[i]["USER_ID"].ToString());
                            }
                        }
                    }
                    break;
                case "公司发文":
                    if (sTemplate == "公文首页纸")
                    {

                        //string[] results = DetpSigners.Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries);
                        //string sVerify = (string.IsNullOrEmpty(entity.GetVal("ZhuRenSigner").ToString()) ? "" : entity.GetVal("ZhuRenSigner").ToString() + " " + ucPrint.CheckDateTime(entity.GetVal("ZhuRenSignDate").ToString()) + "\r\n");
                        //string sCVerify = (string.IsNullOrEmpty(entity.GetVal("Verifier").ToString()) ? "" : entity.GetVal("Verifier").ToString() + " " + ucPrint.CheckDateTime(entity.GetVal("VerifyDate").ToString()));
                        if (sNodeName == "会签:")
                        {
                            bRet = true;
                            //string DetpSigners = FormsMethod.GetSingers4Print(entity.ProcessID, entity.WorkItemID, "部门会签", "公司发文");
                            //string[] result = DetpSigners.Split(new char[] { '[', ']', ' ', '\n' }, StringSplitOptions.RemoveEmptyEntries);
                            //string Stamp = "";
                            //for (int k = 1; k < result.Length; k += 3)
                            //{
                            //    Stamp += result[k] + " " + result[k + 1] + "\n";
                            //}
                            dt = B_FormsData.GetStepInfo(entity.ProcessID, entity.ReceiveDateTime);
                            DataRow[] rows = dt.Select("NAME = '部门会签'  and  COMPLETED_DATE IS NOT NULL", "COMPLETED_DATE DESC");
                            for (int i = 0; i < rows.Length; i++)
                            {
                                if (!dictSigners.ContainsKey(rows[i]["USER_ID"].ToString()))
                                {
                                    dictSigners.Add(rows[i]["USER_ID"].ToString(), rows[i]["COMPLETED_DATE"].ToString());
                                    word.AddPicture(rect, sParams, rows[i]["COMPLETED_DATE"].ToString(), fLenRatio, fWidRatio, sDisplay, rows[i]["USER_ID"].ToString());
                                }
                            }
                        }

                        if (sNodeName == "核稿:")
                        {
                            bRet = true;
                            //string value = "";
                            //if (!(entity.GetVal("ZhuRenSignDate").ToString() == "" || entity.GetVal("ZhuRenSignDate").ToString() == DateTime.MinValue.ToString()))
                            //{
                            //    value = entity.GetVal("ZhuRenSignDate").ToString() + "\n";
                            //}
                            //if (!(entity.GetVal("VerifyDate").ToString() == "" || entity.GetVal("VerifyDate").ToString() == DateTime.MinValue.ToString()))
                            //{
                            //    value += entity.GetVal("VerifyDate").ToString() + "\n";
                            //}
                            //word.AddPicture(rect, sParams, value, fLenRatio, fWidRatio, sDisplay, sUserID);
                            dt = B_FormsData.GetStepInfo(entity.ProcessID, entity.ReceiveDateTime);
                            DataRow[] rows = dt.Select("NAME = '主任核稿'  and  COMPLETED_DATE IS NOT NULL", "COMPLETED_DATE DESC");
                            DataRow[] rows1 = dt.Select("NAME = '核稿'  and  COMPLETED_DATE IS NOT NULL", "COMPLETED_DATE DESC");
                            for (int i = 0; i < rows.Length; i++)
                            {
                                if (!dictSigners.ContainsKey(rows[i]["USER_ID"].ToString()))
                                {
                                    dictSigners.Add(rows[i]["USER_ID"].ToString(), rows[i]["COMPLETED_DATE"].ToString());
                                    word.AddPicture(rect, sParams, rows[i]["COMPLETED_DATE"].ToString(), fLenRatio, fWidRatio, sDisplay, rows[i]["USER_ID"].ToString());
                                }
                            }
                            if (rows1.Length != null && rows1.Length > 0)
                                word.AddPicture(rect, sParams, rows1[0]["COMPLETED_DATE"].ToString(), fLenRatio, fWidRatio, sDisplay, rows1[0]["USER_ID"].ToString());
                        }
                    }
                    break;
                case "函件发文":
                    if (sTemplate == "函件发文表单" && sNodeName == "会签/日期:")
                    {
                        bRet = true;
                        //string sTimeStamp = entity.GetVal("huiqianDates").ToString();

                        //string[] res = sTimeStamp.Split(new char[] { ' ', ';' });
                        //string Stamp = "";
                        //for (int k = 1; k < res.Length; k += 3)
                        //{
                        //    Stamp += res[k] + " " + res[k + 1] + "\n";
                        //}
                        //word.AddPicture(rect, sParams, Stamp, fLenRatio, fWidRatio, sDisplay, sUserID);

                        dt = B_FormsData.GetStepInfo(entity.ProcessID, entity.ReceiveDateTime);
                        DataRow[] rows = dt.Select("NAME = '会签'  and  COMPLETED_DATE IS NOT NULL", "COMPLETED_DATE DESC");
                        for (int i = 0; i < rows.Length; i++)
                        {
                            if (!dictSigners.ContainsKey(rows[i]["USER_ID"].ToString()))
                            {
                                dictSigners.Add(rows[i]["USER_ID"].ToString(), rows[i]["COMPLETED_DATE"].ToString());
                                word.AddPicture(rect, sParams, rows[i]["COMPLETED_DATE"].ToString(), fLenRatio, fWidRatio, sDisplay, rows[i]["USER_ID"].ToString());
                            }
                        }
                    }
                    break;
            }
            return bRet;
        }