2013-12-18 102 views
4

我正在使用iTextSharp处理PDF。我想将签名图像添加到签名字段,而不用数字签署文档(不需要任何证书)。在PDF上添加签名图像时未使用iTextSharp对其进行数字签名

可能吗?我能够使用数字签名,但我也想在签名域中添加签名图像而不使用任何证书。

UPDATE:

写我现在下面的代码。

// 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(); 

但是当我尝试运行它,它提供了以下错误:

Signature defined. Must be closed in PdfSignatureAppearance

+0

当你添加一个外观到签名现场,签名栏仍显示(在签名选项卡)为未使用。你觉得可以吗? – mkl

+0

是的,那会好的。我只想在其中一个案例中显示签名图像。 – rizzz86

+0

@mkl请查看更新后的帖子。 – rizzz86

回答

6

您正在使用的代码,你不希望数字签名PDF数字签名;-)

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

您需要使用PdfStamper正常方式,那就是:无法通过使用CreateSignature()方法,但它的方式在我的关于iText的书chapter 6描述。您还需要决定图像是否为签名字段的一部分(在这种情况下,在PDF实际签名时它将消失)或(2)图像是否需要添加是否很重要作为内容流的一部分(在这种情况下,一旦签署文档,它仍然会在那里)。

的情况下(1),请看看代码示例2.6和代码示例的my book about digital signatures 2.7(见代码的C#版本CreateEmptyField例子)。在代码示例2.6中,您将学习如何使用自定义PdfAppearance创建PdfFormField。在代码示例2.7中,您将学习如何使用PdfStamper将签名字段添加到现有文档。在你的情况下,你会删除现有的签名字段(使用removeField()方法),并用一个新的PdfFormField替换它,并在完全相同的坐标下显示不同的外观。

(2),你只创建一个Image对象并使用GetOverContent()方法把它添加到从PdfStamper检索到的情况下PdfContentByte。请参阅examples of chapter 6以获取灵感。

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

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

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

由于我们不知道您需要哪种类型的最终结果,因此很难进行更多细节分析。代码中最重要的错误是您使用CreateSignature()方法获取PdfStamper对象,而您不想签署文档。

+0

谢谢@布鲁诺它为我工作。我已经使用GetOverContent()方法在PDF上显示我的图像。 – rizzz86

+0

*你的情况,你会删除现有的签名领域(使用removeField()方法)并将其替换* - 如果有人这样做,请小心;如果您的原始签名字段包含特殊设置,例如锁定字典或种子值,只需更换字段将丢弃该信息。您还必须复制相关参考。 – mkl

+0

我不是删除签名字段,而是使用FLAGS_HIDDEN注释来隐藏它。我稍后需要签名字段名称。 – rizzz86

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(); 
        } 
} 
+0

这不能成为一个工作示例......您不使用在方法中传递的任何参数... – Zack

相关问题