2010-01-13 24 views
17

En pocas palabras, me gustaría que alguien pueda hacer clic en un enlace y obtener un pdf de uso único. Tenemos la biblioteca para crear archivos PDF, así que eso no es un problema.¿Cómo puedo devolver un pdf desde una solicitud web en ASP.NET?

Podríamos generar un enlace a una página aspx, hacer que esa página genere el pdf, guardar el pdf en el sistema de archivos, y luego Response.Redirect al PDF guardado. Entonces, de alguna manera, tendríamos que hacer un seguimiento y limpiar el archivo PDF.

Dado que no es necesario que guardemos esta información, lo que me gustaría hacer, si es posible, es hacer que la página aspx genere el pdf y devolverlo directamente como respuesta a la solicitud original. . es posible?

(En nuestro caso, estamos usando C#, y queremos servir a un PDF de vuelta, pero parece que cualquier solución probablemente funcionaría para varios lenguajes .NET y regresó tipos de archivos.)

+0

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

+3

No se engaña de lo anterior en ningún sentido. – nothrow

+0

(Sabía que iba a hacer que un par de personas dijeran que era un imbécil, apuntando a ese tipo de pregunta ... por eso incluí la segunda oración. Debería haber hecho la primera oración :) :) – Beska

Respuesta

30

Asumiendo que puede obtenga un byte[] que represente su PDF:

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

Response.BinaryWrite(yourPdfAsByteArray); 

Response.Flush(); 

Response.End(); 
+1

Esto se ve muy prometedor ... pensé sería algo en esta línea, pero no tiene los antecedentes para conocer los detalles. Gracias por la respuesta; Voy a probar este tacto. – Beska

+0

Esto resolvió el problema con precisión. ¡Gracias! – Beska

+0

Una pregunta relacionada (tal vez debería abrir una pregunta separada, pero está estrechamente relacionada con esta respuesta ...) ¿Por qué Response.Flush()? Cuando tenemos esa línea allí y alguien cierra el navegador después de realizar la solicitud, obtenemos un error: "El host remoto cerró la conexión."Si dejamos esa línea, no hay error, y todo * parece * que funciona. La lectura de los documentos de MSDN no me iluminó sobre si esto era estrictamente necesario. Pensamientos? – Beska

2

Mire cómo funciona HTTP. El cliente (= navegador) no depende de las extensiones, solo quiere que el servidor devuelva algunos metadatos junto con el documento.

Los metadatos se pueden agregar con Response.AddHeader, y una 'línea de metadata' consiste en Nombre y Valor.

Content-Type es la propiedad que le interesa, y el valor es el tipo MIME de los datos (study: RFC1945 para encabezados HTTP, google para tipo MIME).

Para páginas ordinales aspx (html, ....) la propiedad es 'text/html' (no es tan trivial, pero para este ejemplo es suficiente). Si devuelve una imagen JPG, puede tener el nombre 'image.gif', pero siempre que envíe 'image/jpeg' en Content-Type, se procesará como imagen JPG. El tipo de contenido para pdf es 'application/pdf'.

El navegador actuará de acuerdo con el comportamiento predeterminado, por ejemplo, con el complemento de Adobe, se mostrará el PDF en su ventana, si no tiene ningún complemento para PDF, debe descargar el archivo, etc.

encabezado Content-Disposition dice, lo que debe hacer con los datos. Si desea explícitamente que el cliente 'descargue' algo de HTML/PDF/lo que sea, y no lo muestre de manera predeterminada, el valor 'archivo adjunto' es lo que desea. Debería tener otro parámetro, (como lo sugiere Justin Niessner), que se usa en caso de algo como:

http://server/download.aspx?file=11 -> Content-Disposition: attachment; filename = file.jpg dice, cómo debería ser el archivo por defecto llamado.

+0

Esa es una información útil. – malckier

Cuestiones relacionadas