添加签名行 Word-Excel
Adding Signature Line Word-Excel
我可以在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 函数时,此 window 打开模式(如 showdialog),直到关闭它,代码才不会流动..
我通过使用 sendkey 绕过了这个,但我们知道这不是一个好方法。但是,如果我找不到任何其他解决方案,那么我将尝试使用 Win32 API 来找到这个 window(单词的子 window)。
但是我很好奇有没有办法绕过这个?因为有上千个文档,我也在寻找更快的方法。
添加此签名行后,我们就可以使用 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);
(卸载积木模板)
如果您需要修改签名行的属性,您可以
- 准备多个相应配置的签名行构建块,或者
- 动态修补构建块模板(例如,通过在运行时创建副本、使用 Open XML SDK 打开和操作文件并临时加载修改后的版本。
我可以在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 函数时,此 window 打开模式(如 showdialog),直到关闭它,代码才不会流动..
我通过使用 sendkey 绕过了这个,但我们知道这不是一个好方法。但是,如果我找不到任何其他解决方案,那么我将尝试使用 Win32 API 来找到这个 window(单词的子 window)。
但是我很好奇有没有办法绕过这个?因为有上千个文档,我也在寻找更快的方法。
添加此签名行后,我们就可以使用 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);
(卸载积木模板)
如果您需要修改签名行的属性,您可以
- 准备多个相应配置的签名行构建块,或者
- 动态修补构建块模板(例如,通过在运行时创建副本、使用 Open XML SDK 打开和操作文件并临时加载修改后的版本。