2009-05-13 3 views
8

Ich habe eine ASP.NET Ashx-Klasse, die Daten aus einer Datenbank abruft, erstellt eine PDF-Datei mit iTextSharp und streamt die PDF-Datei an den Browser. Der Browser (zumindest IE und Firefox) startet Acrobat Reader als separates Fenster zum Öffnen der Datei. Ich möchte, dass es inline im Browser angezeigt wird.Machen Sie PDF-Anzeige inline anstelle von separaten Acrobat Reader-Fenster

Ist das etwas, das ich von der Serverseite vollständig kontrollieren kann? Ich setze den Content-Type-Header bereits auf application/pdf, und ich habe versucht, Content-Disposition und Content-Length zu setzen. Bisher hat nichts funktioniert.

Gibt es eine andere Kopfzeile, die ich vermisse? Gibt es etwas im PDF selbst, das dem Browser sagt, wie er angezeigt wird? Irgendwelche anderen Ideen?

+1

Nein, nein, nein, es ist mein Browser und ich werde PDFs anzeigen, wo ich sie anzeigen möchte. Okay, ich bin mir sicher, dass dies für eine interne Unternehmenswebsite ist. Trotzdem finde ich das nervig. – jmucchiello

Antwort

9

Einstellen der Content-Disposition und Content-Type-Header sollte es tun, aber Sie müssen möglicherweise auch anrufen Response.ClearHeaders(), um andere Header zu löschen, die festgelegt wurden.

Versuchen Sie auch, Fiddler zu verwenden, um die tatsächlichen Header und den Inhalt der Antwort zu sehen und sie mit denen von einer Site zu vergleichen, die wie gewünscht funktioniert.

+2

+1 für den Vorschlag von Fiddler übergeben werden. – bmb

1

Versuchen Sie, sie in Ihre Seite mit HTML OBJECT zu generieren.

<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> 

Wenn Sie die Antwort mit einem Ashx anstatt in der Lage, eine aspx zurückkehren zu streamen brauchen, ich glaube, Sie kein Glück sein können.

Ansonsten glaube ich, dass die Einstellungen im Browser angezeigt werden oder nicht, ist vollständig Client-gesteuert und nicht in Ihren Händen.

+0

Danke für den Vorschlag. Ich möchte, dass sie die Möglichkeit haben, das PDF zu speichern. Wird die Einbettung dafür funktionieren? –

+0

@jmgant - Wenn die PDF-Datei eingebettet ist, verfügt Acrobat ActiveX über das Symbol "Speichern" in der Symbolleiste. – ichiban

+0

Um ehrlich zu sein, bin ich nicht positiv ohne zu testen. Das heißt, auch wenn dies nicht der Fall ist, können Sie problemlos einen Download-Link oder eine Schaltfläche zu Ihrer Seite hinzufügen. – Serapth

0

ich denke, das Header wird tun, was Sie

Content-type: application/pdf 

wollen Da sagen Sie das nicht funktioniert, dann ich vermute, dass es eine Konfigurationseinstellung auf der Client-Seite ist.

Überprüfen Sie Ihre installierte Version von Adobe Acrobat. Es gibt eine Einstellung in den Einstellungen für "Internet" und ein Kontrollkästchen mit der Aufschrift "PDF im Browser anzeigen".

-
bmb

+0

Danke für die Antwort. Ich habe meinen Acrobat Reader so eingestellt, dass er inline angezeigt wird, aber das scheint keinen Unterschied zu machen. Ich war auf anderen PDF-Seiten, die in meinem Browser inline angezeigt werden, aber die, die ich bediene, nicht. Ich denke also nicht, dass es sich ausschließlich um ein Kundenproblem handelt. –

-1

Wenn Sie das Budget haben, ist mein Unternehmen eine Reihe von Produkten verkauft, die eine AJAX based image viewer umfasst wird, dass Lassen Sie die PDF-Seiten ohne Acrobat in einer Zeile anzeigen. In seiner einfachsten Form ist es nur ein Betrachter, aber Sie können die Interaktivität nach Belieben schichten.

5

Wenn Sie eine Ashx (Web-Handler) verwenden versuchen Sie dies: -

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

+1 Inline-Content-Disposition sollte den Trick –

+0

Ich dachte, das würde funktionieren, auch, aber es nicht. Ich habe auch versucht, die Inhaltslänge einzustellen. –

+0

Es funktioniert für mich auf IIS6, IE7, ASP.NET3.5. Hmmm ... Hast du den Minimalfall in einigen Browsern ausprobiert? Wenn das der Fall ist, füge ich der Antwort meine vollständige Quelle hinzu. –

1

So habe ich eine Probe in einem meiner Werke haben, das ist, was Sie brauchen:

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

und in Server-Seite:

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

ich stelle hier auch einige Code aus meinem PDF Handler:

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

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

Jedenfalls, wenn meine Post nicht klar scheinen Sie haben einen Blick auf diese Probe How to Display PDF documents with ASP.NET

+0

Ist ShowPdf ein benutzerdefiniertes Steuerelement? Was bewirkt das Festlegen der FilePath-Eigenschaft? –

+0

Ja. FilePath weist mein Steuerelement an, welche PDF-Datei (in der Datenbank gespeichert) angezeigt werden soll und wie es angezeigt werden soll, indem die erforderlichen Parameter – DaDa

4

OK, stellt sich heraus, es war eine dumme Frage, aber ich bin froh, dass ich es fragte, weil ich noch nie von Fiddler gehört hatte (was mich zur Antwort führte, weshalb ich tspaulds Antwort akzeptiere). Die PDF-Datei wird von einem Webdienst generiert, der die Datei für verschiedene Front-End-Sites bereitstellt. Ich habe die Inhaltsdisposition im Dienst auf inline gesetzt, aber das war egal, weil der Browser diesen Header nie bekam; Es hat den Header von der Front-End-Site (das war attachment). Ich habe es in der Front-End-Site geändert und das hat es behoben. Die Antwort ist, dass Sie Content-Type=application/pdf und Content-Disposition=inline; filename=Something.pdf haben müssen, wie andere gesagt haben.

Verwandte Themen