如何使用iTextSharp 5.5.13为PDF添加签名域?附C#尝试代码
在iTextSharp 5.5.13中为PDF添加签名域的正确实现
我来帮你搞定这个问题,你的代码已经找对了方向,但几个关键细节需要调整,下面是完整可运行的实现方案:
完整代码示例
先确保你已经通过NuGet引用了iTextSharp 5.5.13包,然后使用以下代码:
using System.IO; using iTextSharp.text; using iTextSharp.text.pdf; public void CreatePdfWithSignatureField(string outputFilePath, string signatureFieldName) { // 用using语句自动管理资源,避免文件锁定问题 using (Document document = new Document()) { using (FileStream fs = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write)) { PdfWriter writer = PdfWriter.GetInstance(document, fs); document.Open(); // 先给PDF添加一些示例内容 document.Add(new Paragraph("Hello World!")); // 1. 创建签名域实例 PdfFormField signatureField = PdfFormField.CreateSignature(writer); // 2. 设置签名域名称(注意C#用PascalCase命名,不是Java的小写开头) signatureField.SetFieldName(signatureFieldName); // 3. 指定签名域所在的页码(这里设为第1页) signatureField.SetPage(1); // 4. 定义签名域的位置和尺寸:左下角(72,732)、右上角(144,780),单位是点 Rectangle fieldRect = new Rectangle(72, 732, 144, 780); // 设置签名域的高亮样式为反转效果 signatureField.SetWidget(fieldRect, PdfAnnotation.HIGHLIGHT_INVERT); // 5. 设置字段标志:比如允许打印、标记为必填签名域 signatureField.SetFieldFlags(PdfAnnotation.FLAGS_PRINT | PdfFormField.FF_REQUIRED); // 6. 关键步骤:把签名域添加到PDFWriter中,否则不会显示在文档里 writer.AddAnnotation(signatureField); document.Close(); } } }
核心注意点
- 命名规范:iTextSharp的C#版本遵循PascalCase命名规则,所以是
SetFieldName而非Java风格的setFieldName,这是你原代码里的语法错误。 - 指定页码:
SetPage()必须传入具体页码(比如SetPage(1)),否则签名域无法正确绑定到目标页面。 - 添加注解:一定要调用
writer.AddAnnotation(signatureField),这一步很容易遗漏,没有它签名域不会被写入PDF。 - 字段标志自定义:可以根据需求调整
SetFieldFlags的参数,比如移除FF_REQUIRED就不需要强制签名,添加FLAGS_READ_ONLY可以让签名域在签名后变为只读。 - 资源管理:用
using包裹Document和FileStream,确保文件和资源被正确释放,避免出现文件无法修改或删除的问题。
内容的提问来源于stack exchange,提问作者vinod karampuri
相关产品推荐
相关产品推荐

