2009-05-13 9 views
8

Tengo una clase ashx de ASP.NET que recupera datos de una base de datos, crea un archivo PDF usando iTextSharp y transmite el PDF al navegador. El navegador (al menos IE y Firefox) está lanzando Acrobat Reader como una ventana separada para abrir el archivo. Me gustaría que se muestre en línea dentro del navegador.Haga que PDF se visualice en línea en lugar de la ventana separada de Acrobat Reader

¿Es algo que puedo controlar por completo desde el lado del servidor? Ya estoy configurando el encabezado Content-Type para application/pdf, y he intentado configurar Content-Disposition y Content-Length. Nada hasta ahora ha funcionado.

¿Hay otro encabezado que me falta? ¿Hay algo en el PDF que le dice al navegador cómo mostrarlo? ¿Alguna otra idea?

+1

No, no, no, es mi navegador y veré los archivos PDF donde quiera verlos. De acuerdo, estoy seguro de que esto es para un sitio web corporativo interno. Aún así, me parece molesto. – jmucchiello

Respuesta

9

Seleccionar las cabeceras Content-Disposition y de tipo de contenido debería hacerlo, pero también puede que tenga que llamar Response.ClearHeaders() para borrar otros encabezados que se han establecido.

Además, intente utilizar Fiddler para ver los encabezados reales y el contenido de la respuesta, y compárelos con los de un sitio que funcione como usted desee.

+2

+1 para sugerir Fiddler. – bmb

1

Intente generarlos en su página utilizando html OBJECT.

<OBJECT WIDTH=640 HEIGHT=480> 
    <PARAM NAME="SRC" VALUE="<%=filePath%>"> 
    <EMBED SRC=<%=filename.pdf%> WIDTH=1000 HEIGHT=680> 
     <NOEMBED> PDF should have displayed here!</NOEMBED> 
     </EMBED> 
</OBJECT> 

Si necesita transmitir la respuesta con un ashx en lugar de ser capaz de devolver un aspx, que cree que puede estar fuera de suerte.

De lo contrario, creo que la configuración para mostrar en el navegador o no, está completamente dirigida por el cliente y fuera de sus manos.

+0

Gracias por la sugerencia. Quiero que tengan la opción de guardar el PDF. ¿Incrustaría trabajo para eso? –

+0

@jmgant: cuando el PDF está incrustado, Acrobat ActiveX tiene un ícono de "Guardar" en su barra de herramientas. – ichiban

+0

Para ser sincero, no estoy seguro sin las pruebas. Dicho esto, incluso si no lo hace, puede agregar fácilmente un enlace o botón de descarga a su página. – Serapth

0

creo que esta cabecera va a hacer lo que quiere

Content-type: application/pdf 

Dado que usted dice que no está funcionando, entonces sospecho que es una opción de configuración en el cliente.

Compruebe su versión instalada de Adobe Acrobat. Hay una configuración en las preferencias de "Internet" y una casilla de verificación que dice "Mostrar PDF en el navegador".

-
BMB

+0

Gracias por la respuesta. He configurado mi Acrobat Reader para que se muestre en línea, pero eso no parece marcar la diferencia. He estado en otras páginas PDF que se muestran en línea en mi navegador, pero la que estoy publicando no. Entonces, no creo que sea estrictamente un problema del cliente. –

-1

Si usted tiene el presupuesto, mi compañía vende una serie de productos que incluye una AJAX based image viewer que se le permite ver las páginas PDF en línea sin Acrobat en absoluto. En su forma más simple, es solo un visor, pero puede aplicar capas de interactividad cuando lo necesite.

5

Si está utilizando un ashx (manejador web) intente lo siguiente: -

context.Response.AddHeader("content-disposition", "inline; filename=Something.pdf") 
+0

+1 disposición de contenido en línea debería hacer el truco –

+0

Pensé que eso funcionaría, también, pero no fue así. También intenté establecer la duración del contenido. –

+0

Me funciona en IIS6, IE7, ASP.NET3.5. Hmmm ... ¿Has probado el caso mínimo en algunos navegadores? De ser así, agregaré mi fuente completa a la respuesta. –

1

lo tanto, tengo una muestra en una de mis obras que es lo que necesita:

<cc1:ShowPdf ID="ShowPdf1" runat="server" BorderStyle="None" BorderWidth="0px" 
     Height="750px" Style="z-index: 103; " 
     Width="750px"/> 

y en el lado del servidor:

ShowPdf1.FilePath = String.Format("~/Handlers/Pdf.ashx?id={0}#view=FitH&page=1&pagemode=none&navpanes=1", myPublicationId); 

pongo aquí también algo de código de mi PDF Handler:

Response.ContentType = "application/pdf"; 
    byte[] bytes = YourBinaryContent; 

    using (BinaryWriter writer = new BinaryWriter(context.Response.OutputStream)) 
    { 
     writer.Write(bytes, 0, bytes.Length); 
    } 

de todos modos si no parece claro que mi puesto, echar un vistazo a esta muestra How to Display PDF documents with ASP.NET

+0

¿Es ShowPdf un control personalizado? ¿Qué hace la configuración de su propiedad FilePath? –

+0

Sí. FilePath ordena a mi control qué archivo PDF (guardado en la base de datos) mostrar, y cómo mostrarlo pasando los parámetros necesarios – DaDa

4

OK, resulta que fue una pregunta estúpida, pero me alegro de haberla preguntado porque nunca había oído hablar de Fiddler (lo que me llevó a la respuesta, y por eso estoy aceptando la respuesta de tspauld). El PDF es generado por un servicio web que sirve el archivo a un par de diferentes sitios de front-end. Estaba configurando la disposición de contenido en inline en el servicio, pero eso no importaba, porque el navegador nunca obtuvo ese encabezado; obtuvo el encabezado del sitio de front-end (que era attachment). Lo cambié en el sitio front-end y eso lo solucionó.

Así que la respuesta es que debe tener Content-Type=application/pdf y Content-Disposition=inline; filename=Something.pdf, como han dicho otros.

Cuestiones relacionadas