2009-05-13 7 views
8

Ho una classe ashx ASP.NET che recupera i dati da un database, crea un file PDF utilizzando iTextSharp e invia il PDF al browser. Il browser (IE e Firefox almeno) sta lanciando Acrobat Reader come una finestra separata per aprire il file. Mi piacerebbe che fosse visualizzato all'interno del browser.Imposta PDF in linea anziché in una finestra separata di Acrobat Reader

È qualcosa che posso controllare completamente dal lato server? Sto già impostando l'intestazione Content-Type su application/pdf, e ho provato a impostare Content-Disposition e Content-Length. Niente finora ha funzionato.

C'è un'altra intestazione che mi manca? C'è qualcosa nel PDF stesso che dice al browser come visualizzarlo? Altre idee?

+1

No, no, no, è il mio browser e visualizzerò i PDF dove voglio visualizzarli. Ok, sono sicuro che questo è per un sito web aziendale interno. Eppure, trovo questo fastidioso. – jmucchiello

risposta

9

Impostazione delle intestazioni dei contenuti a disposizione e il contenuto di tipo dovrebbe farlo, ma potrebbe anche essere necessario chiamare Response.ClearHeaders() per cancellare altre intestazioni che sono state impostate.

Inoltre, provare a utilizzare Fiddler per visualizzare le intestazioni effettive e il contenuto della risposta e confrontarle con quelle di un sito che funziona come si desidera.

+2

+1 per suggerire Fiddler. – bmb

1

Provate a generarli nella vostra pagina usando 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> 

Se è necessario per lo streaming la risposta con un'ashx invece di essere in grado di restituire un aspx, penso che potrebbe essere fuori di fortuna.

Altrimenti, credo che le impostazioni da mostrare nel browser o meno, siano completamente guidate dal cliente e fuori dalle tue mani.

+0

Grazie per il suggerimento. Voglio che abbiano la possibilità di salvare il PDF. Embedding funzionerà per quello? –

+0

@jmgant: quando il PDF è incorporato, Acrobat ActiveX ha un'icona "Salva" nella barra degli strumenti. – ichiban

+0

Per essere onesti, non sono positivo senza test. Detto questo, anche se così non fosse, potresti facilmente aggiungere un link o un pulsante per il download alla tua pagina. – Serapth

0

penso che questo colpo di testa farà quello che vuoi

Content-type: application/pdf 

Dal momento che si dice che non funziona, quindi ho il sospetto che è un'impostazione di configurazione sul lato client.

Controllare la versione installata di Adobe Acrobat. C'è un'impostazione nelle preferenze per "Internet" e una casella di controllo che dice "Visualizza PDF nel browser".

-
BMB

+0

Grazie per la risposta. Ho impostato Acrobat Reader per la visualizzazione in linea, ma ciò non sembra fare la differenza. Sono stato in altre pagine PDF che sono visualizzate in linea nel mio browser, ma quello che sto servendo non lo è. Quindi non penso che sia strettamente un problema client. –

-1

Se hai il budget, la mia azienda vende una serie di prodotti che include un AJAX based image viewer che verrà consente di visualizzare le pagine PDF in linea senza Acrobat. Nella sua forma più semplice, è solo un visualizzatore, ma puoi inserire l'interattività a tuo piacimento.

5

Se si utilizza un ashx (gestore web) provare questo: -

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

+1 contenuto in linea-disposizione dovrebbe fare il trucco –

+0

Ho pensato che avrebbe funzionato, anche, ma non è così. Ho anche provato a impostare la lunghezza del contenuto. –

+0

Funziona per me su IIS6, IE7, ASP.NET3.5. Hmmm ... Hai provato il caso minimale in alcuni browser? Se è così, aggiungerò la mia fonte completa alla risposta. –

1

Così, ho un campione in una delle mie opere che è quello che vi serve:

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

e nel lato server:

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

ho posto qui anche qualche codice dal mio PDF Handler:

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

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

in ogni caso se il mio post non sembra chiaro a voi, uno sguardo a questo campione How to Display PDF documents with ASP.NET

+0

ShowPdf è un controllo personalizzato? Cosa fa l'impostazione della proprietà FilePath? –

+0

Sì. FilePath indica al mio controllo quale file PDF (salvato nel database) mostrare e come mostrarlo passando i parametri necessari – DaDa

4

OK, risulta che era una domanda stupida, ma sono contento di averlo chiesto perché non avevo mai sentito parlare di Fiddler (che mi ha portato alla risposta, motivo per cui accetto la risposta di tspauld). Il PDF è generato da un servizio Web che serve il file a un paio di diversi siti front-end. Stavo impostando la disposizione dei contenuti su inline nel servizio, ma non importava, perché il browser non ha mai ottenuto quell'intestazione; ha ottenuto l'intestazione dal sito di front-end (che era attachment). L'ho cambiato nel sito di front-end e l'ho risolto.

Quindi la risposta è che devi avere Content-Type=application/pdf e Content-Disposition=inline; filename=Something.pdf, come altri hanno già detto.

Problemi correlati