找回密码
 立即注册

QQ登录

只需一步,快速开始

AlexZ 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-8-24 23:43  /   查看:3170  /  回复:0
本帖最后由 AlexZ 于 2020-8-24 23:51 编辑

在当前的数字环境中,传统的签名和认证文档正在迅速被数字签名所取代。数字签名是对数字信息(例如电子邮件消息,电子文档等)进行身份验证的电子加密认证标记。
简而言之,数字签名是一种电子指纹,用于确认签名者的身份和文件的真实性。支持数字签名正成为数字文档中的标准。
Excel电子表格中的数字签名支持
在新版本中,GcExcel允许用户对Excel文件进 行数字签名以确保内容的真实性。该库使用IWorkbook.Signatures和IWorksheet.Shapes属性在Excel电子表格中支持数字签名。
GcExcel支持以两种形式将数字签名添加到Excel中,既可以是实际签名,也可以是“签名行”。签名是嵌入到文档中的数字证书(PFX / PKCS12)的实际副本。当Excel文档中添加了签名时,在不使该签名无效的情况下,不允许对文档进行任何编辑。
image.png696304931.png
签名行在外观上类似于可能出现在打印文档中的典型签名占位符。将签名行插入Excel文件时,作者可以指定有关预期签名者的信息(名称,标题和电子邮件地址),以及有关签名者。
将文件的电子副本发送给预期的签名者时,他们可以看到签名行和要求签名的通知。
image.png209975890.png

GcExcel提供了几种用于创建数字签名的选项。您可以添加不可见的签名,添加/删除/更新签名行,将签名的工作簿导出为PDF以及验证签名。
GcExcel支持的数字签名功能
除了将数字签名添加到Excel工作簿之外,GcExcel还支持许多其他功能。
支持的功能可以分为三类。
此类别中的功能演示了Excel电子表格的签名。您可以使用以下方法在GcExcel中对Excel文件进​​行签名:
添加不可见的签名
要对工作簿进行签名,请首先使用ISignatureSet.AddNonVisibleSignature方法创建签名,然后使用SignatureDetails类输入签名详细信息。定义签名后,请通过X509Certificate2类加载证书,使用ISignature.Sign方法创建签名包,最后通过调用IWorkbook.Save方法来提交签名。
  1. //create a new workbook
  2. var workbook = new GrapeCity.Documents.Excel.Workbook();

  3. ISignature signature = workbook.Signatures.AddNonVisibleSignature();

  4. // TODO: Use your information
  5. var details = new SignatureDetails
  6. {
  7.     Address1 = "<your address>",
  8.     Address2 = "<address 2>",
  9.     SignatureComments = "Final",
  10.     City = "<your city>",
  11.     StateOrProvince = "<your state or province>",
  12.     PostalCode = "<your postal code>",
  13.     CountryName = "<your country or region>",
  14.     ClaimedRole = "<your role>",
  15.     CommitmentTypeDescription = "Approved",
  16.     CommitmentTypeQualifier = "Final"
  17. };

  18. // TODO: Use your certificate
  19. var cert = new X509Certificate2("<your certificate file>", "<your password>");

  20. // TODO: Use your name or signature image
  21. signature.Sign(cert, details);

  22. // Commit signature
  23. workbook.Save("SignWorkbook.xlsx");
复制代码
签名行
Excel电子表格包含签名行时,它会显示一个通知,以对文档进行签名并提供签名详细信息。使用GcExcel,可以完全用代码执行此任务。也就是说,GcExcel将使用签名行加载Excel文件,启用输入签名详细信息,并使用代码对文档进行签名。

