2016-07-11 3 views
0

En utilisant iTextSharp 4.2.0, je l'ai fait la fonction suivante pour générer un fichier PDF factice en mémoire et l'envoyer au client:iTextSharp produit PDF invalide

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; 
} 

qui est appelé à partir d'une fonction statique:

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

qui est appelé à partir d'un contrôleur de 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; 
} 

Si j'ouvre le PDF résultant en Foxit Reader 7. 2, le message d'erreur est "Erreur de format: pas un PDF ou corrompu".

Qu'est-ce que je fais mal ici?

+0

est le fichier lu correctement avec un autre lecteur? Pouvez-vous vérifier la somme MD5? –

Répondre

2

Vous devez fermer le document avant de saisir le tableau d'octets. La fermeture du document efface les tampons internes de "finit" le document. Échangez ceci:

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

Avec ceci:

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