AES-verschlüsseltes PDF in Speicher entschlüsseln und in CEFSharp laden

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    AES-verschlüsseltes PDF in Speicher entschlüsseln und in CEFSharp laden

    Hallo Ihr Profis,

    nachdem mir in diesem Forum so toll geholfen wurde, komme ich mit einem weiteren Problem.

    Ich möchte meinem Multi-Editor (siehe mein anderer Frage-Thread) wie im Titel beschrieben, neben TXT, RTF, Bild-Verschlüsselung auch PDF-Verschlüsselung anbieten.
    Das funktioniert in meinem Editor so, dass die verschlüsselt gespeicherten TXT, RTF und Bildobjekte verschlüsselt in den Speicher geladen, hier mit dem Objekt-Crypt-Key entschlüsselt werden und anschliessend die entschlüsselten Inhalte im integrierten Text- bzw. Bild-Editor angezeigt werden.

    Nun stehe ich aber bei den PDF-Dokumenten aber vor einem Problem.
    Ich finde keine Möglichkeit, die PDFs, die ebenfalls nach dem Öffnen als entschlüsselte Streams im Speicher liegen, im CEFSharp-Browser anzeigen zu lassen.
    Die einzige Option, die ich im CFSharp finde, ist das herkömmliche Laden von unverschlüsselten PDFs mit

    VB.NET-Quellcode

    1. name = "File:///" & DateiPfad.Replace("\", "/")
    2. tsc_Webbrowser_CWebbrowserBox.LoadUrlAsync(name)

    einzubinden.

    Klar, ich könnte die PDF-Datei in ein Temp-Verzeichnis entschlüsseln und diese PDF dann aus diesem Verzeichnis mit v.g. Funktion in den CEFSharp laden.
    Aber das ist ja nicht die sichere Vorgehensweise, welche mir vorschwebt.
    Denn dann liegt die verschlüsselte PDF-Datei ja unverschlüsselt auf der Festplatte.
    Zumindest solange, bis der CEFSharp diese eingelesen hat.

    Kennt daher jemand von Euch einen anderen Weg, um die entschlüsselte PDF als MemoryStream direkt im CEFSharp anzuzeigen?

    ChatGPT steht diesbezüglich auf dem Schlauch - oder ich formuliere meine Fragen falsch...
    Schönes Rest-Weekend @all

    EDIT:

    Ganz vergessen...
    Das Laden und Anzeigen einer unverschlüsselten PDF mit:

    VB.NET-Quellcode

    1. ' Leeren der CEFSharp-Ausgabe
    2. tsc_Webbrowser_CWebbrowserBox.LoadHtml("", "http://Platzhalter.de")
    3. ' Unverschlüsselte PDF einlesen
    4. Dim pdfData As Byte() = File.ReadAllBytes(objektpfad)
    5. Dim base64Pdf As String = Convert.ToBase64String(pdfData)
    6. Dim pdfUrl As String = "data:application/pdf;base64," & base64Pdf
    7. ' Anzeigen der PDF
    8. tsc_Webbrowser_CWebbrowserBox.Load(pdfUrl)
    9. ' ToolStripControl mit Webbrowser anzeigen
    10. aktiviereToolstripContainer(4)


    klappt bei mir nicht.
    Hier erhalte ich nur die leere CEF-Sharp-Seite, welche ich in der Funktion zuerst generiere.
    Aber die geladene PDF wird nicht engezeigt.
    Obwohl kein Fehler auftritt.

    EDIT2:
    Solved!
    Ich habe natürlich ausgerechnet ein korruptes PDF zum Testen erwischt - mit einem anderen PDF klappt es.
    Man sollte Fehler eben immer unter verschiedenen Bedingungen testen... :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dideldum“ ()

    Dideldum schrieb:

    Kennt daher jemand von Euch einen anderen Weg, um die entschlüsselte PDF als MemoryStream direkt im CEFSharp anzuzeigen?


    Das hier könnte dich weiterbringen, ich finde das sieht nach dem aus, was du brauchst. Geht im Thema zwar um lokale Dateien, aber die werden da mit einem MemoryStream geladen, das suchte glaube ich. (Einfach mal mit einem C# -> VB Converter übersetzen und Teile davon verwenden)
    thechriskent.com/2014/04/21/use-local-files-in-cefsharp/
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Servus DTF,

    besten Dank für Deinen Tip.
    Habe ein EDIT an mein EP rangeknotet - der Fehler lag an der Test-PDF, welche offensichtlich einen Fehler beinhaltet, der sich zwar nicht im Acrobat, aber im CFSharp zeigt.
    Mit einer anderen Test-PDF funzt es mit meinem unter EDIT angefügten Script (mit vorherigem Entschlüsseln in das "pdfdata"-Byte-Array).

    Schönen Sonntag wünsche :)

    Dideldum schrieb:

    welche offensichtlich einen Fehler beinhaltet, der sich zwar nicht im Acrobat, aber im CFSharp zeigt.


    Dann stellt sich die Frage, warum funktioniert es mit Adobe Acrobat und nicht mit CEFSharp. Allerdings gilt der Aufbau von PDF-Dateien ist manchmal richtig grausam umgesetzt. Da musst Du eigentlich tiefer in die PDF-Datei reinschauen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hi

    Die eigentliche Frage wäre, warum man einen WebBrowser, Betonung liegt hier auf Web, verwendet um PDFs anzuzeigen?

    Windows selbst enthält Möglichkeiten um verschiedene Dateien anzuzeigen. Speziell für PDFs gibt es ab Win10 dann auch noch die Möglichkeit über die WinRT -> learn.microsoft.com/de-de/uwp/…data.pdf?view=winrt-22621 PdfDocument.LoadFromStreamAsync lädt z.b. eine PDF aus einem IRandomAccessStream <-> IStream.
    Mfg -Franky-
    Hi Ihr Zwei,

    Danke für Euren Beiträge. :)

    @INOPIAE
    Keine Ahnung was in dem Test-PDF nicht OK ist. Das ist ein wohl selbstgeschnitztes Asterix-Comic aus dem Web. Ich denke, der Acrobat ist da vielleicht etwas fehlertoleranter als der CEFSharp.
    Aber natürlich musste ich genau das Eine defekte PDF zum Testen hernehmen (man sollte Murphy halt doch ernst nehmen :D )- hätte gleich irgendein ordentlich erstelltes Gesetzbuch- o.ä. PDF verwenden sollen.

    @-Franky-
    Oh, das wusste ich nicht, dass es eine eigene PDF-Klasse gibt.
    Ich habe bis vor 20 Jahren mit VB6 gewurstelt. Und dann erst wieder 2023 mit VB.Net weitergemacht.
    Und mein erstes Projekt ist die Neuauflage eines Programms, welches ich eben vor über 20 Jahren mit VB6 geknotet habe.
    Da bin ich noch gaaaaanz am Anfang zu erlernen, wie das mit VB.net funktioniert und was damit alles geht.
    Gibt es für diese PDF-Klasse vielleicht auch VB.net Code-Beispiele?
    Muss mal ChatGPT ausquetschen...
    Wäre zwar eine grössere Änderung an meinem Proggi - würde sich aber wohl rentieren.
    Wobei die PDF-Darstellung im CEFSharp aber nicht die Schlechteste ist. ;)

    EDIT:
    ChatGPT sagt, dass Windows.Data.Pdf Namespace nur in UWP-Anwendungen, nicht aber in Window-Forms-Anwendungen realisierbar ist.
    Eine solche ist aber mein Proggi.
    Ich soll das "PDFium" aus dem NuGet einbauen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()

    Dideldum schrieb:

    Ich denke, der Acrobat ist da vielleicht etwas fehlertoleranter als der CEFSharp.
    Ich durfte mich in der letzten Zeit damit befassen, aus PDF-Dateien einfache Text-Informationen zu extrahieren.
    Ich habe mit 5 (fünf) vereschiedenen Programmen gearbeitet, um das zu erreichen, es ist mir nicht gelungen, aus allen Dateien die gewünschte Information zu erhalten.
    Das PDF-Format ist außerordentlich komplex, es gibt sehr viele Möglichkeiten, dort die Information unterzubringen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Dideldum -> Ich habe bis vor 20 Jahren mit VB6 gewurstelt.
    Ahh, daher. Ja da zu der Zeit gab es auch immer den Vorschlag für PDFs, GIFs usw das WebBrowser-Control zu verwenden. Alternativ vllt noch das AdobeReader-Control für PDFs. ;)

    -> ChatGPT sagt, dass Windows.Data.Pdf Namespace nur in UWP-Anwendungen, nicht aber in Window-Forms-Anwendungen realisierbar ist.
    Don't do this. ChatGPT ist dumm. Denn wenn es "Intelligent" wäre, hätte ChatGPT Dir eine Lösung nennen können. ;)

    WinRT wird hauptsächlich in UWP verwendet. Soweit korrekt, aber eben nur zu 50%. Was ChatGPT verschweigt ist, das die WinRT aus ganz normalen APIs und COM-Interfaces besteht. Also in jeder Sprache verwendet werden kann, die mit APIs und COM-Interfaces umgehen kann. Von daher auch in WinForms und .... auch in VB6. :)

    -> Gibt es für diese PDF-Klasse vielleicht auch VB.net Code-Beispiele?
    Ja, gibt es. PDF, Seiten als Bilder anzeigen und extrahieren Bedenke aber bitte, das das nur Testcode ist, der nur zeigt wie es grundsätzlich funktioniert.
    Bis .Net 4.8.xx könnte man auch entsprechende Referenzen und 2 Nuget-Pakete verwenden um das einfacher zu programmieren. Die Referenzen und Nuget-Pakete funktionieren aber ab .Net5 nicht mehr. Daher hab ich gleich den Weg über die APIs und COM-Interfaces genommen. Für die, die sich damit auskennen, ist es auch einfach den Code zu erweitern oder zu verbessern. Für andere, die noch nie damit gearbeitet haben, wird es schwer den Code zu verstehen.
    Mfg -Franky-
    Hi Ihr,

    danke für Eure Tips! :)

    @RodFromGermany
    Na, so schwierig habe ich es zum Glück nicht.
    Mein Proggi beinhaltet u.a. nur einen Text(TXT und RTF)-Editor, einen Bild-Editor und eben den Webbrowser, um HTML- und PDF-Dokumente anzuzeigen und um Webadressen aufrufen zu können.
    Alle Dateiformate könnne auf Wunsch verschlüsselt gespeichert werden.
    Das Ganze wird ein Archiv für die Zwischenablage.
    D.h. es werden auf Wunsch automatisch alle Zwischeninhalts-Objekte in das Archiv übernommen und nach vorzugebenden Kriterien in die Archivordner einsortiert, wo diese weiter bearbeitet und/oder an andere Anwendungen gesendet werden können.
    Bin schon fast fertig, es klemmen nur noch ein paar Kleinigkeiten.
    Da die PDF-Dokumente also nur nicht-editierbar angezeigt werden, muss ich mich gottlob nicht mit deren Formatierung auseinandersetzen - solange diese intakt ist.

    @-Franky-
    Genau - damals hatte ich das Adobe-Control in der V1 meines Proggies eingebunden.
    Mein Proggi habe ich für NET 4.7 gestrickt. Wobei es eigentlich auch mit höheren Versionen funktionieren sollte.
    Dass ChatGPT nicht immer richtig liegt, habe ich auch schon bemerkt. Aber immerhin hat es mir schon bei so mancher Frage gute Tips geben können.
    Danke für Deinen Link. Muss mir das Demo mal ansehen und schauen, ob ich das integrieren könnte.
    Allerdings habe ich ja ohnehin den CEFSharp im Proggi.
    Würde es daher überhaupt Sinn machen, die PDF-Anzeige aus diesem rauszuziehen?
    Ich bin mit VB.net noch alles andere als vertraut.
    Hiermit ist halt alles soooo anders, als damals mit VB6.
    Hi

    Ist in dem Zusammenhang, wie Du den WebBrowser nutzt, völlig ok. Zumal Du auch HTML-Seiten anzeigen und damit im Web browsen möchtest. Dann spricht auch nichts dagegen den WebBrowser auch zur Anzeige von PDFs zu nutzen.

    Ich habe immer nur bedenken, wenn nur PDFs in einem WebBrowser angezeigt werden sollen und der WebBrowser für sonst nichts verwendet wird. Das macht in meinen Augen keinen Sinn.
    Mfg -Franky-
    Hi @-Franky-
    besten Merci für die Info. :)
    Na, dann bin ich ja beruhigt.
    Der Tausch des PDF-Viewers wäre auch nicht trivial geworden.
    Zumal die Ver- und Entschlüsselung im Speicher inzwischen prima mit den Dateitypen TXT, RTF, HTML und PDF klappt.
    Was mir noch fehlt, sind ein paar Beta-Tester.
    Ein Coder findet seine Fehler i.d.R. nicht.
    Die kommen erst auf, wenn der uninformierte User Misteingaben -macht, die man selbst nie machen würde.
    @Dideldum
    Falls Du Dich dafür interesierst, welche Möglichkeiten, ohne WinRT, Windows noch so anbietet um PDFs und auch andere Dateien anzuzeigen, dann wäre das hier auch was: Dateivorschau per Interface IPreviewHandler Das ist der Standard, den der Explorer für die Preview ebenfalls nutzt. Hier müsstest einfach nur die Zeile If SHCreateStreamOnFileEx(strFileName,... entsprechend austauschen. Also den MemoryStream in einem IStream packen. Ist zwar ungetestet, sollte aber funktionieren. Sofern der PreviewHandler das laden der Datei per IStream unterstützt (sollte mittlerweile Standard sein).

    Dideldum schrieb:

    Was mir noch fehlt, sind ein paar Beta-Tester.
    Dafür gibt es hier entsprechende Unterforen wo Du Deinen Code hochladen kannst.
    Mfg -Franky-
    Hallo @-Franky-

    ui, das ist ja superklasse, Dein Vorschlag mit dem IPreviewHandler.
    Da muss ich unbedingt Deine Zip inspizieren und schauen, ob ich den in mein Projekt einbauen kann.
    Ein Office-Viewer fehlt mir noch in meinem Projekt.
    Vorbereitet ist zwar schon alles dafür, aber als ich den Preis gesehen habe, den so ein Unternehmen für das Office-PlugIn aufruft, ist mir schlecht geworden.
    Daher habe ich den Office-Viewer in meinem Projekt auf die lange Bank geschoben.
    Recht herzlichen Dank für diese Info! :)

    Wusste gar nicht, dass man hier auch nach Beta-Testern fragen kann.
    Muss mal suchen, wo dieser Bereich ist.
    Auch dafür bestes Gracie Mille. ^^
    @Dideldum Ohne ein installiertes Office, kann auch der IPreviewHandler keine Officedateien anzeigen und wenn kein PreviewHandler für eine Datei vorhanden ist, wird eigentlich nichts angezeigt. Ich habe meinen Code entsprechend so erweitert, das zumindest entweder ein Bild oder ein Icon angezeigt wird. Sofern die PreviewHandler für bestimmte Dateien nicht durch andere Programme ersetzt wurden, werden die Standard-PreviewHandler von Windows genutzt. Für PDF wäre das der EdgeBrowser, für RTF ist das WordPad, für TXT der Editor, für Audio/Video der WMP, für Bilder die Fotoanzeige usw.
    Mfg -Franky-
    Hi @-Franky-

    besten Dank ^^ - ja das habe ich schon in Deinem verlinkten Thread gelesen.
    Dieser liest sich exakt so, als ob ich den Handler supergut brauchen könnte. :thumbsup:

    Mein Proggi braucht eh ein installiertes Office-Paket, um die Objekte direkt aus dem Programm heraus als E-Mail-Anlagen versenden zu können.
    Damit ist auch der verschlüsselte Austausch von Objekten möglich.
    Freie APIs für andere Mail-Programme habe ich nicht gefunden, um diese einzubinden.

    Anlagen kann die MailTo-Funktion ja leider nicht verarbeiten, die bei nicht installiertem Office zum Einsatz kommt.
    Wer also kein Office-Paket aber ein anderes Mail-Proggi installiert hat, bekommt die Anlagen-Pfade daher in das Textfeld seines "Mail-Verfassen"-Fenster reingeschrieben, welches sich beim Mailto öffnet und muss dann manuell diese Pfade einzeln in das Anlage-Einfügen-Fenster seines Mail-Programms reinkopieren und kann so die Objekte als Anlage anfügen.
    Besser habe ich es nicht hinbekommen.

    Da ich für TXT, RTF und Bilder eigenständige Editoren gebaut habe und für HTML und PDF den CEFSharp einsetze, fehlt nur noch der Betrachter bzw. ein Editor für Office-Dokumente.
    Wobei meine Objekte aber auch jederzeit mit einem Klick in einer externen, in den Programm-Einstellungen dem Objekt-Typ zuordnungsbaren Anwendung geöffnet werden können.
    Daher reicht mir ein reiner Viewer für Office-Dokumente direkt im Programm - ist viel besser, als dieses irre teure Office-Plug-In. Wobei dieses halt auch das Editieren direkt im Programm erlauben würde

    Dann bleiben nur noch die Shortcut- und Ausführbare-Dateien als weitere Objekte.
    Alle Eigenschaften der Shortcut-Objekte werden noneditable im Texteditpr angezeigt. Diese Shortcut-Objekte können durch einen Klick ausgeführt werden.
    Die Ausführbare-Objekte können ja eh nur ebenso mit einem Klick ausgeführt werden.

    Da sind die Objekt-Typen, die mein Proggi kann:

    Standard Objekt-Typen

    Unverschlüsselte Objekt-Typen:

    Text = Text-Objekte mit ".txt", ".asc", ".ini", ".lst", ".log", ".bat"-Endung

    RTF = Richtext-Objekte mit ".rtf"-Endung

    Bild = Bild-Objekte im Format ".bmp", ".dib", ".emf", ".gif", ".ico", ".jpe", ".jpg", ".jpeg", ".pcd", ".png", ".tif", ".tiff", ".wmf"-Endung

    HTML = HTML-Objekte mit ".htm" oder ".html"-Endung

    MS-Office = Offfice-Objekte mit ".doc", ".xls", ".ppt", ".docx", ".xlsx", ".pptx", ".mdb", ".accdb", ".accdt"-Endung

    Shortcut = Verknüpfungs-Objekte mit ".lnk"-Endung

    PDF = PDF-Objekte mit ".pdf"-Endung

    EXE = EXE-Objekte mit ".exe", ".com", ".hlp"-Endung

    Verschlüsselte Objekt-Typen:

    TextC = im ICE verschlüsselte Text-Objekte mit ".txtc", ".ascc", ".inic", ".lstc", ".logc", ".batc"-Endung

    RTFC = im ICE verschlüsselte Richtext-Objekte mit ".rtfc"-Endung

    BildC = im ICE verschlüsselte Bild-Objekte im Format ".bmpc", ".dibc", ".emfc", ".gifc", ".icoc", ".jpec", ".jpgc", ".jpegc", ".pcdc", ".pngc", ".tifc", ".tiffc", ".wmfc"-Endung

    HTMLC = im ICE verschlüsselte HTML-Objekte mit ".htmc" oder ".htmlc"-Endung

    MS-OfficeC = im ICE verschlüsselte Offfice-Objekte mit ".docc", ".xlsc", ".pptc", ".docxc", ".xlsxc", ".pptxc", ".mdbc", ".accdb", ".accdt"-Endung

    ShortcutC = im ICE verschlüsselte Verknüpfungs-Objekte mit ".lnkc"-Endung

    PDFC = im ICE verschlüsselte PDF-Objekte mit ".pdfc"-Endung

    EXEC = im ICE verschlüsselte EXE-Objekte mit ".exec", ".comc", ".hlpc"-Endung

    Erfahrene PC-Benutzer können diese Zuordnung der Objekt-Typen durch durch das Editieren der Datei "FileTypes.ice" im Installationsordner des ICE mit einem Text-Editor an eigene Anforderungen anpassen und erweitern.