要对签名行进行签名,请如上所述将签名添加到Excel电子表格,然后调用ISignature.Sign方法。
  1. ISignature signature = workbook.Signatures.AddSignatureLine(workbook.ActiveSheet, 100.0, 50.0);

  2. // TODO: Use your information
  3. ISignatureSetup setup = signature.Setup;
  4. setup.ShowSignDate = true;
  5. setup.AllowComments = true;
  6. setup.SigningInstructions = "<your signing instructions>";
  7. setup.SuggestedSigner = "<signer's name>";
  8. setup.SuggestedSignerEmail = "example@microsoft.com";
  9. setup.SuggestedSignerLine2 = "<signer's title>";

  10. // TODO: Use your information
  11. var details = new SignatureDetails
  12. {
  13.     Address1 = "<your address>",
  14.     Address2 = "<address 2>",
  15.     SignatureComments = "Final",
  16.     City = "<your city>",
  17.     StateOrProvince = "<your state or province>",
  18.     PostalCode = "<your postal code>",
  19.     CountryName = "<your country or region>",
  20.     ClaimedRole = "<your role>",
  21.     CommitmentTypeDescription = "Approved",
  22.     CommitmentTypeQualifier = "Final"
  23. };

  24. // TODO: Use your certificate
  25. var cert = new X509Certificate2("<your certificate file>", "<your password>");

  26. // TODO: Use your name or signature image
  27. signature.Sign(cert, "<your name>", details);

  28. // Commit signature
  29. workbook.Save("SignSignatureLine.xlsx");
复制代码
反签工作簿
若要对签名进行反签名(将签名添加到已经签名的工作簿中),请首先创建一个签名行和一个如上所述的签名,然后使用具有相同证书的ISignature.Countersign方法对签名进行反签名。
  1. ISignature signature = workbook.Signatures.AddSignatureLine(workbook.ActiveSheet, 100.0, 50.0);

  2. ISignatureSetup setup = signature.Setup;
  3. setup.ShowSignDate = true;
  4. setup.AllowComments = true;
  5. setup.SigningInstructions = "<your signing instructions>";
  6. setup.SuggestedSigner = "<signer's name>";
  7. setup.SuggestedSignerEmail = "example@microsoft.com";
  8. setup.SuggestedSignerLine2 = "<signer's title>";

  9. var details = new SignatureDetails
  10. {
  11.     Address1 = "<your address>",
  12.     Address2 = "<address 2>",
  13.     SignatureComments = "Final",
  14.     City = "<your city>",
  15.     StateOrProvince = "<your state or province>",
  16.     PostalCode = "<your postal code>",
  17.     CountryName = "<your country or region>",
  18.     ClaimedRole = "<your role>",
  19.     CommitmentTypeDescription = "Approved",
  20.     CommitmentTypeQualifier = "Final"
  21. };

  22. // Sign the workbook
  23. var cert = new X509Certificate2("<your certificate file>", "<your password>");
  24. signature.Sign(cert, "<your name>", details);

  25. // Reopen the workbook
  26. var ms = new MemoryStream();
  27. workbook.Save(ms);
  28. ms.Position = 0;
  29. workbook.Open(ms);

  30. // Modify
  31. workbook.Worksheets["Sheet1"].Range["A1"].Value = "Modified";

  32. // Countersign
  33. workbook.Signatures[0].Countersign(cert);

  34. // Commit signature
  35. workbook.Save("CountersignSignature.xlsx");
复制代码
管理签名
GcExcel还可以管理签名(当Excel文件已经通过签名或签名行进行签名时,可以对其进行修改,检索和验证)。以下是GcExcel支持的各种管理签名的操作:

添加签名行
  1. IWorksheet activeSheet = workbook.ActiveSheet;

  2. ISignatureSetup setup = workbook.Signatures.AddSignatureLine(activeSheet, 100.0, 50.0).Setup;
  3. setup.ShowSignDate = false;
  4. setup.AllowComments = false;
  5. setup.SigningInstructions = "Please check the content before signing.";
  6. setup.SuggestedSigner = "Shinzo Nagama";
  7. setup.SuggestedSignerEmail = "shinzo.nagama@ea.com";
  8. setup.SuggestedSignerLine2 = "Commander (Balanced)";

  9. //save to an excel file
  10. workbook.Save("addsignaturelines.xlsx");
复制代码
复制签名行
可以将添加到文档的签名行复制到另一个范围或工作表。使用IRange.CopyIShape.DuplicateIWorksheet.Copy方法可以将签名行复制到另一个范围或工作表。
  1. // Copy signature line with Range.Copy
  2. IRange srcRange = activeSheet.Range["A1:I15"];
  3. IRange destRange = activeSheet.Range["A16:I30"];
  4. srcRange.Copy(destRange);

  5. // Copy signature line with Shape.Duplicate
  6. signature.SignatureLineShape.Duplicate();

  7. // Copy signature line with Worksheet.Copy
  8. activeSheet.Copy();

  9. //save to an excel file
  10. workbook.Save("copysignaturelines.xlsx");
