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?
Danke und können Sie mir bitte auch sagen, was macht ms.flush()? –
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
Danke !! Es funktionierte :) –