Itextsharp PDF遭到破坏

时间:2017-10-09 06:58:00

标签: c# asp.net-mvc pdf itext

我正在研究这个功能,它从数据库中获取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

    }
}

我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您检索MemoryStream

的内容
reports.Content = ms.ToArray();

关闭PdfStamper

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

表示MemoryStream尚未包含完整标记的PDF。

因此,在从stamper检索字节之前,更改命令的顺序,特别是关闭ms

暂且不说:为什么要检查stamper!= null?显然不能null那里......