我正在使用iTextSharp处理PDF。我想将签名图像添加到签名字段,而不对文档进行数字签名(不涉及证书)。
有可能吗?我可以使用数字签名,但我也想在签名字段上添加签名图像而不使用证书。
更新
立即写信我有以下代码。
// 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中关闭
答案 0 :(得分:7)
您正在使用代码对您不想进行数字签名的PDF进行数字签名; - )
如果文档已经签名,添加任何额外内容(例如图像)将破坏签名,但如果文档尚未签名,则您有不同的选项。
您需要以正常的方式使用PdfStamper
,即:不是使用CreateSignature()
方法,而是使用我chapter 6中描述的方式关于iText的书。您还需要确定(1)图像是否是签名字段的一部分(在这种情况下,当PDF实际签名时它将消失)或(2) 图像需要作为内容流的一部分添加(在这种情况下,一旦您签署文档,它仍将存在)。
如果是(1),请查看my book about digital signatures的代码示例2.6和代码示例2.7(请参阅CreateEmptyField示例了解C#版本的码)。在代码示例2.6中,您将学习如何使用自定义PdfFormField
创建PdfAppearance
。在代码示例2.7中,您将学习如何使用PdfStamper
将签名字段添加到现有文档。在您的情况下,您将删除现有的签名字段(使用removeField()
方法),并将其替换为具有完全相同坐标的不同外观的新PdfFormField
。
如果是(2),您只需创建一个Image
对象,然后将其添加到使用{PdfContentByte
检索到的PdfStamper
{1}}方法。请参阅examples of chapter 6获取灵感。
在这两种情况下,您都需要知道两种情况下的坐标和页码。可以像这样检索此信息:
GetOverContent()
你会得到这样的页面:AcroFields form = stamper.AcroFields;
AcroFields.FieldPosition f = form.GetFieldPositions("mySigName")[0];
和f.page
定义这样的位置:Rectangle
。
由于我们不确切知道您需要哪种类型的最终结果,因此很难详细介绍。代码中最重要的错误是您使用f.position
方法获取CreateSignature()
对象,而您不想签署文档。
答案 1 :(得分:3)
这是我添加无签名签名字段的方式
public void buildPDFMemoSignature(string DocName, BuildableDoc docBuild)
{
using (var ms = new MemoryStream())
{
var doc = new Document(PageSize.A4, 20f, 10f, 30f, 0f);
{
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
doc.Open();
try
{
// add stuff to your PDF
// Signature is added here ***************
PdfFormField field = PdfFormField.CreateSignature(writer);
field.SetWidget(new iTextSharp.text.Rectangle(190, 730, 440, 650), PdfAnnotation.HIGHLIGHT_NONE);
//Rectangle(float llx, float lly, float urx, float ury)
field.FieldName = "mySig";
field.Flags = PdfAnnotation.FLAGS_PRINT;
field.SetPage();
field.MKBorderColor = BaseColor.BLACK;
field.MKBackgroundColor = BaseColor.WHITE;
PdfAppearance tp = PdfAppearance.CreateAppearance(writer, 72, 48);
tp.Rectangle(0.5f, 0.5f, 71.5f, 47.5f);
tp.Stroke();
field.SetAppearance(PdfAnnotation.APPEARANCE_NORMAL, tp);
writer.AddAnnotation(field);
}
catch (Exception ex)
{
//exceptions
}
finally
{
doc.Close();
}
}