none
eingebettete Pdf-Datei öffnen RRS feed

  • Frage

  • Hallo,

    wie kann ich eine eingebettete oder unter  Resourcen eingefügte Pdf-Datei öffnen (VSC#2010)?

    Gruß

    mmx2010

    Dienstag, 3. Juli 2012 10:59

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


    Dienstag, 3. Juli 2012 11:37
    Beantworter
  • 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

    Dienstag, 3. Juli 2012 15:58
    Moderator

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


    Dienstag, 3. Juli 2012 11:37
    Beantworter
  • Hallo Elmar,

    danke, ich wolte eigentlich verhindern, die Pdf.Datei auf die Platte zu schreiben, schade!

    Gruß

    mmx2010

    Dienstag, 3. Juli 2012 12:08
  • 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

    Dienstag, 3. Juli 2012 15:58
    Moderator
  • Hallo Marcel,

    danke für Deine Antwort.

    Ich werde auf jedenfall Deine Lösung ausprobieren.

    Gruß

    mmx2010

    Mittwoch, 4. Juli 2012 06:56
  • 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,
    Robert


    Robert Breitenhofer, MICROSOFT  Twitter Facebook
    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.

    Dienstag, 24. Juli 2012 10:13
    Moderator
  • 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

    Donnerstag, 15. Mai 2014 09:46
  • 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


    Donnerstag, 15. Mai 2014 15:27
    Moderator
  • 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/" + relfilepathUriKind.Relative);
                StreamResourceInfo info = Application.GetResourceStream(u);
     
                byte[] bytesInStream = new byte[info.Stream.Length];
                info.Stream.Read(bytesInStream0bytesInStream.Length);
     
                // Verwendet AppData zur Ablage
                string pdfFilePath = System.IO.Path.Combine(tempPathrelfilepath);
                // Ressource auf Platte schreiben
                System.IO.File.WriteAllBytes(pdfFilePathbytesInStream);
                // Anzeige via ShellExecute über das für PDF registrierte Programm
                System.Diagnostics.Process.Start(pdfFilePath);
            }

    aber sauber ist anders...

    danke und gruss

    greenlion

    Donnerstag, 15. Mai 2014 15:32
  • 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

    Freitag, 16. Mai 2014 08:09
  • 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

    Freitag, 16. Mai 2014 14:26
    Moderator