介绍
在现代文档管理系统中,在单个文档中搜索和验证多种签名类型的能力日益重要。组织通常使用各种签名类型(例如数字签名、文本签名、条形码、二维码等)来增强文档安全性并简化验证流程。GroupDocs.Signature for .NET 提供了一个强大的框架,使开发人员能够跨各种文档格式实现全面的签名搜索功能。
本教程将指导您使用 GroupDocs.Signature for .NET 在文档中搜索多种签名类型的过程,并提供详细的解释和实用的代码示例。
先决条件
在深入实现多重签名搜索功能之前,请确保您满足以下先决条件:
开发环境:Visual Studio 或系统上安装的任何首选的 .NET 开发环境。
GroupDocs.Signature for .NET:从以下位置下载并安装 GroupDocs.Signature for .NET 库 这里.
基本 C# 知识:熟悉 C# 编程语言和 .NET 框架概念。
样本文件:准备包含各种类型签名的测试文件,以供测试目的。
导入命名空间
首先导入访问 GroupDocs.Signature 功能所需的命名空间:
using System;
using System.Collections.Generic;
using GroupDocs.Signature;
using GroupDocs.Signature.Domain;
using GroupDocs.Signature.Options;
现在,让我们将搜索多种签名类型的过程分解为清晰、易于管理的步骤:
步骤 1:加载文档
首先,加载包含要搜索的签名的文档:
string filePath = "sample_multiple_signatures.docx";
using (Signature signature = new Signature(filePath))
{
// 多重签名搜索代码将在此处添加
}
步骤 2:定义不同签名类型的搜索选项
为您想要搜索的每种签名类型创建搜索选项:
// 定义文本签名的搜索选项
TextSearchOptions textOptions = new TextSearchOptions
{
AllPages = true, // 在所有页面上搜索
Text = "Signature", // 可选:要查找的文本
MatchType = TextMatchType.Contains // 匹配条件
};
// 定义数字签名的搜索选项
DigitalSearchOptions digitalOptions = new DigitalSearchOptions
{
AllPages = true
};
// 定义条形码签名的搜索选项
BarcodeSearchOptions barcodeOptions = new BarcodeSearchOptions
{
AllPages = true,
Text = "123456", // 可选:要匹配的条形码文本
MatchType = TextMatchType.Exact // 匹配条件
};
// 定义二维码签名的搜索选项
QrCodeSearchOptions qrCodeOptions = new QrCodeSearchOptions
{
AllPages = true,
Text = "John", // 可选:要匹配的二维码文本
MatchType = TextMatchType.Contains // 匹配条件
};
// 定义元数据签名的搜索选项
MetadataSearchOptions metadataOptions = new MetadataSearchOptions();
步骤 3:向集合添加选项
将所有搜索选项添加到集合中:
// 创建一个列表来保存所有搜索选项
List<SearchOptions> searchOptions = new List<SearchOptions>
{
textOptions,
digitalOptions,
barcodeOptions,
qrCodeOptions,
metadataOptions
};
步骤 4:执行搜索并处理结果
使用组合搜索选项执行搜索并处理结果:
// 使用定义的选项搜索所有签名类型
SearchResult result = signature.Search(searchOptions);
// 检查是否找到签名
if (result.Signatures.Count > 0)
{
Console.WriteLine($"\nSource document ['{filePath}'] contains {result.Signatures.Count} signature(s):");
// 遍历找到的签名
foreach (var foundSignature in result.Signatures)
{
Console.WriteLine($"Signature found: Type: {foundSignature.SignatureType}, Page: {foundSignature.PageNumber}, ID: {foundSignature.SignatureId}");
// 处理特定签名类型
if (foundSignature is TextSignature textSignature)
{
Console.WriteLine($"Text: '{textSignature.Text}'");
}
else if (foundSignature is BarcodeSignature barcodeSignature)
{
Console.WriteLine($"Barcode Type: {barcodeSignature.EncodeType.TypeName}, Text: '{barcodeSignature.Text}'");
}
else if (foundSignature is QrCodeSignature qrCodeSignature)
{
Console.WriteLine($"QR Code Type: {qrCodeSignature.EncodeType.TypeName}, Text: '{qrCodeSignature.Text}'");
}
else if (foundSignature is DigitalSignature digitalSignature)
{
Console.WriteLine($"Certificate: {digitalSignature.Certificate?.SubjectName}, Valid: {digitalSignature.IsValid}");
}
else if (foundSignature is MetadataSignature metadataSignature)
{
Console.WriteLine($"Metadata: Name: {metadataSignature.Name}, Value: {metadataSignature.Value}");
}
}
}
else
{
Console.WriteLine("No signatures were found in the document.");
}
完整示例
这是一个完整的、可运行的示例,演示了如何在文档中搜索多种签名类型:
using System;
using System.Collections.Generic;
using GroupDocs.Signature;
using GroupDocs.Signature.Domain;
using GroupDocs.Signature.Options;
namespace MultiSignatureSearch
{
class Program
{
static void Main(string[] args)
{
// 文档路径
string filePath = "sample_multiple_signatures.docx";
// 初始化签名实例
using (Signature signature = new Signature(filePath))
{
try
{
// 定义文本签名的搜索选项
TextSearchOptions textOptions = new TextSearchOptions
{
AllPages = true,
MatchType = TextMatchType.Contains
};
// 定义数字签名的搜索选项
DigitalSearchOptions digitalOptions = new DigitalSearchOptions
{
AllPages = true
};
// 定义条形码签名的搜索选项
BarcodeSearchOptions barcodeOptions = new BarcodeSearchOptions
{
AllPages = true
};
// 定义二维码签名的搜索选项
QrCodeSearchOptions qrCodeOptions = new QrCodeSearchOptions
{
AllPages = true
};
// 定义元数据签名的搜索选项
MetadataSearchOptions metadataOptions = new MetadataSearchOptions();
// 创建一个列表来保存所有搜索选项
List<SearchOptions> searchOptions = new List<SearchOptions>
{
textOptions,
digitalOptions,
barcodeOptions,
qrCodeOptions,
metadataOptions
};
// 搜索所有签名类型
SearchResult result = signature.Search(searchOptions);
// 检查是否找到签名
if (result.Signatures.Count > 0)
{
Console.WriteLine($"\nSource document ['{filePath}'] contains {result.Signatures.Count} signature(s):");
// 按签名类型处理结果
foreach (var foundSignature in result.Signatures)
{
Console.WriteLine($"Signature found: Type: {foundSignature.SignatureType}, Page: {foundSignature.PageNumber}");
// 处理特定签名类型
switch (foundSignature.SignatureType)
{
case SignatureType.Text:
var textSignature = foundSignature as TextSignature;
Console.WriteLine($"Text: '{textSignature.Text}'");
break;
case SignatureType.Barcode:
var barcodeSignature = foundSignature as BarcodeSignature;
Console.WriteLine($"Barcode Type: {barcodeSignature.EncodeType.TypeName}, Text: '{barcodeSignature.Text}'");
break;
case SignatureType.QrCode:
var qrCodeSignature = foundSignature as QrCodeSignature;
Console.WriteLine($"QR Code Type: {qrCodeSignature.EncodeType.TypeName}, Text: '{qrCodeSignature.Text}'");
break;
case SignatureType.Digital:
var digitalSignature = foundSignature as DigitalSignature;
Console.WriteLine($"Certificate: {digitalSignature.Certificate?.SubjectName}, Valid: {digitalSignature.IsValid}");
break;
case SignatureType.Metadata:
var metadataSignature = foundSignature as MetadataSignature;
Console.WriteLine($"Metadata: Name: {metadataSignature.Name}, Value: {metadataSignature.Value}");
break;
}
Console.WriteLine(); // 在签名之间添加换行符
}
}
else
{
Console.WriteLine("No signatures were found in the document.");
}
}
catch (Exception ex)
{
Console.WriteLine($"Error occurred: {ex.Message}");
}
}
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
}
高级多重签名搜索技术
过滤搜索结果
您可以实施高级过滤来缩小搜索结果:
// 按页码过滤结果
var signaturesOnFirstPage = result.Signatures.FindAll(s => s.PageNumber == 1);
// 按签名类型过滤结果
var digitalSignatures = result.Signatures.FindAll(s => s.SignatureType == SignatureType.Digital);
var qrCodeSignatures = result.Signatures.FindAll(s => s.SignatureType == SignatureType.QrCode);
// 过滤包含特定内容的文本签名
var approvalSignatures = result.Signatures
.FindAll(s => s is TextSignature && ((TextSignature)s).Text.Contains("Approved"));
验证多个签名
针对不同的签名类型实现验证逻辑:
bool ValidateAllSignatures(SearchResult result)
{
bool isDocumentValid = true;
// 检查文档是否具有有效的数字签名
bool hasValidDigitalSignature = result.Signatures
.Any(s => s is DigitalSignature && ((DigitalSignature)s).IsValid);
if (!hasValidDigitalSignature)
{
Console.WriteLine("Warning: Document does not contain a valid digital signature");
isDocumentValid = false;
}
// 检查文档是否具有所需的二维码
bool hasRequiredQRCode = result.Signatures
.Any(s => s is QrCodeSignature && ((QrCodeSignature)s).Text.Contains("Auth-Code"));
if (!hasRequiredQRCode)
{
Console.WriteLine("Warning: Document does not contain the required authentication QR code");
isDocumentValid = false;
}
return isDocumentValid;
}
使用自定义处理进行搜索
您可以为搜索操作定义自定义处理逻辑:
// 使用自定义处理创建搜索选项
TextSearchOptions textOptions = new TextSearchOptions
{
AllPages = true,
// 使用委托定义自定义处理
ProcessCompleted = (signature) =>
{
// 自定义验证逻辑 - 仅接受指定页面上的签名
TextSignature textSignature = signature as TextSignature;
return textSignature != null && (textSignature.PageNumber == 1 || textSignature.PageNumber == 2);
}
};
结论
在本指南中,我们探讨了如何使用 GroupDocs.Signature for .NET 在文档中搜索多种签名类型。从设置不同签名类型的搜索选项到处理和验证结果,您现在掌握了在 .NET 应用程序中实现强大签名搜索功能的知识。
同时搜索多种签名类型的功能可增强文档验证流程、强化安全措施并简化文档验证工作流程。GroupDocs.Signature 提供了一个强大而灵活的框架,可用于处理不同文档格式的各种签名类型,使其成为文档处理应用程序的理想选择。
常见问题解答
我可以搜索受密码保护的文档中的签名吗?
是的,GroupDocs.Signature 支持在受密码保护的文档中搜索签名。您可以在初始化时提供密码 Signature
目的:
LoadOptions loadOptions = new LoadOptions { Password = "your_password" };
using (Signature signature = new Signature(filePath, loadOptions))
{
// 搜索签名
}
签名搜索支持哪些文档格式?
GroupDocs.Signature 支持多种文档格式,包括 PDF、Microsoft Office 文档(Word、Excel、PowerPoint)、OpenOffice 格式、图像等。
我可以将搜索限制在文档中的特定页面吗?
是的,每种搜索选项类型都有允许您指定要搜索的页面的属性:
TextSearchOptions options = new TextSearchOptions
{
AllPages = false, // 不要搜索所有页面
PageNumber = 1, // 仅搜索第 1 页
// 或指定多个页面
PagesSetup = new PagesSetup { Pages = new List<int> { 1, 3, 5 } }
};
如何优化在大型文档中搜索时的性能?
对于大型文档,您可以通过以下方式优化性能:
- 将搜索限制在特定页面或页面范围
- 使用更具体的搜索条件来减少潜在匹配的数量
- 在结果显示中实现分页
- 如果不需要同时获得结果,则一次搜索一种签名类型
我可以扩展 GroupDocs.Signature 以支持自定义签名类型吗?
虽然 GroupDocs.Signature 为常见签名类型提供了内置支持,但您可以通过以下方式扩展其功能:
- 创建派生自的自定义搜索选项类
SearchOptions
- 使用实现自定义处理逻辑
ProcessCompleted
代表 - 开发将多个签名搜索与高级业务逻辑相结合的包装类