Benutzer mit den meisten Antworten
eingebettete Pdf-Datei öffnen

Frage
Antworten
-
Hallo,
PDF Reader (wie Acrobat) können mit Ressourcen nichts anfangen,
und so wirst Du die Ressource erst auf die Platte schreiben müssen,
um sie dann über Process.Start anzuzeigen:public static void OpenPDFResource() { // Verwendet Eigene Dateien zur Ablage string pdfFilePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) , "PDFTest.pdf"); // Ressource auf Platte schreiben System.IO.File.WriteAllBytes(pdfFilePath, Resource1.PDFTest); // Anzeige via ShellExecute über das für PDF registrierte Programm System.Diagnostics.Process.Start(pdfFilePath); }
Gruß Elmar
- Bearbeitet Elmar BoyeEditor Dienstag, 3. Juli 2012 11:38
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 24. Juli 2012 10:13
-
Hallo mmx2010,
Du könntest die PDF-Datei vor dem Kompilieren und Einbetten zu einer multipage Tiff-Datei konvertieren (Suchmaschine > "pdf to tiff"). Dann könntest Du über Image.FromStream(stream) den Datenstrom einlesen, über image.GetFrameCount(FrameDimension.Page) die Anzahl der Seiten ermitteln und über image.SelectActiveFrame(FrameDimension.Page, aktuelleSeitenNummer) das aktive Frame setzen und die "Seite" darstellen.
Fall dir das zu mühsam ist, könntest Du auf fertige Komponenten zurückgreifen wie z.B. die Imaging-Komponenten von VintaSoft, die einen PDF-Viewer simulieren. Das Ergebnis läßt sich sehen (und kostet nicht die Welt).Gruß
Marcel- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 24. Juli 2012 10:13
Alle Antworten
-
Hallo,
PDF Reader (wie Acrobat) können mit Ressourcen nichts anfangen,
und so wirst Du die Ressource erst auf die Platte schreiben müssen,
um sie dann über Process.Start anzuzeigen:public static void OpenPDFResource() { // Verwendet Eigene Dateien zur Ablage string pdfFilePath = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) , "PDFTest.pdf"); // Ressource auf Platte schreiben System.IO.File.WriteAllBytes(pdfFilePath, Resource1.PDFTest); // Anzeige via ShellExecute über das für PDF registrierte Programm System.Diagnostics.Process.Start(pdfFilePath); }
Gruß Elmar
- Bearbeitet Elmar BoyeEditor Dienstag, 3. Juli 2012 11:38
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 24. Juli 2012 10:13
-
Hallo mmx2010,
Du könntest die PDF-Datei vor dem Kompilieren und Einbetten zu einer multipage Tiff-Datei konvertieren (Suchmaschine > "pdf to tiff"). Dann könntest Du über Image.FromStream(stream) den Datenstrom einlesen, über image.GetFrameCount(FrameDimension.Page) die Anzahl der Seiten ermitteln und über image.SelectActiveFrame(FrameDimension.Page, aktuelleSeitenNummer) das aktive Frame setzen und die "Seite" darstellen.
Fall dir das zu mühsam ist, könntest Du auf fertige Komponenten zurückgreifen wie z.B. die Imaging-Komponenten von VintaSoft, die einen PDF-Viewer simulieren. Das Ergebnis läßt sich sehen (und kostet nicht die Welt).Gruß
Marcel- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 24. Juli 2012 10:13
-
Hallo mmx2010,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.Grüße,
RobertRobert Breitenhofer, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können. -
Hallo zusammen,
ich habe dasselbe Problem mit dem öffnen aus Resourcen.
ich habe ein WPF Projekt in welchem ein Ordner "Documents" ist.
DIeser beinhaltet PDF Dateien mit Build Action: Resource.
So - nun möchte ich eigentlich aus der Asembly das PDF laden / öffnen.
Nun ist es ja glaub ich so, dass man die PDF Dateien zwischenspeichern muss, damit sie nachher geöffnet werden können.
Dafür hat ja Elmar seine Funktion gepostet - jedoch weiss ich nicht wo der Ursprung von:
Resource1.PDFTest
ist.
Wie lade ich die Resource in meinem Projekt?
bin schon seit einiger Zeit auf der suche nach einer Lösung.
Danke für jedwede Tipps.
Grüsse
GreenLion
-
Hallo,
die Frage bezog sich ursprünglich auf Windows Forms. In WPF kann man es genauso machen, es gibt jedoch auch eine Alternative.Um es wie, von Elmar, gezeigt zu machen musst du eine Resourcendatei (*.resx) zu deinem Projekt hinzufügen. In dieser kannst du dann deine PDF-Datei hinzufügen. Die Resourcendatei generiert eine Klasse, aus der du die PDF abrufen kannst. (Der Klassenname entspricht dem Namen der Resourcendatei.)
Die WPF-Variante besteht darin, die Datei aus den WPF Resourcen zu extrahieren. (Die Dateien, die du im Projektmappenexplorer siehst). Ein Beispiel dafür:
//Resourcenstream ermitteln, Syntax: Standardnamespace.Ordner.Datei.Endung using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(@"WpfApplication139.Documents.Test.pdf")) { using (var fs = new FileStream(@"D:\Test\test2.pdf", FileMode.CreateNew))//Dateistream erstellen um Datei auf Festplatte zu schreiben { for (int i = 0; i < stream.Length; ++i) { fs.WriteByte((byte)stream.ReadByte());//Alle Bytes schreiben } } }
PS: Ich wollte die Frage eigentlich teilen, da sich dein Problem ein wenig von der ursprungsfrage unterscheidet. Durch einen Fehler in der Forensoftware wurde der Thread an der falschen Stelle geteilt, jetzt würde sich die Frage nicht mehr in die 2 richtigen Teilfragen spalten lassen.
Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Geteilt Tom Lambert (Koopakiller)Moderator Donnerstag, 15. Mai 2014 19:16 WPF, nicht WinForms
- Zusammengeführt Tom Lambert (Koopakiller)Moderator Donnerstag, 15. Mai 2014 19:21 Fehler in Forensoftware, an falscher Antwort gesplitted
- Bearbeitet Tom Lambert (Koopakiller)Moderator Donnerstag, 15. Mai 2014 19:23 PS
-
Hallo Tom,
ich werde deinen Vorschlag morgen testen.
hier - mit dieser Methode funktioniert es aktuell bei mir:
public static void OpenKSRResource(string relfilepath) { string tempPath = CreateTempFolders(); Uri u = new Uri("KSR;component/Documents/" + relfilepath, UriKind.Relative); StreamResourceInfo info = Application.GetResourceStream(u); byte[] bytesInStream = new byte[info.Stream.Length]; info.Stream.Read(bytesInStream, 0, bytesInStream.Length); // Verwendet AppData zur Ablage string pdfFilePath = System.IO.Path.Combine(tempPath, relfilepath); // Ressource auf Platte schreiben System.IO.File.WriteAllBytes(pdfFilePath, bytesInStream); // Anzeige via ShellExecute über das für PDF registrierte Programm System.Diagnostics.Process.Start(pdfFilePath); }
aber sauber ist anders...
danke und gruss
greenlion
-
Hallo nochmals,
bei mir klappt die erstellung des streams nicht.
habs nun mit meiner obigen Lösung belassen.
Villeicht mache ich da mal noch ein Re-design.
Im Moment muss es einfach nur funktionieren.
Wäre es denn theoretisch möglich die Resourcen in ein eigenes DLL zu kompilieren?
Welchen Projekt Typ muss man da auswählen?
Danke & Gruss aus der Schweiz
-
Hallo,
Wäre es denn theoretisch möglich die Resourcen in ein eigenes DLL zu kompilieren?
Ja, das geht mit fast allem, da eine DLL eine Anwendungserweiterung ist.Welchen Projekt Typ muss man da auswählen?
Eine ganz normale Klassenbilbiothek sollte funjktionieren. Bei Systemübergreifenden Projekten vielleicht eine portable Klassenbibliothek.Tom Lambert - C# MVP
Bitte bewertet- und markiert Beiträge als Antwort. Danke.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets