2013-12-18 105 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

相關問題