2010-09-30 13 views
2

Je génère pdf using itexsharp. Je crée MemoryStream, puis quand j'essaye d'écrire MemoryStream octets dans la réponse, mais pas de chance. Lorsque j'exécute ce code dans mon contrôleur, le pdf ne répond pas. Le flux de mémoire est populaitng correctement je peux voir ceci dans le débogueur, mais pour une raison quelconque ce nombre de butes ne venant pas en réponse.MVC. Itextsharp écrire pdf à la réponse

Voici mon code:

 HttpContext.Current.Response.ContentType = "application/pdf"; 
     ... 
     using (Stream inputPdfStream = new FileStream(pdfFilePath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
     using (Stream outputPdfStream = new MemoryStream()) 
     { 
      PdfReader reader = new PdfReader(inputPdfStream); 
      PdfStamper stamper = new PdfStamper(reader, outputPdfStream); 
      .... 

      //try one 
      outputPdfStream.WriteTo(HttpContext.Current.Response.OutputStream); // NOT POPULATING Response 
      //try two 
      HttpContext.Current.Response.BinaryWrite(outputPdfStream.ToArray()); // NOT POPULATING Response Too 

      HttpContext.Current.Response.End(); 
     } 

Peut être quelqu'un a des idées?

+0

Avez-vous quelque chose dans la réponse? – BlackICE

+0

Oui, quelques octets, mais pas les octets de mon pdf – Cranik

+0

J'aurais posté un exemple plus simple, n'incluant pas l'inputPdfStream qui est un autre fichier pdf donc ça mène à la confusion. Juste la sortie MemoryStream comme le flux pour l'instance de PdfWriter, un document.open(), un document.Add (..) et un document.close(). Puis la question se réduit à "Je veux envoyer dans la réponse le pdf contenu dans la sortie MemoryStream.Comment? ..." – mmutilva

Répondre

0

Probablement, le flux de mémoire est toujours positionné à la position après le dernier octet écrit. Il écrira tous les octets de la position actuelle (ce qui est aucun). Si vous faites outputPdfStream.Seek(0), la position sera ramenée au premier octet et le contenu de l'ensemble du flux sera écrit dans la sortie de la réponse. Quoi qu'il en soit, comme le dit Dean, vous devriez simplement utiliser la méthode Reponse.WriteFile.

3

Pourriez-vous pas utiliser

Response.ContentType = "application/pdf" 
Response.AddHeader("Content-Type", "application/pdf") 
Response.WriteFile(pdfFilePath) 
Response.End() 
+0

Dans la question d'origine, il lit un pdf en entrée d'un FileStream et génère un autre pdf en sortie dans un MemoryStream, ce pdf dans le MemoryStream est ce qui doit être envoyé dans le contenu de la réponse. Pourquoi le "Response.WriteFile (pdfFilePath)" alors? – mmutilva

1

Vous devez utiliser la méthode FileContentResult Controller.File(byte[] content, string contentType):

public ActionResult GeneratePDF() 
{ 
    var outputStream = new MemoryStream(); // This will hold the pdf you want to send in the response 

    /* 
    * ... code here to create the pdf in the outputStrem 
    */ 

    return File(outputStream.ToArray(), "application/pdf"); 
} 

Source: Building PDFs in Asp.Net MVC 2.