Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PDF-Dokument in aspx-Seite öffnen/anzeigen

353 views
Skip to first unread message

M.Erlinger

unread,
Dec 2, 2009, 10:52:53 AM12/2/09
to
Hallo

ich hätte 2 Fragen zum Öffnen/Anzeigen eines PDF-Dokumentes in einer
ASP.Net-Anwendung:
Ich habe eine eigene aspx-Seite, mit der ich im Page-Load die Daten
aus einer Datenbank-Tabelle hole; in einer Image-Spalte wäre das PDF-
Dokument, und anschließend soll dieses hier dargestellt werden.
Response.Buffer = true;
Response.AddHeader("Content-Disposition",
"attachment;filename=" + sName);
Response.ContentType = "application/pdf";
Response.BinaryWrite(dbData);
Response.Flush();

1) das PDF-Dokument kommt aus einer Datenbank-Image-Spalte - muss ich
nach dem Einlesen dieser Spalte in ein Byte[]-Objekt, dies als PDF-
Datei zwischenspeichern, oder gibt es auch noch eine andere
Möglichkeit das Dokument darzustellen (via MemoryStream - oder so) ??
2) ich hätte mir vorgestellt, dass das PDF-Dokument in dieser aspx-
Seite angzeigt wird (Öffnen als PopUp-Seite); derzeit wird aber immer
der Dialog vom AcrobatReader geöffnet (mit der Frage ob ich die Datei
anzeigen möchte) - und anschließend öffnet sich immer der Acrobat-
Reader ...... wie muss ich dieses Problem angehen ??

Kann mir bitte jemand einen Rat geben ?!
Danke schon mal & Grüsse
Michael

Karsten Samaschke

unread,
Dec 2, 2009, 12:03:59 PM12/2/09
to
Am 02.12.09 16:52, schrieb M.Erlinger:

> 1) das PDF-Dokument kommt aus einer Datenbank-Image-Spalte - muss ich
> nach dem Einlesen dieser Spalte in ein Byte[]-Objekt, dies als PDF-
> Datei zwischenspeichern, oder gibt es auch noch eine andere

> M锟絞lichkeit das Dokument darzustellen (via MemoryStream - oder so) ??

Ja, MemoryStream w锟絩e voll und ganz perfekt daf锟絩:

// In MemoryStream einlesen
using(MemoryStream ms = new MemoryStream())
{
ms.Write(<Daten>, 0, <Daten>.Length);

// MemoryStream zur锟絚ksetzen, danach kann daraus gelesen werden
ms.Seek(0, SeekOrigin.Begin);
Response.BinaryWrite(ms.ToArray());
}

> 2) ich h锟絫te mir vorgestellt, dass das PDF-Dokument in dieser aspx-
> Seite angzeigt wird (锟絝fnen als PopUp-Seite); derzeit wird aber immer
> der Dialog vom AcrobatReader ge锟絝fnet (mit der Frage ob ich die Datei
> anzeigen m锟絚hte) - und anschlie锟絜nd 锟絝fnet sich immer der Acrobat-


> Reader ...... wie muss ich dieses Problem angehen ??

Probier es mal mit der ContentDisposition "inline" statt "attachment".


Mit freundlichen Gruessen / Best regards,

Karsten Samaschke
--
IT-Development, IT-Training, IT-Coaching

Nerd: http://www.aspextra.de
Blog: http://karsan.de
Family: http://www.familyblogger.de
Community: http://www.aspnetzone.de

Sent via MacBook Pro / OS X 10.6 (Snow Leopard)

M.Erlinger

unread,
Dec 2, 2009, 12:31:42 PM12/2/09
to
Hallo

danke mal für Deine Info!!

>     // In MemoryStream einlesen
>     using(MemoryStream ms = new MemoryStream())
>     {
>        ms.Write(<Daten>, 0, <Daten>.Length);
>

>        // MemoryStream zurücksetzen, danach kann daraus gelesen werden
>        ms.Seek(0, SeekOrigin.Begin);
>        Response.BinaryWrite(ms.ToArray());
>     }
funktionier so :-)

> Probier es mal mit der ContentDisposition "inline" statt "attachment".
>

Ja - funktioniert auch, jetzt wird zumindest einmal das PDF-Dokument
in der selben Site der Applikation geöffnet.

Wie kann ich denn noch meine dokument.aspx als eignes Popup-WebSite
öffnen ??

Danke & schönen Gruß
Michael

Gerold Mittelstädt

unread,
Dec 12, 2009, 8:34:14 AM12/12/09
to
Hi,

M.Erlinger schrieb:


>
>> // In MemoryStream einlesen
>> using(MemoryStream ms = new MemoryStream())
>> {
>> ms.Write(<Daten>, 0, <Daten>.Length);
>>

>> // MemoryStream zur�cksetzen, danach kann daraus gelesen werden


>> ms.Seek(0, SeekOrigin.Begin);
>> Response.BinaryWrite(ms.ToArray());
>> }
> funktionier so :-)

