PDF 已签名后编辑数字签名是常见需求,尤其是在业务规则更改或需要重新定位签名时。GroupDocs.Signature Cloud SDK for .NET 提供了强大的库,使您能够以编程方式编辑已签名 PDF 文件中的签名,而不会影响文档的有效性。本指南将逐步带您完成完整实现,涵盖从配置到下载更新文件的所有内容,让您能够自信地将签名编辑集成到 C# 应用程序中。

完整代码示例:编辑已签名 PDF 中的签名

以下示例演示如何使用 GroupDocs.Signature Cloud SDK for .NET 编辑已签名 PDF 中的签名。

using System;
using System.Collections.Generic;
using System.IO;
using GroupDocs.Signature.Cloud.Sdk.Api;
using GroupDocs.Signature.Cloud.Sdk.Client;
using GroupDocs.Signature.Cloud.Sdk.Model;
using GroupDocs.Signature.Cloud.Sdk.Model.Requests;

class Program
{
    static void Main()
    {
        // Configuration
        var config = new Configuration
        {
            ClientId = "YOUR_CLIENT_ID",
            ClientSecret = "YOUR_CLIENT_SECRET"
        };

// API instances
        var signatureApi = new SignatureApi(config);
        var storageApi = new StorageApi(config);

// File paths
        string inputFilePath = "input.pdf";
        string outputFilePath = "output.pdf";

// Ensure file exists in storage (upload if needed)
        if (!storageApi.ObjectExists(new ObjectExistsRequest(new StorageExist
        {
            Path = inputFilePath,
            StorageName = null
        })).Exists)
        {
            using (var fileStream = File.OpenRead(inputFilePath))
            {
                storageApi.UploadFile(new UploadFileRequest(new UploadFile
                {
                    Path = inputFilePath,
                    File = fileStream
                }));
            }
        }

// Get list of signatures in the document
        var fileInfo = new FileInfo
        {
            FilePath = inputFilePath,
            StorageName = null,
            Password = null
        };
        var getSignaturesRequest = new GetSignaturesRequest(new GetSignaturesOptions
        {
            FileInfo = fileInfo
        });
        var signaturesResponse = signatureApi.GetSignatures(getSignaturesRequest);
        if (signaturesResponse.Signatures == null || signaturesResponse.Signatures.Count == 0)
        {
            Console.WriteLine("No signatures found.");
            return;
        }

// Choose first signature to edit
        var signatureToEdit = signaturesResponse.Signatures[0];
        string signatureId = signatureToEdit.SignatureId;

// Prepare new options (example: change text signature)
        var textOptions = new SignTextOptions
        {
            // Keep existing properties, modify as needed
            Text = "Edited Signature Text",
            Left = signatureToEdit.Left + 10,
            Top = signatureToEdit.Top + 10,
            Width = signatureToEdit.Width,
            Height = signatureToEdit.Height,
            Font = new SignatureFont
            {
                FontFamily = "Arial",
                FontSize = 12,
                Bold = true,
                Italic = false,
                Underline = false,
                Color = "FF0000"
            },
            // Preserve other required fields
            SignatureId = signatureId,
            PageNumber = signatureToEdit.PageNumber,
            // Set output file path
            OutputFilePath = outputFilePath
        };

var updateSignatureRequest = new UpdateSignatureRequest(new UpdateSignatureOptions
        {
            FileInfo = fileInfo,
            SignatureId = signatureId,
            Options = textOptions
        });

var updateResponse = signatureApi.UpdateSignature(updateSignatureRequest);

// Download updated file
        var downloadRequest = new DownloadFileRequest(new DownloadFile
        {
            Path = outputFilePath,
            StorageName = null
        });
        using (var downloadStream = storageApi.DownloadFile(downloadRequest))
        using (var fileStream = File.Create(outputFilePath))
        {
            downloadStream.CopyTo(fileStream);
        }

Console.WriteLine("Signature edited and saved to " + outputFilePath);
    }
}

注意: 此代码示例演示了核心功能。在项目中使用之前,请确保更新所有文件路径和配置值以匹配实际环境,验证已正确安装所有必需的依赖项,并在开发环境中彻底测试。如果遇到任何问题,请参阅官方文档或联系支持团队获取帮助。

cURL 命令用于通过 REST API 编辑签名

下面是一组 cURL 命令,用于通过 REST API 执行相同的在已签名 PDF 中编辑签名的操作。

首先,获取访问令牌。

curl -X POST "https://api.groupdocs.cloud/v2.0/oauth2/token" \
     -H "Content-Type: application/json" \
     -d '{
           "grant_type":"client_credentials",
           "client_id":"YOUR_CLIENT_ID",
           "client_secret":"YOUR_CLIENT_SECRET"
         }'

将源 PDF 上传到云存储。

curl -X PUT "https://api.groupdocs.cloud/v2.0/storage/file/input.pdf" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -H "Content-Type: application/octet-stream" \
     --data-binary "@input.pdf"

