Вы должны закрыть документ.Попробуйте вот так:
public ActionResult PDFGenerator()
{
var doc = new Document();
using (var stream = new MemoryStream())
{
var writer = PdfWriter.GetInstance(doc, stream);
doc.Open();
doc.Add(new Paragraph("Hello"));
doc.Close();
return File(stream.ToArray(), "application/pdf", "test.pdf");
}
}
Но это безобразно.Я бы порекомендовал вам более MVCish подход, который заключается в написании собственного ActionResult.Дополнительным преимуществом этого является то, что ваши действия контроллера будут проще выполнять модульное тестирование в отдельности:
public class PdfResult : FileResult
{
public PdfResult(): base("application/pdf")
{ }
public PdfResult(string contentType): base(contentType)
{ }
protected override void WriteFile(HttpResponseBase response)
{
var cd = new ContentDisposition
{
Inline = false,
FileName = "test.pdf"
};
response.AppendHeader("Content-Disposition", cd.ToString());
var doc = new Document();
var writer = PdfWriter.GetInstance(doc, response.OutputStream);
doc.Open();
doc.Add(new Paragraph("Hello"));
doc.Close();
}
}
, а затем в действии вашего контроллера:
public ActionResult PDFGenerator()
{
return new PdfResult();
}
Конечно, это можетсделайте еще один шаг и пусть этот PdfResult
примет модель представления в качестве аргумента конструктора и сгенерирует PDF на основе некоторых свойств этой модели представления:
public ActionResult PDFGenerator()
{
MyViewModel model = ...
return new PdfResult(model);
}
Теперь все начинает выглядеть красиво.