在PDF上添加签名图像,而无需使用iTextSharp对其进行数字签名

 我爱盘小静永远永远 发布于 2023-02-09 14:13

我正在使用iTextSharp来处理PDF.我想在Signature字段中添加签名图像,而不对文档进行数字签名(不需要任何证书参与).

可能吗?我能够使用数字签名但我还想在签名字段上添加签名图像而不使用任何证书.

更新:

现在写我有以下代码.

// Set PDF Reader and PDF Stamper
PdfReader reader = new PdfReader(sourceDocument);

// File stream where PDF will write
FileStream fout = new FileStream(destinationPath, FileMode.Create, FileAccess.ReadWrite);
PdfStamper stamper = PdfStamper.CreateSignature(reader, fout, '\0', null, true);

// Set PDF Appearance              
PdfSignatureAppearance appearance = stamper.SignatureAppearance;
iTextSharp.text.Image signatureFieldImage = iTextSharp.text.Image.GetInstance(image, System.Drawing.Imaging.ImageFormat.Png);
appearance.SignatureGraphic = signatureFieldImage;
appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC;
appearance.SetVisibleSignature(signatureFieldName);

stamper.Close();
reader.Close();
fout.Close();

但是当我尝试运行它时,会出现以下错误:

签名定义.必须在PdfSignatureAppearance中关闭

Bruno Lowagi.. 8

您正在使用代码对您不想进行数字签名的PDF进行数字签名;-)

如果文档已经签名,则添加任何额外内容(例如图像)将破坏签名,但如果文档尚未签名,则您有不同的选项.

你需要使用PdfStamper 正常的方式,即:不是通过使用CreateSignature()方法,而是我在本书第6章中描述的关于iText的方式.您还需要确定(1)图像是签名字段的一部分(在这种情况下,当PDF实际签名时它将消失)或(2)图像需要作为一部分添加时,这一点很重要.内容流(在这种情况下,一旦您签署文档,它仍将存在).

(1)的情况下,请查看我的书中关于数字签名的代码示例2.6和代码示例2.7 (请参阅代码的C#版本的CreateEmptyField示例).在代码示例2.6中,您将学习如何PdfFormField使用自定义创建PdfAppearance.在代码示例2.7中,您将学习如何使用签名字段添加到现有文档PdfStamper.在您的情况下,您将删除现有的签名字段(使用该removeField()方法)并将其替换为具有PdfFormField完全相同坐标的不同外观的新字段.

(2)的情况下,您将只创建一个Image对象并将其添加到使用该方法PdfContentByte检索的对象中.请参阅第6章的示例以获取灵感.PdfStamperGetOverContent()

在这两种情况下,您都需要知道两种情况下的坐标和页码.可以像这样检索此信息:

AcroFields form = stamper.AcroFields;
AcroFields.FieldPosition f = form.GetFieldPositions("mySigName")[0];

你会得到这样的页面:f.pageRectangle定义这样的位置:f.position.

由于我们不确切知道您需要哪种类型的最终结果,因此很难详细介绍.代码中最重要的错误是您使用该CreateSignature()方法获取PdfStamper对象,而您不想签署文档.

1 个回答
  • 您正在使用代码对您不想进行数字签名的PDF进行数字签名;-)

    如果文档已经签名,则添加任何额外内容(例如图像)将破坏签名,但如果文档尚未签名,则您有不同的选项.

    你需要使用PdfStamper 正常的方式,即:不是通过使用CreateSignature()方法,而是我在本书第6章中描述的关于iText的方式.您还需要确定(1)图像是签名字段的一部分(在这种情况下,当PDF实际签名时它将消失)或(2)图像需要作为一部分添加时,这一点很重要.内容流(在这种情况下,一旦您签署文档,它仍将存在).

    (1)的情况下,请查看我的书中关于数字签名的代码示例2.6和代码示例2.7 (请参阅代码的C#版本的CreateEmptyField示例).在代码示例2.6中,您将学习如何PdfFormField使用自定义创建PdfAppearance.在代码示例2.7中,您将学习如何使用签名字段添加到现有文档PdfStamper.在您的情况下,您将删除现有的签名字段(使用该removeField()方法)并将其替换为具有PdfFormField完全相同坐标的不同外观的新字段.

    (2)的情况下,您将只创建一个Image对象并将其添加到使用该方法PdfContentByte检索的对象中.请参阅第6章的示例以获取灵感.PdfStamperGetOverContent()

    在这两种情况下,您都需要知道两种情况下的坐标和页码.可以像这样检索此信息:

    AcroFields form = stamper.AcroFields;
    AcroFields.FieldPosition f = form.GetFieldPositions("mySigName")[0];
    

    你会得到这样的页面:f.pageRectangle定义这样的位置:f.position.

    由于我们不确切知道您需要哪种类型的最终结果,因此很难详细介绍.代码中最重要的错误是您使用该CreateSignature()方法获取PdfStamper对象,而您不想签署文档.

    2023-02-09 14:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有