复制代码
切签名线
要将签名行剪切到另一个范围,请使用IRange.Cut方法。
  1. // Cut signature line with Range.Cut
  2. IRange srcRange = activeSheet.Range["A1:I15"];
  3. IRange destRange = activeSheet.Range["A16:I30"];
  4. srcRange.Cut(destRange);

  5. //save to an excel file
  6. workbook.Save("cutsignaturelines.xlsx");
复制代码
删除签名行
使用GcExcel,也可以通过删除签名来完全删除签名行。若要删除签名行,请使用ISignature.DeleteIShape.Delete方法。
  1. // Create a new signature line and delete with Signature.Delete
  2. ISignature signatureForTest = newSignatureLine();
  3. signatureForTest.Delete();

  4. // Create a new signature line and delete with Shape.Delete
  5. signatureForTest = newSignatureLine();
  6. IShape signatureLineShape = signatureForTest.SignatureLineShape;
  7. signatureLineShape.Delete();

  8. //save to an excel file
  9. workbook.Save("deletesignaturelines.xlsx");
复制代码
移动签名行
使用IShape.TopIShape.Left属性将签名行移动到另一个范围或工作表。
  1. // Move signature line
  2. signatureShinzo.SignatureLineShape.Top += 100;
  3. signatureShinzo.SignatureLineShape.Left += 50;

  4. //save to an excel file
  5. workbook.Save("movesignaturelines.xlsx");
复制代码
验证签名
您可以在Excel电子表格中验证现有签名。这可以使用ISignature.IsSignedISignature.IsValid属性来完成。
  1. ISignatureSet signatures = workbook.Signatures;

  2. bool signed = false;
  3. bool valid = false;
  4. X509Certificate2 certificate = null;

  5. // Verify the first signed signature
  6. foreach (var signature in signatures)
  7. {
  8.     if (signature.IsSigned)
  9.     {
  10.         signed = true;
  11.         certificate = signature.Details.SignatureCertificate;
  12.         // Verify signature
  13.         valid = signature.IsValid;
  14.         break;
  15.     }
  16. }

  17. // Verify certificate
  18. if (certificate != null)
  19. {
  20.     var status = X509ChainStatusFlags.NoError;

  21.     // build the certificate chain
  22.     var chain = new X509Chain();
  23.     bool certValid = chain.Build(certificate);

  24.     // inspect the results
  25.     if (!certValid)
  26.     {
  27.         var chainStatus = chain.ChainStatus;
  28.         for (var i = 0; i < chainStatus.Length; i++)
  29.         {
  30.             status |= chainStatus[i].Status;
  31.         }
  32.     }

  33.     // Extract the certificate verification result.
  34.     // You can write them to trace listeners or draw them on your screen to observe the result.
  35.     var isCertificateExpired = status.HasFlag(X509ChainStatusFlags.NotTimeValid);
  36.     var isCertificateRevoked = status.HasFlag(X509ChainStatusFlags.Revoked);
  37.     var isCertificateUntrusted = status.HasFlag(X509ChainStatusFlags.UntrustedRoot);
  38. }
复制代码
列表签名
添加多个签名行后,请使用IWorkbook.Signatures列出带有索引或枚举器的签名行。
  1. // List signatures with indexes
  2. for (var i = 0; i < signatures.Count; i++)
  3. {
  4.     var signature = signatures[i];
  5.     // Insert your code here
  6. }

  7. // List signatures with enumerator
  8. foreach (var signature in signatures)
  9. {
  10.     // Insert your code here
  11. }

  12. //save to an excel file
  13. workbook.Save("listsignaturelines.xlsx");
复制代码
将签名的Excel电子表格导出为PDF
使用GcExcel,您可以将签名行签名的Excel电子表格导出为PDF格式。要导出,请使用IWorkbook.Save方法。
  1. workbook.Open(GetResourceStream(@"xlsx\Signature.xlsx"));
  2. workbook.Signatures.SkipCertificateValidationOnExporting = false;

  3. //save to a pdf file
  4. workbook.Save("exportsignaturelinetopdf.pdf");