更新第一个签名(示例修改文本签名)。

curl -X POST "https://api.groupdocs.cloud/v2.0/signature/update" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{
           "fileInfo": {
               "filePath": "input.pdf"
           },
           "signatureId": "SIGNATURE_ID_FROM_GET",
           "options": {
               "text": "Edited Signature Text",
               "left": 120,
               "top": 150,
               "font": {
                   "fontFamily": "Arial",
                   "fontSize": 12,
                   "bold": true,
                   "color": "FF0000"
               },
               "outputFilePath": "output.pdf"
           }
         }'

下载更新的 PDF。

curl -X GET "https://api.groupdocs.cloud/v2.0/storage/file/output.pdf" \
     -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
     -o output.pdf

欲了解更多详情,请参阅官方 API 文档

了解 C# 中的签名修改

以下是对提供的 C# 代码如何实现已签名 PDF 工作流中编辑签名的简要说明。

  1. 配置身份验证 - Configuration 对象使用 ClientIdClientSecret 填充。这建立了与云服务的安全会话。
var config = new Configuration { ClientId = "YOUR_CLIENT_ID", ClientSecret = "YOUR_CLIENT_SECRET" };
  1. 创建 API 实例 - SignatureApiStorageApi 使用配置实例化,提供对签名相关和存储相关端点的访问。
var signatureApi = new SignatureApi(config);
var storageApi = new StorageApi(config);
  1. Upload If Missing - 代码检查 input.pdf 是否存在于云存储中;如果不存在,则使用 UploadFile 上传文件。这确保后续操作拥有源文档。
storageApi.UploadFile(new UploadFileRequest(new UploadFile { Path = inputFilePath, File = fileStream }));
  1. 检索现有签名 - GetSignatures 获取文档中的所有签名。选择第一个签名进行编辑,并存储其 SignatureId
var signaturesResponse = signatureApi.GetSignatures(getSignaturesRequest);
var signatureToEdit = signaturesResponse.Signatures[0];
  1. 准备更新的选项 - 创建一个新的 SignTextOptions 对象,复制现有属性并更改文本、位置和字体。SignatureIdPageNumber 被保留,以定位正确的签名。
var textOptions = new SignTextOptions { Text = "Edited Signature Text", Left = signatureToEdit.Left + 10, /* ... */ };
  1. Execute Update - UpdateSignature 将修改后的选项发送到服务器,服务器会重新写入签名,同时保持 PDF 的其他部分不变。

    var updateResponse = signatureApi.UpdateSignature(updateSignatureRequest);
    
  2. Download Result - 最后,已更新的 PDF 从存储下载到本地文件系统。

using (var downloadStream = storageApi.DownloadFile(downloadRequest))

如需完整的类和方法列表,请参阅 API 参考

环境准备

在编写任何代码之前,请准备好您的开发环境。

  1. 通过 NuGet 安装 SDK
dotnet add package GroupDocs.signature-Cloud

您也可以从发布页面下载最新的包。

  1. 设置 .NET 运行时 - 该库需要 .NET 6.0 或更高版本。确保您的项目针对兼容的框架。

  2. 创建 GroupDocs Cloud 账户 - 在 GroupDocs 门户注册并获取您的 ClientIdClientSecret。这些凭证在每次 API 调用时都需要。

  3. Configure Credentials - 安全地存储凭据,例如在 appsettings.json 或环境变量中,并在构建 Configuration 对象时引用它们。

  4. 验证连接性 - 运行一个简单的请求(例如,storageApi.ObjectExists),以确认您的凭据有效且服务可访问。

完成这些步骤后,您可以运行代码示例并开始编辑签名。

结论

在已签名的 PDF 文档中编辑签名非常简单,只需使用 GroupDocs.Signature Cloud SDK for .NET。按照上述步骤,您可以定位现有签名,修改其视觉属性,并在 C# 应用程序中保持文档完整性。请记得为生产环境获取合适的许可证;您可以购买完整许可证或从临时许可证页面获取临时许可证。立即开始集成签名编辑,简化文档工作流。

常见问题

  • 我可以在已签名的 PDF 中编辑签名而不破坏签名的有效性吗?
    是的。SDK 仅更新可视化表示,同时保持加密哈希不变,因此文档仍然有效。

  • 编辑已签名 PDF 中的签名 与 在 .NET 中编辑已签名 PDF 中的签名 有何区别?
    前者描述通用操作,而后者强调实现使用 .NET 版本的 GroupDocs.Signature Cloud SDK。

  • 我需要在编辑签名后重新签署 PDF 吗?
    不需要。SDK 会修改现有签名对象的外观;原始数字签名保持不变。

  • 是否有可下载的示例项目?
    是的,完整的示例可在 GitHub 仓库中获取:https://github.com/groupdocs-signature-cloud/groupdocs-signature-cloud-dotnet.

Read More