2017-10-09 4 views
1

Ich arbeite an dieser Funktion, die ein PDF aus einer Datenbank nimmt und die PDF mit einem Bild der Signatur signiert, die aus der Datenbank abgerufen werden muss. Ich benutze iTextSharp dafür, aber irgendwie funktioniert es nicht und korrumpiert mein PDF in der Datenbank.Itextsharp PDF wird beschädigt

Dies ist der Code meines Controller

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 

    } 
} 

Was ich hier falsch mache?

Antwort

1

Sie rufen den Inhalt der MemoryStream

reports.Content = ms.ToArray(); 

, bevor Sie die PdfStamper

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

schließen, die die MemoryStream bedeutet noch nicht die komplette gestanzten PDF enthalten.

So ändern Sie die Reihenfolge der Befehle, insbesondere schließen Sie die stamper vor dem Abrufen der Bytes von ms.

Als beiseite: Warum überprüfen Sie stamper!= null? Es kann natürlich nicht sein null da ...

+0

Danke und können Sie mir bitte auch sagen, was macht ms.flush()? –

+0

Ein "Flush" von einem 'MemoryStream' ... Ich würde annehmen, dass im Wesentlichen ein NOP ... ein No-Operation-Aufruf ist. Ein 'flush' ist in jedem Stream mit einem internen Puffer sinnvoll, bevor Inhalt auf das Zielmedium geschrieben wird, aber nicht mit einem' MemoryStream', bei dem RAM-Speicher bereits das Zielmedium ist. – mkl

+0

Danke !! Es funktionierte :) –