Ich pers�nlich w�rde f�r das Ausliefern von Daten aus der DB einen
Handlver verwenden, und nicht die letzte Seite missbrauchen, aber nuja.. ;)

>
>> Probier es mal mit der ContentDisposition "inline" statt "attachment".
>>
> Ja - funktioniert auch, jetzt wird zumindest einmal das PDF-Dokument

> in der selben Site der Applikation ge�ffnet.


>
> Wie kann ich denn noch meine dokument.aspx als eignes Popup-WebSite

> �ffnen ??

javascript:window.open(datei.ashx...)

Wobei mich solche Seiten immer ziemlich nerven, die 5 Fenster �ffnen,
nur um ein PDF anzuzeigen, was bei mir dann letztlich doch extern im
Reader ge�ffnet wird, und ein bis zwei unn�tige, leere Seiten im Browser
zur�ckbleiben.

Das Ganze l�uft Clientseitig ab. Du hast da letztlich keinen Einfluss
drauf, was der Client mit anstellt und wo er es �ffnet.

--
Viele Gr�

M.Erlinger

unread,
Dec 15, 2009, 3:17:12 AM12/15/09
to
Hallo

>
> Ich persönlich würde für das Ausliefern von Daten aus der DB einen


> Handlver verwenden, und nicht die letzte Seite missbrauchen, aber nuja.. ;)
>

Klingt interessant - kannst Du mir das bitte einmal näher erklären,
wie Dein Lösungsansatz diesbezüglich aussehen würde ??

Stefan Falz [MVP]

unread,
Dec 15, 2009, 3:25:00 AM12/15/09
to
Hallo M.,

"M.Erlinger" schrieb:

> Klingt interessant - kannst Du mir das bitte einmal n�her erkl�ren,
> wie Dein L�sungsansatz diesbez�glich aussehen w�rde ??

bspw. so:

---

[Download.ashx]

Imports System
Imports System.Web
Imports System.IO

Public Class Download : Implements IHttpHandler

Public Sub ProcessRequest( ... ) Implements IHttpHandler.ProcessRequest

Dim FilePath As String = Path.Combine( <Basispfad>, context.Request.QueryString( "File" ) )
Dim FileName As String = Path.GetFileName( FilePath )

If File.Exists( FileName ) Then

context.Response.ContentType = "application/pdf"
context.Response.AddHeader( "Content-Disposition", "attachment;filename=" & FileName )
context.Response.TransmitFile( FilePath )

End If

End Sub

Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property

End Class

---

Der Link sieht dann in etwa so aus: <a href="Download.ashx?File=Abc.pdf">Download</a>

Achte aber bitte darauf, dass die ungepr�fte �bernahme des Dateinamens gef�hrlich ist.
Du solltest daher noch eine �berpr�fung einbauen, ob die Datei �berhaupt angefordert
werden darf. Besser w�re wohl die �bergabe einer ID, anhand derer dein Skript dann den
richtigen Dateinamen ermitteln kann.

--
Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

M.Erlinger

unread,
Dec 15, 2009, 4:23:09 AM12/15/09
to
Hallo

danke für die Info.
Ich dachte deshalb eher an den Memory-Stream, um nicht unnötige viele
Dateien zu erstellen, wenn ein Dokument für die Applikation aus der
Datenbank geladen wird........
weil diese (temporären) Dateien müssen dann ja auch wieder mal
gelöscht werden.

Schönen Gruß
Michael

Gerold Mittelstädt

unread,
Dec 18, 2009, 3:46:12 AM12/18/09
to
Am 15.12.2009 10:23, Hallo,

M.Erlinger schrieb:
> Hallo
>
> danke f�r die Info.
> Ich dachte deshalb eher an den Memory-Stream, um nicht unn�tige viele
> Dateien zu erstellen, wenn ein Dokument f�r die Applikation aus der
> Datenbank geladen wird........
> weil diese (tempor�ren) Dateien m�ssen dann ja auch wieder mal
> gel�scht werden.

Ob Du im Handler jetzt eine Datei �bertr�gst, oder ein BLOB aus der DB,
den Du gerade erst abgeholt hast, spielt keine Rolle - es geht ums
Prinzip, das ganze "ordentlich" zu l�sen, und nicht den letzten PostBack
einer .aspx-Seite daf�r zu "missbrauchen" ;)

--
Viele Gr�

M.Erlinger

unread,
Dec 21, 2009, 12:14:43 PM12/21/09
to
Hallo Gerold

> Ob Du im Handler jetzt eine Datei überträgst, oder ein BLOB aus der DB,


> den Du gerade erst abgeholt hast, spielt keine Rolle - es geht ums

> Prinzip, das ganze "ordentlich" zu lösen, und nicht den letzten PostBack
> einer .aspx-Seite dafür zu "missbrauchen" ;)

würde ich mit einem Mem.Stream den letzten PostBack "missbrauchen" ??

Gruß
Michael

0 new messages