添加签名行Word-Excel

我可以在Word文档中添加一个签名行,但是我觉得我的方法不太好。 我已经搜查了很多,以处理我的sitautation,但没有find任何。

那么这里是我的代码

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),直到closures它,代码不会stream动。

我用sendkey绕过了这个,但是我们知道这不是一个好的方法。 但是,如果我不能find任何其他解决scheme,那么我会尽量find使用Win32 API的这个窗口(单词的子窗口)。

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

在添加这个签名行后,我们可以用DocuSign签署文档。 但是,如果文档中没有任何签名行,则DocuSign不会以数字方式签署文档。 那么我们必须添加这一行。

由于似乎没有办法绕过模式签名设置对话框的显示,所以我build议您采取以下解决方法,它基于包含正确configuration的签名行的构build块:

  1. 创build一个新的空的.dotx模板。 这个模板将被用来保存积木条目。
  2. 创build一个包含签名行的示例文档,并通过“ 插入”>“快速部件”>“将select保存到快速部件库”将此签名行添加到上一步中创build的模板。
  3. 将模板包含在您的项目中,并使用可执行文件或加载项来部署模板。
  4. 在运行时,加载模板作为加载项

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

     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. (卸载积木模板)

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

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