我正在研究这个功能,它从数据库中获取pdf,并使用需要从数据库中检索的签名图像对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
}
}
我在这里做错了什么?
答案 0 :(得分:1)
您检索MemoryStream
reports.Content = ms.ToArray();
关闭PdfStamper
if(stamper!= null)
stamper.Close();
表示MemoryStream
尚未包含完整标记的PDF。
因此,在从stamper
检索字节之前,更改命令的顺序,特别是关闭ms
。
暂且不说:为什么要检查stamper!= null
?显然不能null
那里......