2017-10-09 24 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

あなたはMemoryStreamがまだ完了して刻印PDFを含まないことを意味PdfStamper

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

を閉じる前に、あなたはMemoryStream

reports.Content = ms.ToArray(); 

の内容を取得。

したがって、コマンドの順序を変更してください。具体的には、msからバイトを取得する前にstamperを閉じてください。

脇に:stamper!= nullをチェックする理由は何ですか?明らかに、nullにはできません。

+0

ありがとうございます。また、ms.flush()は何をしていますか教えてください。 –

+0

'MemoryStream'の' 'flush'' ...本質的にはNOP ...無操作呼び出しだと思います。コンテンツがターゲット媒体に書き込まれる前に内部バッファを有するいかなるストリームにおいても「フラッシュ」は意味を成すが、RAMメモリが既にターゲット媒体である「メモリストリーム」では意味を成さない。 – mkl

+0

ありがとう!!出来た :) –

関連する問題