2010-01-13 8 views
17

In poche parole, vorrei che qualcuno fosse in grado di fare clic su un collegamento e ottenere un pdf utilizzabile una sola volta. Abbiamo la libreria per creare file PDF, quindi non è un problema.Come posso restituire un pdf da una richiesta Web in ASP.NET?

Potremmo generare un collegamento a una pagina di aspx, fare in modo che quella pagina generi il pdf, salvare il pdf nel file system e quindi Response.Redirect nel PDF salvato. Quindi dovremmo in qualche modo tenere traccia e ripulire il file PDF.

Dato che non abbiamo mai bisogno di conservare questi dati, quello che vorrei fare, se possibile, è di avere la pagina di aspx che genera il pdf e di servirlo direttamente come risposta alla richiesta originale . È possibile?

(Nel nostro caso, stiamo usando C#, e vogliamo servire un pdf torna, ma sembra che qualsiasi soluzione sarebbe probabilmente funzionerà per vari linguaggi .NET e restituito tipi di file.)

+0

duplicato esatto: http://stackoverflow.com/questions/177/how-do-i-programmatically-create-a-pdf-in-my-net-application – RedFilter

+3

Non duplicazione di quanto sopra in alcun significato. – nothrow

+0

(Sapevo che stavo per convincere una coppia di persone a chiudere in segreto, indicando quel tipo di domanda ... ed è per questo che ho incluso la seconda frase. Avrei dovuto fare la prima frase :)) – Beska

risposta

30

si può Assumendo ottieni un byte[] che rappresenta il tuo PDF:

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-Disposition", 
    "attachment;filename=\"FileName.pdf\""); 

Response.BinaryWrite(yourPdfAsByteArray); 

Response.Flush(); 

Response.End(); 
+1

Questo sembra molto promettente ... ho pensato sarebbe qualcosa in questo senso, ma non hanno lo sfondo per conoscere i dettagli. Grazie per la risposta; Proverò questo tatto. – Beska

+0

Questo ha inchiodato il problema con precisione. Grazie! – Beska

+0

Una domanda correlata (forse dovrei aprire una domanda separata, ma è strettamente correlata a questa risposta ...) Perché Response.Flush()? Quando abbiamo quella linea e qualcuno chiude il browser dopo aver effettuato la richiesta, viene visualizzato un errore: "L'host remoto ha chiuso la connessione."Se lasciamo questa linea, nessun errore, e tutto * sembra * funzionare.Lettura dei documenti MSDN non mi ha illuminato sul fatto che fosse strettamente necessario. Pensieri? – Beska

2

Guarda come funziona HTTP. Il client (= browser) non si basa su estensioni, vuole solo che il server restituisca alcuni metadati insieme al documento.

I metadati possono essere aggiunti con Response.AddHeader e una "riga di metadati" è composta da Nome e Valore.

Content-Type è la proprietà che ti interessa e il valore è il tipo MIME dei dati (studio: RFC1945 per intestazioni HTTP, google per tipo MIME).

Per le pagine ordinali di aspx (html, ....) la proprietà è 'text/html' (non così banale, ma per questo esempio è sufficiente.). Se restituisci l'immagine JPG, può avere il nome 'image.gif', ma finché si invia 'image/jpeg' in Content-Type, viene elaborato come immagine JPG. Content-type per pdf è 'application/pdf'.

Il browser agirà in base al comportamento predefinito, ad esempio, con il plug-in Adobe, visualizzerà il PDF nella sua finestra, se non si dispone di alcun plug-in per PDF, dovrebbe scaricare il file, ecc.

L'intestazione Content-Disposition dice cosa dovresti fare con i dati. Se si desidera che il client "scarichi" in modo esplicito un file HTML/PDF/qualunque e non lo visualizzi per impostazione predefinita, il valore "allegato" è ciò che si desidera. Dovrebbe avere un altro parametro, (come suggerito da Justin Niessner), che viene utilizzato in caso di qualcosa:

http://server/download.aspx?file=11 -> Content-Disposition: attachment; filename = file.jpg dice, come deve essere il file di default di nome.

+0

Queste sono alcune informazioni utili. – malckier

Problemi correlati