C# 添加签名行Word Excel

C# 添加签名行Word Excel,c#,excel,ms-word,signature,C#,Excel,Ms Word,Signature,我可以在word文档中添加签名行,但我觉得我的方法不太好。我找了很多来处理我的情况,但没有找到 这是我的密码 private void CreateNewPage() { object missing = System.Reflection.Missing.Value; object fileName = @"C:\docs\mydoc.docx"; object readOnly = fal

我可以在word文档中添加签名行,但我觉得我的方法不太好。我找了很多来处理我的情况,但没有找到

这是我的密码

        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查找此窗口(word的子窗口)

但我很好奇,是否有任何方法可以绕过这个问题?因为有上千个文档,我也在寻找一种更快的方法


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

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

  • 创建一个新的空.dotx模板。此模板将用于保存构建块条目
  • 创建包含签名行的示例文档,并通过“插入>快速零件>将所选内容保存到快速零件库”将此签名行添加到上一步创建的模板中
  • 将模板包括在项目中,并将模板与可执行文件或加载项一起部署
  • 在运行时,将模板作为外接程序加载

    Application.AddIns.Add(fullPathToDotx);
    
  • 现在可以从模板中插入构建基块

    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);
    
    var-template=Application.Templates
    第()类
    .FirstOrDefault(t=>t.Name==addInFileName);
    var buildingBlock=template.BuildingBlockEntries.Item(“签名行”);
    buildingBlock.Insert(范围,真);
    
  • (卸载构建基块模板)

  • 如果需要修改签名行的属性,可以

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

    这似乎是一种有趣的方式,谢谢。我正在尝试这样做,但我被困在了第三步。如何将此模板安装到我的C#项目?我没有创建外接程序。这是一个使用Office Interop的普通exe。我找到了如何安装的方法。但我遇到了一个异常,类型为“System.Runtime.InteropServices.COMException”oc的未处理异常在WindowsFormsApplication1.exe中出现其他信息:请求的集合成员不存在。此处var buildingBlock=template.BuildingBlockEntries.Item(“TestSignature”);因为template.BuildingBlockEntries.Count是zero@unbalanced:很抱歉造成混淆。我的意思是,您必须在运行时提供该模板,以便您可以使用
    应用程序将其加载到Word中。AddIns.Add
    。嘿,谢谢,我现在解决了。如您所见,我在“保存在”中选择了我的模板然后我得到了一个构建块条目,在它运行良好之后:)再次非常感谢。但我们会给这个应用程序,我必须安装这个模板?没有办法自动完成吗?@unbalanced:显然,模板必须出现在应用程序运行的机器上。如果这是您的意思,那么您不必在Word中安装/注册模板。您可以使用步骤4中的代码仅在需要时加载它。我建议您将模板与可执行文件放在同一文件夹中,然后使用
    var path=path.GetDirectoryName(Assembly.getexecutinggassembly().Location)加载加载项;var addinFileName=Path.Combine(路径,“SignatureTemplate.dotx”);Application.AddIns.Add(addinFileName)