PDF auslesen und sortieren

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

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    PDF auslesen und sortieren

    Hallo liebe Community,

    ich möchte folgendes Projekt umsetzten:

    Ich habe einen Ordner in dem jeden Tag ca. 200-300 Pdf´s gespeichtert werden. Diese haben mal 2 Seiten und mal 3 oder auch mal 4 Seiten.

    Nun möchte ich mittels eines kleines Programmes diese sortieren.

    Die pdf´s sollen dann in einen jeweiligen Ordner gespeichert werden. 1. Ordner = PDF mit 2 Seiten, 2. Ordner = PDF mit 3 Seiten usw

    1. Frage
    Ist das überhaupt umsetzbar?

    2. Frage
    Wenn ja, wie hoch ist der Aufwand

    3. Frage
    Kann ich das als absoluter Neuling umsetzen?

    Vielen Dank im Voraus für die Hilfe.

    LG
    Ob du das kannst und wie lange du brauchst, kann ich dir nicht sagen.
    Aber möglich ist es.

    Es sind zwei Probleme, die es getrennt zu lösen gilt.
    Du musst erst mal das Verzeichnis auf PDF-Files durchsuchen.
    Da kann dir DirectoryInfo weiterhelfen.

    Dann musst du die PDFs analysieren:
    stackoverflow.com/questions/32…er-of-pages-in-a-pdf-file
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ersteinmal Danke für die schnelle Antwort.

    Für das erste problem habe ich folgendes erstellt.

    Wahrscheinlich totaler Bockmist, aber so kann ich zumindest schon einmal die Datein finden.


    VB.NET-Quellcode

    1. Private Sub search_Click(sender As Object, e As EventArgs) Handles search.Click
    2. Dim sFile As String
    3. Dim sPath As String
    4. sPath = "PFAD"
    5. If Not sPath.EndsWith("\") Then sPath += "\"
    6. For Each sFile In My.Computer.FileSystem.GetFiles( _
    7. sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.pdf")
    8. ListBox1.Items.Add(sFile.Substring(sPath.Length))
    9. Next
    10. End Sub


    Beim 2. Schritt wird es wohl ein bisschen komplizierter...
    Vielleicht kann man mir dort eine kleine Hilfestellung geben.

    LG
    Kleines Update.

    Habe aufgrund von tutorials jetzt einen code mit dem ich in einem Ordner einzelne Dateitypen (.pdf,.jpg,usw) sortieren kann und in jeweils einen neuen Ordner kopiere.

    Jetzt muss ich nur anstelle von unterschiedlichen Dateitypen die unterschiedlichen pdf´s verschieben/kopieren können.

    D.h. ich muss die werte einer pdf auslesen und den wert der Seitenanzahl in eine Variable schreiben, mit der ich dann sagen kann, alle mit dem und dem wert in einen ordner usw.

    Nur mit itextsharp bekomme ich das überhaupt nicht hin.

    PDf erstellen geht.

    Wäre super, wenn mir einer anhand eines Beispiels oder mit Hilfestellung dort zur Seite stehen kann.

    LG
    Ich muss einfach zugeben, dass es meine Möglichkeiten übersteigt. Bin halt aus dem Alter des Lernens heraus ^^

    Dachte ich könnte es mit meinem Minimalwissen an vb schaffen. Aber das war wohl ein Irrtum.

    Wenn ich mir das angucke, verstehe ich leider nicht so viel...
    Wie kann ich dem Programm denn sagen, dass er sich in einem Ordner alle pdfs angucken soll und dann ausgeben, welche dasvon wie viel Seiten haben...-.-

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text.RegularExpressions
    3. Private Function pageCountPDF(ByRef pdfFile As FileInfo) As Integer
    4. pageCountPDF = 0
    5. If pdfFile.Exists Then
    6. Dim fs As FileStream = New FileStream(pdfFile.FullName, FileMode.Open, FileAccess.Read)
    7. Dim sr As StreamReader = New StreamReader(fs)
    8. Dim pdfMagicNumber() As Char = "0000".ToArray
    9. sr.Read(pdfMagicNumber, 0, 4)
    10. If pdfMagicNumber = "%PDF".ToArray Then
    11. Dim pdfContents As String = sr.ReadToEnd()
    12. Dim rx As Regex = New Regex("/Type\s/Page[^s]")
    13. Dim match As MatchCollection = rx.Matches(pdfContents)
    14. pageCountPDF = match.Count
    15. Else
    16. Throw New Exception("File does not appear to be a PDF file (magic number not found).")
    17. End If
    18. Else
    19. Throw New Exception("File does not exist.")
    20. End If
    21. End Function


    Danke trotzdem für die Hilfe.
    Ich werde mich wohl geschlagen geben müssen und jemanden Fragen, ob er das für mich macht^^

    LG

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „TeeJay“ ()

    Kleines Beispiel.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Sortiert PDF Dateien in einem Ordner anhand iherer Seitenanzahl
    3. ''' </summary>
    4. ''' <param name="di">DirectoryInfo -Objekt das den Ordner mit den PDF -Dateien, die sortiert werden sollen, repräsentiert</param>
    5. Private Sub SortPDF(di As DirectoryInfo)
    6. For Each pdf As FileInfo In di.GetFiles("*.pdf", SearchOption.AllDirectories)
    7. MovePdf(di, pdf, PdfHelper.GetPageCount(pdf))
    8. Next
    9. End Sub
    10. ''' <summary>
    11. ''' Verschiebt eine PDF -Datei in einen Ordner, mit dem Namen der Seitenanzahl, dieser PDF
    12. ''' </summary>
    13. ''' <param name="rootDirectory">Das Root -Verzeichniss in dem die Ordner für die Sortierung der PDF -Dateien erstellt werden sollen</param>
    14. ''' <param name="pdf">FileInfo -Objekt das die gegenwärtige PDF -Datei repräsentiert</param>
    15. ''' <param name="pageCount">Seitenanzahl der gegenwärtigen PDF</param>
    16. ''' <returns>True wenn verschieben der PDF abgeschlossen wurde</returns>
    17. Private Function MovePdf(rootDirectory As DirectoryInfo, pdf As FileInfo, pageCount As Integer) As Boolean
    18. ' Erstellen eines DirectroyInfo -Objekts das den Speicherort für die jeweilige PDF repräsentiert
    19. Dim savePath As New DirectoryInfo(Path.Combine(rootDirectory.FullName, pageCount.ToString()))
    20. ' Prüfen ob der Ordner für die jeweilige Seitenanzahl der PDF bereits existiert, wenn nicht wird dieser Ordner erstellt
    21. If Not savePath.Exists Then
    22. savePath.Create()
    23. End If
    24. ' Verschieben der PDF in den Zielordner
    25. pdf.MoveTo(Path.Combine(savePath.FullName, pdf.Name))
    26. ' Methode verlassen
    27. Return True
    28. End Function


    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Imports System.IO
    3. Public NotInheritable Class PdfHelper
    4. ' RegularTextExpression
    5. Private Shared regx As Regex
    6. ' Konstruktor
    7. Shared Sub New()
    8. regx = New Regex("/Type\s*/Page[^s]")
    9. End Sub
    10. ''' <summary>
    11. ''' Ermittelt mittels RegularExpression die Seitenanzahl einer PDF
    12. ''' </summary>
    13. ''' <param name="pdf">System.IO.FileInfo -Objekt der PDF Datei</param>
    14. ''' <returns>Int32 Seitenanzahl</returns>
    15. Public Shared Function GetPageCount(pdf As System.IO.FileInfo) As Integer
    16. Using fs As New FileStream(pdf.FullName, FileMode.Open, FileAccess.Read, FileShare.Read)
    17. Using sr As New StreamReader(fs)
    18. Dim matches As MatchCollection = regx.Matches(pdf.FullName)
    19. Return matches.Count
    20. End Using
    21. End Using
    22. End Function
    23. End Class


    TeeJay schrieb:

    Bin halt aus dem Alter des Lernens heraus
    Ich habe keine Ahnung wie alt du bist.
    Aber das klingt nicht gut.
    Diese Aussage darf eigentlich frühestens kommen, wenn die Demenz schneller ist als die Lernfähigkeit.
    Insofern wünsche ich dir, dass du nie aus dem Alter des Lernens herauskommen wirst.

    Aber @Fakiz hat dir ja eine schöne C&P-Lösung präsentiert.
    Wenn du sie jetzt noch zu verstehen versuchst, hast du was gelernt.

    Die Methode funktioniert übrigens nur bei unverschlüsselten bzw. ungeschützten PDFs.
    Ansonsten musst du doch auf eine der Bibliotheken zugreifen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Vielen Dank an @Fakiz, ich bin dabei das ganze zu verstehen.

    Mein Problem gerade ist, dass er die PDF findet und auch verschiebt, nur erstellt er immer nur einen Ordner mit 0 und schiebt da alle PDF´s rein. Obwohl dort auch pdfs mit mehr Seiten sind...

    Weiß nicht woran es liegen könnte.
    wie baue ich das ganze denn Sinnvoll ein

    Hier kommt nun das Verständiss ins Spiel. Du hast in meinem Beispiel 1 Klasse und 2 Methoden (SortPDF & MovePdf). Methoden lassen sich mit dem Namen der jeweiligen Methode aufrufen (ganz einfach gesagt).
    Das heisst du musst in deinem Button_Click -Event den Namen der Methode eingeben inkl. eines DirectoryInfo -Objekts des Ordners mit den PDF´s.

    Bei der Regex wüsste ich jetzt nicht, was ich da noch ändern müsste

    Vermutlich garnichts, ich hab mal kurz im Internet nach dem Problem gesucht. Dort habe ich gelesen das das Problem bei PDF´s >= vers. 1.6 auftritt. Du müsstest also wie @petaod schon sagte auf eine Bibliotheken zurück greifen.
    Versuche mich gerade an den Bibliotheken. Bei itextsharp gibt es halt nur Dokus und Beispiele im Bereich c#. Habe dort sogar ein fertiges rogramm gefunden, welches via Drag and drop mir PDF´s ausliest. Nur leider nicht Sortieren kann, sondern schlicht weg die Seiten ausliest.

    Gibt es für itextsharp eine Lösung für vb.net?

    Hier der Link zu dem Prog.:
    codeproject.com/Articles/832675/PDF-Page-Counter