复制代码
让我们考虑一些常见情况,并了解如何使用GcExcel添加/管理数字签名。
数字签名Excel文件的步骤
让我们构建一个Visual Studio .NET Core应用程序并实现以下两种情况:
如何签署Excel档案?
这是最常见的情况,其中要求对现有的Excel文件进&#8203;&#8203;行签名以确认Excel电子表格的真实性。这是通过将数字签名(不可见)添加到Excel文件来完成的。
步骤1.安装
  • 在您的.Net Core Console应用程序中,右键单击“依赖项”,然后选择“管理NuGet程序包”。
  • 在“浏览”选项卡下,搜索“ GrapeCity.Documents.Excel”,然后单击“安装”。
  • 在安装过程中,您将收到两个确认对话框:“预览更改”和“许可接受”,分别单击“确定”和“我同意”以继续。

步骤2.设置C#项目添加名称空间
在程序文件中,导入以下名称空间。
using GrapeCity.Documents.Excel;
创建一个新的工作簿
在主要功能中,添加以下代码以创建新的GcExcel工作簿。
Workbook workbook = new Workbook();
加载Excel工作簿
在主要功能中,添加以下代码以从项目资源中将Excel报告作为文件流加载。
  1. var assembly = typeof(DigitalSignaturesDemo_GcExcel.Program).GetTypeInfo().Assembly;
  2. Stream signedFileStream = assembly.GetManifestResourceStream("DigitalSignaturesDemo_GcExcel.Resources.Financial Sample.xlsx");
  3. workbook.Open(signedFileStream);
复制代码
创建一个看不见的签名
在主函数中,调用AddNonVisibleSignature方法来创建一个新的不可见签名。
  1. ISignature signature = workbook.Signatures.AddNonVisibleSignature();
复制代码
定义签名详细信息
创建SignatureDetails类的实例,并设置其各种属性以定义Signature Details。
  1. SignatureDetails details = new SignatureDetails
  2. {
  3.     Address1 = "GrapeCity India Pvt Ltd",
  4.     Address2 = "A-15, Sector 62",
  5.     SignatureComments = "Final",
  6.     City = "Noida>",
  7.     StateOrProvince = "Uttar Pradesh",
  8.     PostalCode = "201307",
  9.     CountryName = "India",
  10.     ClaimedRole = "Software Engineer",
  11.     CommitmentTypeDescription = "Approved",
  12.     CommitmentTypeQualifier = "Final"
  13. };
复制代码
加载证书
使用X509Certificate2类加载证书。
X509Certificate2 cert = new X509Certificate2("Resources/GPCTAdmin.pfx", "grapecity@123");签署Excel档案
通过调用Sign .html)方法,使用加载的证书创建签名包,并为创建的不可见签名定义详细信息。
signature.Sign(cert, details);
提交签名
要提交签名,请将工作簿另存为.xlsx或 .xlsm。

workbook.Save("SignWorkbook.xlsx");
image.png71965636.png
如何签署已经签署的Excel文件?
另一个常见方案是在进行修改后对已经签名的Excel文件进&#8203;&#8203;行签名。修改文档后,现有签名将无效;因此,该文档需要重新签名。
为此,请使用GcExcel添加不可见的数字签名。通过修改来签名已经签名的Excel文件的步骤涉及以前方案中的所有步骤以及一些其他步骤。
在以前的场景中,我们直接向工作簿添加了签名。但是,在这种情况下,由于需要重新签名现有的Excel文件,因此我们需要使用XlsxOpenOptions类来确保以DigitalSignatureOnly模式打开该文件。
必须以DigitalSignatureOnly模式打开Excel文件,因为如果没有仅数字签名模式,则在保存工作簿后将删除所有现有签名。
除了上一个示例中提供的代码之外,在创建工作簿实例之后立即使用以下代码。
  1. XlsxOpenOptions openOption = new XlsxOpenOptions { DigitalSignatureOnly = true };
  2. workbook.Open(signedFileStream, openOption);
复制代码
image.png996132812.png
此过程从已经使用签名行签名的Excel中生成带有不可见签名的Excel文件。

DigitalSignaturesDemo_GcExcel.zip

80.16 KB, 下载次数: 238

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部