maandag 20 oktober 2008

Met het downloaden van PDF-bestanden als Response in je ASP.NET-pagina's kun je nogal wat problemen tegenkomen. Wij hadden een goed werkende manier hiervoor, maar die wilde plotseling niet helemaal goed meer werken.

Het volgende stukje code laat grofweg zien wat wij altijd hebben gedaan om een Stream als PDF-Response te versturen in ASP.NET:

Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename;
Response.BinaryWrite(outputStream.ToArray());

// filename is een string met de bestandsnaam
// outputStream is een MemoryStream met daarin de PDF-inhoud

We krijgen we dan een venster met daarin de vraag of we het bestand willen openen, willen opslaan of dat we willen annuleren.

Bij een recent project dat we van ASP.NET 1.1 hebben omgezet naar ASP.NET 3.5 begonnen plotseling de problemen. In IE7 werkte alles nog goed, in Firefox werkte het ook nog naar behoren, maar in IE6 traad een vreemd probleem op. Bij het direct openen van het bestand kregen we de volgende foutmelding in Adobe Reader: "There was an error opening this document. This file cannot be found.". Als we het bestand echter eerst opsloegen en daarna openden dan was er geen vuiltje aan de lucht.

De oplossing bleek achteraf erg simpel. Slechts één regel code toevoegen:

Response.ClearHeaders();

De volledige code zier er dan als volgt uit:

Response.Clear();
Response.ClearHeaders();
Response.ContentType = "application/pdf"
Response.AddHeader("Content-Disposition", "attachment; filename=" + filename;
Response.BinaryWrite(outputStream.ToArray());

// filename is een string met de bestandsnaam
// outputStream is een MemoryStream met daarin de PDF-inhoud

2 Comments:

  1. Unknown said...
    Ik heb nog steeds hetzelfde probleem en krijg het maar niet opgelost in IE6...

    System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
    response.Clear();
    response.ClearHeaders();
    response.ContentType = "application/pdf";
    response.AddHeader( "Content-Disposition", "attachment; filename=" + pdfName + ".pdf" ); response.BinaryWrite( downloadBytes );
    response.Flush();
    response.End();

    downloadBytes is een array van bytes. Ik maak trouwen gebruik van Winnovative om een dynamisch gegenereerde pagina om te zetten naar PDF.
    Anoniem said...
    Zoals je merkt, kijken we niet al te vaak meer op dit blog, maar toch een reactie.
    Mogelijk dat IE6 ergens niet goed mee omgaat. Je zou eens verder moeten zoeken. Misschien dat IE6 niet om kan gaan met "attachment".

Post a Comment