2017-10-09 175 views
1

我正在研究此功能,它從數據庫中獲取PDF並用需要從數據庫中檢索的簽名圖像簽署PDF。我爲此使用iTextSharp,但不知何故,它不起作用,正在破壞我的數據庫中的PDF。Itextsharp PDF遭到損壞

這是我的控制器

public ActionResult Approve(int? id) 
{ 
    ApplicationUser users = db.Users.Find(User.Identity.GetUserId()); 
    Reports reports = db.Reports.Find(id); 

    if (reports == null || users == null) return View(); 

    byte[] content = reports.Content; 
    byte[] signature = users.Signature; 

    iTextSharp.text.Image sigImg = iTextSharp.text.Image.GetInstance(signature); 

    PdfReader reader = new PdfReader(content); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     PdfStamper stamper = new PdfStamper(reader, ms); 

     sigImg.SetAbsolutePosition(0f,0f); 

     sigImg.ScalePercent(90.0f); // 100.0f == same size 


     //Give some space after the image 
     sigImg.SpacingAfter = 1f; 
     sigImg.Alignment = Element.ALIGN_BOTTOM; 

     PdfContentByte over = stamper.GetOverContent(1); 

     over.AddImage(sigImg); 

     reports.Content = ms.ToArray(); 
     content = reports.Content; 

     ms.Flush(); 
     db.SaveChanges(); 
     if(stamper!= null) 
      stamper.Close(); 
     if(reader!= null) 
      reader.Close(); 

     return File(content, "application/pdf"); 

     // Clean up 

    } 
} 

的我在做什麼錯在這裏的代碼?

回答

1

您關閉PdfStamper

if(stamper!= null) 
    stamper.Close(); 

這意味着MemoryStream還沒有包含完整的衝壓PDF之前,您檢索的MemoryStream

reports.Content = ms.ToArray(); 

內容。

因此,在從ms中檢索字節之前,更改命令的順序,特別是關閉stamper

另一方面:爲什麼要檢查stamper!= null?它顯然不可能是null那裏...

+0

謝謝,你還可以告訴我什麼ms.flush()做什麼? –

+0

'MemoryStream'的'flush' ...我會假定實質上是一個NOP ...一個無操作的調用。在將內容寫入目標介質之前,對於具有內部緩衝區的任何流而言,「flush」是有意義的,但對於其中RAM存儲器已經是目標介質的「MemoryStream」不具有「MemoryStream」。 – mkl

+0

謝謝!有效 :) –