Erste Seite einer PDF Datei als JPG abspeichern

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von -Franky-.

    Erste Seite einer PDF Datei als JPG abspeichern

    Hallo zusammen,

    gibt es eine kostenlose Möglichkeit, von mehreren hundert PDF-Dateien die erste Seite als JPG-Datei abzuspeichern?

    Habe zwar schon diesen Beitrag hier PDF in Picturebox => Image bearbeiten => Image speichern => alles zur PDF zusammenfügen gefunden, aber leider die passende DLL Datei nicht (oder nur für einige 100 €). Daher wollte ich mal von Euch wissen, ob es eine kostenlose Möglichkeit gibt mein Problem zu lösen.

    Wenn es so etwas gibt, dann würde ich mich über entsprechende Quellen und einen kleinen Beispiel sehr freuen.

    Schönes Wochenende noch

    Volker
    @Volker Bunge Vielleicht formulierst Du die Frage anders:
    Du brauchst den Code für einen PDF-Viewer, den Du automatisieren möchtest.
    Ob die erste Seite nun als JPG oder PNG oder als Screenshot in der Zwischenablage landet, ist doch unerheblich.
    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!
    Hi

    Wenn ich mich recht erinnere, gibt es neben dem PreviewHandler vom Standardbetrachter, auch einen Handler, der von der ersten Seite ein Bild liefert. Einer von den nachfolgenden Interfaces müsste es sein: IShellItemImageFactory, IExtractImage oder IThumbnailProvider.
    Mfg -Franky-
    Hallo RodFromGermany,

    ein Viewer muss es nicht unbedingt werden, mir würde auch eine Verarbeitung ohne optische Anzeige reichen.

    Habe mal ein wenig mit einer Screenshot Möglichkeit gespielt. Grundsätzlich funktioniert dies auch, aber da die PDF-Dateien nicht immer die gleiche Größe haben, müsste ich hier ständig die Werte anpassen. Das ist aber nicht praktikabel.

    Wenn es also eine kostenlose DLL-Datei o. ä. gibt, die mir aus dem übergebenen Dateipfad eine JPG-Datei der ersten Seite erstellt, wäre mein Problem gelöst.

    Hallo Franky,
    Wenn ich mich recht erinnere, gibt es neben dem PreviewHandler vom Standardbetrachter, auch einen Handler, der von der ersten Seite ein Bild liefert. Einer von den nachfolgenden Interfaces müsste es sein: IShellItemImageFactory, IExtractImage oder IThumbnailProvider.


    Ich habe es bisher so geschafft, dass die PDF-Datei in einem Webcontrol angezeigt wird.

    Was ist bei Dir der Standardbetrachter bzw. wie meinst Du das mit den Handler? Ich habe von Tracker.com mir den PDF-XChange-Editor Plus installiert und der wird auch im Webcontrol für die Anzeige benutzt. Kann aber auch gerne Adobe Reader (neuste Version von gestern) nehmen für das Programm.

    Gruß
    Volker

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

    Hi

    Der Standardbetrachter ist das Programm, das Du für zB PDF selbst eingestellt hast (oder das Programm hat sich selbst dafür eingetragen) bzw das Programm, das bei einem Doppelklick auf die PDF, die PDF öffnet und zur Anzeige bringt. Das kann der Edge, der AdobeReader, der X-ChangeEditor oder auch jedes andere Programm sein das PDFs zur Anzeige bringen kann.

    Normalerweise steht entsprechend zur Dateiextension, hier also .pdf, in der Registry welches Programm zB für die Vorschau verwendet werden soll (Handler für das Interface IPreviewHandler). Einige Dateien besitzen darüber hinaus evtl noch weitere Handler. Für PDF gibt es, müsste man mal in die Registry schauen, noch einen weiteren Handler und über diesen, so meine Erinnerung, kommt man an ein Bild (GDI32-Bitmap) von der ersten Seite einer PDF.
    Mfg -Franky-
    Hi

    Hatte mal etwas Zeit eben da mal nachzuschauen. Das ganze läuft über das Interface IThumbnailProvider. Allerdings liefert dieses nur ein Bild der ersten Seite in max 256 Pixel (Höhe oder Breite, proportional skaliert). Denke das ist nicht das was Du suchst.
    Mfg -Franky-
    Hi

    Ich habe da noch eine andere Idee über das Interface IShellItemImageFactory. Mein erster Versuch, ist leider ein VB6 Programm, gibt mir ebenfalls die erste Seite der PDF in gewünschter Größe als Bild zurück. Allerdings hab ich hier auch den AcrobatReaderDC installiert. Von daher keine Ahnung ob das bei Dir dann auch so funktioniert. Ansonsten bleiben einem ja noch diverse PDF Libraries wie ITextSharp oder oder die das sicher können was Du möchtest.

    Edit: Auf die schnelle von VB6 nach VB.NET. Kann bei Dir funktionieren, muss es aber nicht. Das Bild zeigt bei mir zumindest die erste Seite als Bild (proportional an die PB angepasst) an. Die maximale Größe ist hier 1024x1024Pixel.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Public Class Form1
    3. Private Const S_OK As Integer = 0
    4. Private Const IID_IShellItemImageFactory As String = "BCC18B79-BA16-442F-80C4-8A59C30C463B"
    5. Private Enum SIIGBF As Integer
    6. SIIGBF_RESIZETOFIT = &H0
    7. SIIGBF_BIGGERSIZEOK = &H1
    8. SIIGBF_MEMORYONLY = &H2
    9. SIIGBF_ICONONLY = &H4
    10. SIIGBF_THUMBNAILONLY = &H8
    11. SIIGBF_INCACHEONLY = &H10
    12. SIIGBF_CROPTOSQUARE = &H20
    13. SIIGBF_WIDETHUMBNAILS = &H40
    14. SIIGBF_ICONBACKGROUND = &H80
    15. SIIGBF_SCALEUP = &H100
    16. End Enum
    17. <DllImport("Shell32.dll", EntryPoint:="SHCreateItemFromParsingName")>
    18. Private Shared Function SHCreateItemFromParsingName(
    19. <[In], MarshalAs(UnmanagedType.LPWStr)> pszPath As String,
    20. <[In]> pBC As IntPtr,
    21. <[In]> ByRef rIID As Guid,
    22. <Out, MarshalAs(UnmanagedType.Interface)> ByRef pUnk As Object) As Integer
    23. End Function
    24. <DllImport("Gdi32.dll", EntryPoint:="DeleteObject")>
    25. Private Shared Function DeleteObject(<[In]> hgdiobj As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    26. End Function
    27. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    28. Dim oUnk As Object = Nothing
    29. If SHCreateItemFromParsingName("D:\Downloads\Dokumente\Adobe Reader XI Deployment with Custom Settings.pdf",
    30. IntPtr.Zero, New Guid(IID_IShellItemImageFactory), oUnk) = S_OK Then
    31. ' max Size = 1024x1024!
    32. Dim ImageSize As New Size(PictureBox1.Width, PictureBox1.Height)
    33. Dim hBmp As IntPtr = IntPtr.Zero
    34. If CType(oUnk, IShellItemImageFactory).GetImage(ImageSize, SIIGBF.SIIGBF_RESIZETOFIT, hBmp) = S_OK Then
    35. PictureBox1.Image = Bitmap.FromHbitmap(hBmp)
    36. DeleteObject(hBmp)
    37. End If
    38. Marshal.ReleaseComObject(oUnk)
    39. End If
    40. End Sub
    41. <ComImport>
    42. <InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>
    43. <Guid(IID_IShellItemImageFactory)>
    44. Private Interface IShellItemImageFactory
    45. 'HRESULT GetImage(
    46. ' [in] SIZE size,
    47. ' [in] SIIGBF flags,
    48. ' [out] HBITMAP *phbm
    49. ');
    50. <PreserveSig> Function GetImage(<[In]> size As Size,
    51. <[In]> flags As SIIGBF,
    52. <Out> ByRef phbm As IntPtr) As Integer
    53. End Interface
    54. End Class
    Bilder
    • test.png

      47,58 kB, 706×660, 68 mal angesehen
    Mfg -Franky-

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

    Hallo Franky,

    also erst einmal vielen Dank für den Code. Habe Ihn gerade mal ausprobiert. Er funktioniert sofort.

    Habe den Code noch ein wenig umgebaut. Er sieht jetzt so aus

    Spoiler anzeigen

    Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Call PDFBild_anzeigen_Abspeichern("C:\Temp\Test1.pdf")
    3. MsgBox("Weiter")
    4. PDFBild_anzeigen_Abspeichern("C:\Temp\Test2.pdf")
    5. End Sub
    6. Sub PDFBild_anzeigen_Abspeichern(PDFDatei As String)
    7. Dim oUnk As Object = Nothing
    8. If SHCreateItemFromParsingName(PDFDatei, IntPtr.Zero, New Guid(IID_IShellItemImageFactory), oUnk) = S_OK Then
    9. ' max Size = 1024x1024!
    10. Dim ImageSize As New Size(PictureBox1.Width, PictureBox1.Height)
    11. Dim hBmp As IntPtr = IntPtr.Zero
    12. If CType(oUnk, IShellItemImageFactory).GetImage(ImageSize, SIIGBF.SIIGBF_RESIZETOFIT, hBmp) = S_OK Then
    13. PictureBox1.Image = Bitmap.FromHbitmap(hBmp)
    14. DeleteObject(hBmp)
    15. End If
    16. Marshal.ReleaseComObject(oUnk)
    17. End If
    18. ' Jetzt noch die Anzeige in der Picturebox abspeichern als JPG
    19. PictureBox1.Image.Save(Replace(PDFDatei, ".pdf", ".jpg"), System.Drawing.Imaging.ImageFormat.Jpeg)
    20. End Sub



    Somit wird auch die JPG-Datei erstellt und der Aufruf ist individueller. Aber das sind ja nur Schönheitsmakulaturen.
    Was auch sehr schön ist, ist die Geschwindigkeit. Läuft alles sehr schnell ab.

    Wenn jetzt noch die Qualität verbessert werden könnte, dann wäre das Super.

    Gruß
    Volker
    Hi

    Die PictureBox brauchst ja nicht wirklich. Setzte mal direkt auf "Dim ImageSize As New Size(1024, 1024)" und speichere Bitmap.FromHbitmap(hBmp) direkt als JPG ab. Wobei man für JPG ja noch eine Kompressionsqualität mit angeben kann. Ich wäre ja für PNG als Ausgabeformat. JPG ist ja ein verlustbehaftetes Kompressionsverfahren, PNG nicht (bessere Qualität als JPG).
    Mfg -Franky-
    Hi

    Huch, es geht sogar noch größer. Hmm, mir war so als hätte ich mal 1024x1024 als maximale Größe gelesen. Also es geht auch größer per IShellItemImageFactory.GetImage. Hab mal spaßeshalber 2048x2048 verwendet. Funzt auch.

    Edit: Du kannst beide Parameter für ImageSize gleich groß machen. Hat den Vorteil das das Bild automatisch proportional an diese Dimensionen angepasst wird (Flag SIIGBF.SIIGBF_RESIZETOFIT). Bei PDF Hochformat und ImageSize(1024,1024), ist eben die Höhe 1024 und die Breite wird proportional skaliert, bei PDF Querformat ist die Breite 1024 und die Höhe wird proportional skaliert.
    Mfg -Franky-

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

    Hallo Franky,

    ja, es geht, was die Zahlen betrifft, sogar noch mehr, aber leider wird die Qualität dadurch nicht besser, ehr sogar schlechter. Zu mindestens bei meinen beiden Test-PDF-Dateien.

    Hallo INOPIAE,

    habe mir mal den PDF24 Creator runter geladen. Wow, da hat sich aber optisch einiges geändert zu den Versionen, die ich so kenne.

    Der Export als Bilder funktioniert echt super und auch die Qualität ist mit den Standardwerten 140dpi und Qualität 75 sehr schön und genau mein Wunschergebnis. Was leider nicht klappt (oder ich habe es auf die Schnelle nicht gefunden) nur die erste Seite zu extrahieren. Aber da ich ja so nicht arbeiten will, hoffe ich, dass man mit dem Code die Seiten angeben kann, die man extrahieren möchte. Auch der Speicherort und -name wäre wichtig, dass ich den mit angeben kann.

    Werde mich mal auf die Suche nach einem passenden Code umsehen (oder hättest Du da einen für mich?)

    Gruß
    Volker
    Hi

    Was genau meinst Du mit Qualität? Ok, IShellItemImageFactory ist im eigentlichen Sinne nicht speziell für PDFs. Dieses Interface nutzt man eher für andere Sachen. Evtl. spielt da auch rein welcher PDF Betrachter verwendet wird. Meine Vermutung ist das vom PDF ein 1:1 Bild von der ersten Seite erstellt wird. Für A4 wären das bei 96dpi und 297 mm x 210 mm ~ 1123 Pixel x 794 Pixel die optimale Größe. Wenn man so eine Bild vergrößert, wird die Qualität natürlich schlechter. Man könnte noch einen Convolution Filter, oder entsprechende GDI+ APIs wie GdipDrawImageFX oder GdipBitmapApplyEffect, drüber laufen lassen um das Bild zB. zu schärfen/zu verbessern.

    Ansonsten haben die Kollegen hier ja weitere Möglichkeiten genannt die sicher bessere Möglichkeiten bieten.
    Mfg -Franky-

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