2016-07-11 2 views
0

Использование itextsharp 4.2.0, я сделал следующую функцию для создания фиктивного PDF в памяти и отправить его обратно к клиенту:iTextSharp производит недействителен PDF

internal override byte[] GeneratePDFDocument(pdfContent content) 
{ 
    Document document = new Document(PageSize.A4, 30f, 30f, 30f, 30f); 

    MemoryStream output = new MemoryStream(); 
    PdfWriter writer = PdfWriter.GetInstance(document, output); 
    document.Open(); 
    document.Add(new Paragraph("Hello World")); 
    byte[] response = output.ToArray(); 
    document.Close(); 
    return response; 
} 

которая вызывается из статической функции:

public static byte[] Print(string jsonData) 
{ 
    PDFGeneratorBase generator; 
    generator = new ITextSharpGenerator(); 
    return generator.GeneratePDFDocument(view.GetViewData()); 
} 

, который вызывается из контроллера WebAPI:

public HttpResponseMessage PrintPDF(HttpRequestMessage req) 
{ 
    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 
    byte[] pdfData = PrintReport.Print(printJobString); 
    result.Content = new ByteArrayContent(pdfData); 
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf"); 
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
    result.Content.Headers.ContentDisposition.FileName = "PrintPDF.pdf"; 
    return result; 
} 

Если открыть полученный PDF в Foxit Reader 7. 2, сообщение об ошибке «Ошибка формата: не PDF или поврежден».

Что я здесь делаю неправильно?

+0

ли файл правильно читать с другим читателем? Можете ли вы проверить сумму MD5? –

ответ

2

Перед захватом массива байтов необходимо закрыть документ. Закрытие документа очищает внутренние буферы от «завершения» документа. Поменяйте это:

byte[] response = output.ToArray(); 
document.Close(); 

с этим:

document.Close(); 
byte[] response = output.ToArray();