添加签名行Word-Excel

时间:2016-10-21 08:26:29

标签: c# excel ms-word signature

我可以在word文档中添加签名行,但我对自己的方法感觉不太好。我经常搜索我的sitautation但没找到任何。

这是我的代码

        private void CreateNewPage()
        {
            object missing = System.Reflection.Missing.Value;
            object fileName = @"C:\docs\mydoc.docx";
            object readOnly = false;
            object isVisible = true;

            //Start Word and open a document.  
            Word._Application oWord;
            Word._Document oDoc;
            oWord = new Word.Application();
            oWord.Visible = true;

            oDoc = oWord.Documents.Open(ref fileName, ref missing, ref readOnly,
                ref missing, ref missing, ref missing, ref missing, ref missing,
                ref missing, ref missing, ref missing, ref isVisible, ref missing,
                ref missing, ref missing, ref missing);


          //  var numberOfPages = oDoc.ComputeStatistics(Word.WdStatistic.wdStatisticPages, false);



            object oEndOfDoc = "\\endofdoc";
            object paramNextPage = Word.WdBreakType.wdSectionBreakNextPage;

            oDoc.Bookmarks.get_Item(ref oEndOfDoc).Range.InsertBreak(ref paramNextPage);
            //Insert a page break  
            object breakPage = Word.WdBreakType.wdPageBreak;


            object saveOption = Word.WdSaveOptions.wdDoNotSaveChanges;
            object originalFormat = Word.WdOriginalFormat.wdOriginalDocumentFormat;
            object routeDocument = false;

            object what = Microsoft.Office.Interop.Word.WdGoToItem.wdGoToPage;
            object which = Microsoft.Office.Interop.Word.WdGoToDirection.wdGoToLast;
            object count = 3;

            oWord.Selection.GoTo(ref what, ref which, ref count, ref missing);      

            object sigID = "{00000000-0000-0000-0000-000000000000}";
            Timer t = new Timer();
            t.Elapsed += (sender, args) =>
            {


                SendKeys.SendWait("{TAB}");
                SendKeys.SendWait("~");                  
                t.Stop();

            };

            t.Interval = 2000;
            t.Start();
            try
            {

                oWord.Activate();

                SignatureSet signatureSet = oWord.ActiveDocument.Signatures;
               // signatureSet.ShowSignaturesPane = false;
                Signature objSignature = signatureSet.AddSignatureLine(sigID);
                objSignature.Setup.SuggestedSigner = "docSigner";
                objSignature.Setup.SuggestedSignerEmail = "abc@xyz.com";
                objSignature.Setup.ShowSignDate = true;           

              //  dynamic shape = objSignature.SignatureLineShape;

            }
            catch (Exception ex){}

            oWord.Documents.Save();
            oWord.Quit();

            try
            {
                Marshal.ReleaseComObject(oWord);
            }
            catch (Exception){}

        }

如下所示,当我调用AddSignatureLine函数时,此窗口打开模态(如showdialog),直到关闭它,代码不会流动..

我使用sendkey绕过了这个,但我们知道这不是一个好方法。但是,如果我找不到任何其他解决方案,那么我将尝试使用Win32 API找到这个窗口(单词的子窗口)。

但我很好奇是否还有绕过这个?因为有数千份文件,我也在寻找更快的方法。

添加此签名行后,我们就可以使用DocuSign签署文档。但如果文档中没有任何签名行,DocuSign不会以数字方式签署文档。然后我们必须添加这一行。

1 个答案:

答案 0 :(得分:1)

由于似乎无法绕过模式签名设置对话框的显示,我建议您使用以下解决方法,该解决方案基于包含正确配置的签名行的构建块:

  1. 创建一个新的空.dotx模板。此模板将用于保存构建块条目。
  2. 创建包含签名行的示例文档,并通过 Insert>添加此签名行。快速部件>将选择保存到快速部件库到上一步中创建的模板。
  3. 在项目中包含模板,并使用可执行文件或加载项部署模板。
  4. 在运行时,将模板作为加载项加载

    Application.AddIns.Add(fullPathToDotx);
    
  5. 您现在可以从模板

    插入构建基块
    var template = Application.Templates
        .OfType<Microsoft.Office.Interop.Word.Template>()
        .FirstOrDefault(t => t.Name == addInFileName);
    var buildingBlock = template.BuildingBlockEntries.Item("Signature Line");
    buildingBlock.Insert(range, true);
    
  6. (卸载构建基块模板)

  7. 如果您需要修改签名行的属性,可以

    • 准备相应配置的多个签名行构建块,或
    • 动态修补构建基块模板(例如,通过在运行时创建副本,使用Open XML SDK打开和操作文件,并临时加载修改后的版本。