21. juli 2004 - 14:21Der er
82 kommentarer og 2 løsninger
At sende pdf over http
Jeg har en pdf-fil jeg har genereret on the fly, som jeg så gerne vil sende ud til klienten. Hvilken stream skal jeg da bruge? Se evt. her for yderligere info: http://www.eksperten.dk/spm/521266
Du behøver ikke streame... Du kan bare linke til den. Brugeren skal under alle omstændigheder have en reader installeret - Så klarer de fleste browsere resten.
Okay, men grunden til jeg vil streame er fordi at det ikke skal være muligt at tilgå pdf-filen direkte medmindre man er logget ind osv. Desuden kommer der til at være ret mange pdf-filer, så det ville være lækkert hvis den bare blev oprettet og streamet ud til klienten og færdig arbejde
Prøvede mig lige frem med dette, men det er vidst ikke den korrekte writer. Så er det nu jeg godt kunne tænke mig det var java...hvor jeg har lidt bedre overblik over de forskellige readers/writers :) :
Document d = new Document();
PdfWriter p = PdfWriter.getInstance(d, new FileStream(@"localhost/pdftest.pdf", FileMode.Create));
johhh efter gennemrodning af masser af dropdownbokse i VS.net har jeg fundet følgende. Nu mangler jeg bare at assigne p til mit output, så det er den der skriver PdfWriter p = PdfWriter.getInstance(d, new FileStream(@"localhost/pdftest.pdf", FileMode.Create)); this.Page.Response.ContentType="application/pdf"; this.Page.Response.OutputStream.<---Her ved jeg ikke helt hvad jeg skal skrive endnu
hm, fra asken til ilden... Nu fik jeg følgende: Configuration Error Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
Parser Error Message: Access is denied: 'itextsharp'.
Source Error:
Line 196: <add assembly="System.EnterpriseServices, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> Line 197: <add assembly="System.Web.Mobile, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> Line 198: <add assembly="*"/> Line 199: </assemblies> Line 200: </compilation>
så nu kører det....pånær at når jeg trykker på knappen vil den hente aspx filen og ikke pdf-dokumentet ned..... Det er jo selvfølgelig en fejl 40 :P Men kan ikke lige helt gennemskue det...Kunne jeg få lov at stille dette spørgsmål med :)
Hvis du bare streamer filen du vil det for brugeren virke som om han bliver bedt om at download aspx-filen. Det skulle meget gerne være pdf-filen der kommer ned, men det bliver med det filnavn som brugeren har besøgt.
Det ser heller ikke ud til man kan åbne pdf-filen i browseren når den bliver streamet på den måde.... Man er nødt til at gemme den på disken først...er det korrekt?
Jeps - jeg ved ikke om du kan trixe det, men jeg har lige fået en idé som jeg lige vil prøve af. Er det planen at du vil gemme alle de pdf-er der genereres, eller skal de bare slettes igen ?
Jahhh altså de skal jo bare slettes...Så man kunne selvfølgelig gemme pdf'en kort på disken....og så skrive filen ud til klienten...Men kommer det ikke til at tage længere tid? Lad os sige hver bruger forespørger på en pdf, og de får alle kort lavet en fil på disken der derefter sendes til klienten....Det belaster vel en del...Eller du har måske en anden snedig plan? :D
jeg synes helt klart det virker som det letteste at oprette dem på disk midlertidigt - give brugeren en almindeligt link ud i browseren, og så slette efterfølgende. Jeg ved ikke om jeg har en snedig plan, men jeg ville lige prøve at se om man kunne fikse det andet på en snild måde. Jeg vender tilbage omkring det.
okay...jeg er nok lidt sat....Nu kommer den der configuration fejl der pludeslig igen...ud af det blå...Hvad kan det skyldes...Her er hele fejlside: (Jeg kan godt compile, det er først når jeg kører websiden dette bliver udskrevet i browseren)
Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.
Parser Error Message: Access is denied: 'itextsharp'.
Source Error:
Line 196: <add assembly="System.EnterpriseServices, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> Line 197: <add assembly="System.Web.Mobile, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> Line 198: <add assembly="*"/> Line 199: </assemblies> Line 200: </compilation>
Assembly Load Trace: The following information can be helpful to determine why the assembly 'itextsharp' could not be loaded.
=== Pre-bind state information === LOG: DisplayName = itextsharp (Partial) LOG: Appbase = file:///c:/inetpub/wwwroot/WebApplication2 LOG: Initial PrivatePath = bin Calling assembly : (Unknown). ===
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Post-policy reference: itextsharp LOG: Attempting download of new URL file:///C:/WINNT/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/webapplication2/37f71cbe/939c5907/itextsharp.DLL. LOG: Attempting download of new URL file:///C:/WINNT/Microsoft.NET/Framework/v1.1.4322/Temporary ASP.NET Files/webapplication2/37f71cbe/939c5907/itextsharp/itextsharp.DLL. LOG: Attempting download of new URL file:///c:/inetpub/wwwroot/WebApplication2/bin/itextsharp.DLL. LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Post-policy reference: itextsharp, Version=1.0.4.0, Culture=neutral, PublicKeyToken=null
Det er set før... Det har ikke nødvendigvis noget med dit program at gøre. Prøv at google lidt på .NET din fejl og machine.config - der er en hel del der har prøvet det.
Det ser ellers fedt ud snepnet :) Men faktisk virker Arnes lille header fif også hehe...Jeg tror sørme jeg kommer til at bruge det istedet...Tag det ikke personligt...Nu hvor du endda har siddet og brugt tid på at lave det andet. Så har jeg til gengæld lidt kode at kigge på der...Det er en god ting. Mht. den lamme fejl der før lavede jeg bare en ny solution....og nyt projekt og nu kører det bare....
Det sidste gør du ved at højreklikke på dit web (altså i din IIS-manager), klikke på properties. I den viste fane (skulle gerne hedde directory) er der en knap der hedder configuration, hvor du under mappings kan angive... æhh... mappings :o)
Du kan kofigurere .pdf til det samme som f.eks. .ascx
Og hvis du nogensinde prøver det jeg skrev vil du finde ud af at den bare åbner hos brugeren.. man skal ikke sige om man vil gemme eller åbne. Jeg er faktisk selv lidt imporneret over det... Har ikke prøver sådan noget før :o)
HAHA :o) Jeg anede ikke man kunne gøre det der arne skrev - ville bare gerne prøve det med HttpHandleren, men jeg synes det er lidt pinligt nu (mine ører er faktisk helt røde :o). Det var derfor jeg prøvede at holde den tilbage her : http://www.eksperten.dk/spm/521854#rid4788215
Nå - men det vigtigste er jo at du fik det til at virke :o) mvh
Du spørger bare... hvis du bare poster i denne kategori ser både jeg selv og arne dem... Så kan jeg jo sende dig en hel masse kode, og så kan arne sende dig en enkelt linie der gør det samme bagefter *G*
haha...Arne han er jo også fuld af gode fif har jeg efterhånden fundet ud af. Havde godt tænkt det var headeren der skulle ændres i, men jeg anede ikke hvordan det skulle gøres...
Okay, næste problem på dagsordenen er følgende...Nu vil jeg jo gerne lægge et watermark ind på siden da jeg på itext's brilliante side ser at det er muligt...Så jeg daffer lystigt ind i paint og laver en gang grafitti og gemmer det i en jpg-fil. Lægger den i min webroot....og inkluderer følgende kode fra itext's side:
Og endnu et spg. Er det muligt at skrive text ud på serversiden...Fx. hvis der forekommer en exception, og så skrive den ud i en form for command vindue, når den bliver catchet...så man har lidt større mulighed for at fejlfinde :)
Arne, jeg vil gerne have lov at dele pointene mellem dig og snepnet da jeg synes i begge har gjort en god indsats...Så jeg venter lige lidt med at dele ud hvis det er okay
Du kan skrive til dit output-vindue, eller til trace. Det ene kan du gøre med System.Diagnostics.Debug.Write(...) Det andet med Trace.Write(...);
Det med debug kræver at du er i debugmode, og det med trace kræver at du slår det til i web.config. Du kan vælge at få det vist på siden automatisk, eller du kan vælge at kalde <ditweb>/trace.axd for at set det.
Nå - jeg kan ikke slippe for point kan jeg se :o) Men så et svar da. Og lad os da bare få nogle flere pdf-runder, men det kan godt være at jeg svarer lidt periodisk - håber det er ok. Mvh
// her oprettes filen PdfWriter p = PdfWriter.getInstance(d, new FileStream(@"C:\enellerandenfil.pdf", FileMode.Create));
// tilføjer noget til dokumentet d.Add(...); // Pga. af writeren snabler, dumpes det også i filen.
// lukker dokument, og dermed fil d.Close(); // og du kan så åbne den i f.eks. acrobat reader og læse den. // (det sidste kan du ikke før den er lukket).
Hmmm når jeg bruger writer.DirectContent fra fx. dette eksempel: http://itextsharp.sourceforge.net/examples/Chap1009.cs Får jeg en access denied error. Det er vidst noget sikkerhed. Ved du hvad den helt præcis gør udover at lave en absolut placering af et objekt i pdf-dokumentet? DirectContent kunne godt som om den skriver direkte ud på streamen før den har fået lov eller sådan noget. Har du en ide? :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.