proflash
Goto Top

PDFs nach Inhalt Sortieren

Hallo zusammen,

ich benötige Hilfe.
Und zwar habe ich mehrere PDF Dateien in einem Ordner die unterschiedlich und ohne Kontext benannt sind. (Je nach Scanner unterschiedlich)
Nun möchte ich diese nach einem oder mehreren bestimmten Wörtern durchsuchen und dann in bestimmte Ordner sortieren.

Beispiel: Ich habe eine PDF z.B. von Amazon und eine von Reichelt. Dann möchte ich das die PDFs nach dem Begriff "Amazon" durchsucht werden und bei einem Treffer in den Ordner "Amazon" einsortiert werden und das selbe halt auch bei Reichelt usw...

Die Dateinamen sollen nicht geändert werden.

Ich nutze Windows 10 und suche eine Lösung über eine OpenSource Software oder auch gerne per Skript. (Powershell Python usw)

Ich hoffe ihr könnt mir helfen und ich bedanke mich schon mal. :D

Content-ID: 2446188529

Url: https://administrator.de/contentid/2446188529

Ausgedruckt am: 24.11.2024 um 04:11 Uhr

Doskias
Doskias 08.04.2022 um 10:32:36 Uhr
Goto Top
1915348599
1915348599 08.04.2022 aktualisiert um 11:51:56 Uhr
Goto Top
ProFlash
ProFlash 11.04.2022 um 13:21:24 Uhr
Goto Top
So...

habe ein Skript gefunden was soweit für mich gut funktioniert.

Add-Type -Path "C:\path_to_dll\itextsharp.dll"  
$pdfs = gci "C:\path_to_pdfs" *.pdf  
$export = "C:\path_to_export\export.csv"  
$results = @()
$keywords = @('Keyword1','Keyword2','Keyword3')  

foreach($pdf in $pdfs) {

    Write-Host "processing -" $pdf.FullName  

    # prepare the pdf
    $reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $pdf.FullName

    # for each page
    for($page = 1; $page -le $reader.NumberOfPages; $page++) {
    
        # set the page text
        $pageText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader,$page).Split([char]0x000A)

        # if the page text contains any of the keywords we're evaluating 
        foreach($keyword in $keywords) {
            if($pageText -match $keyword) {
                $response = @{
                    keyword = $keyword
                    file = $pdf.FullName
                    page = $page
                }
                $results += New-Object PSObject -Property $response
            }
        }
    }
    $reader.Close()
}

Write-Host ""  
Write-Host "done"  

$results | epcsv $export -NoTypeInformation

Quelle: https://wikimho.com/de/q/superuser/1278479/pdf-inhalte-mit-powershell-du ...

Nun möchte ich die PDFs bei gefundenen Keyword in einem entsprechenden Ordner verschieben. Als erstes habe ich es generell mit einer If Anweisung versucht und den CSV Export weg gelassen.

Add-Type -Path "C:\Users\WithakeN\Desktop\testpdf\itextsharp.dll"  
$pdfs = gci "C:\Users\WithakeN\Desktop\testpdf" *.pdf  
$export = "C:\Users\WithakeN\Desktop\testpdf\export.csv"  
$results = @()
$keywords = @('keks','apfel','Keyword3')  


foreach($pdf in $pdfs) {

    Write-Host "processing -" $pdf.FullName  

    # prepare the pdf
    $reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $pdf.FullName

    # for each page
    for($page = 1; $page -le $reader.NumberOfPages; $page++) {
    
        # set the page text
        $pageText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader,$page).Split([char]0x000A)

        # if the page text contains any of the keywords we're evaluating 
        foreach($keyword in $keywords) {
            if ($pageText -match $keyword) {
                 Move-Item -Path C:\Users\WithakeN\Desktop\testpdf\$pdf.
                  -Destination C:\Users\WithakeN\Desktop\testpdf\Apfel
                }
                $results += New-Object PSObject -Property $response
            }
        }
    }
    $reader.Close()


Write-Host ""  
Write-Host "done"  

$results | epcsv $export -NoTypeInformation

Leider bekomme ich dann folgende Fehlermeldung:
Move-Item : Ein Objekt im angegebenen Pfad "C:\Users\WithakeN\Desktop\testpdf\test.pdf." ist nicht vorhanden.
In Zeile:24 Zeichen:18

back-to-top... Move-Item -Path C:\Users\WithakeN\Desktop\testpdf\$pdf.

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidArgument: (face-smile [Move-Item], PSArgumentException
+ FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.MoveItemCommand

-Destination : Die Benennung "-Destination" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise
des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
In Zeile:25 Zeichen:19

back-to-top-Destination C:\Users\WithakeN\Desktop\testpdf\Apfe ...

back-to-top~~~~~~~~~~~~

+ CategoryInfo : ObjectNotFound: (-Destination:String) , CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Komme leider nicht viel weiter. Kann mir jemand helfen?

Vielen Dank! :D
ProFlash
Lösung ProFlash 19.04.2022 um 08:16:27 Uhr
Goto Top
So es läuft nun. Habe es mithilfe einer Do/While Schleife gelöst.

Falls jemand auch das Skript benötigt:

Set-Culture -CultureInfo en-US
$export = "C:\PFAD\export.csv"                  #Dateipfad wo die export.csv gespeichert werden soll (NAME MUSS BEIBEHALTEN WERDEN)  
$tabelle = "export"  
[int] $zeile = 2
[int] $spalte = 1
$excelanzeigen = $false
[int] $zeile2 = 2
[int] $spalte2 = 3  
Add-Type -Path "C:\PFAD\itextsharp.dll"         #Dateipfad welche auf die itextsharp.dll führt  
$pdfs = gci "C:\PFAD" *.pdf                     #Dateipfad wo die zu bearbeiteten PDFs liegen (Wichtig am ende *.pdf also: "C:\Pfad" *.pdf)  
$results = @()
$keywords = @('KEYWORD1','KEYWORD2','KEYWORD3','KEYWORD4')                #Hier die Keywords eintragen welche in den PDFs gesucht werden sollen. Es können beliebig viele im selben Format hinzugefügt werden.  
$Fehlerpfad = "C:\PFAD"                                                   #Hier muss der PFAD angegeben werden, wo die nicht Zugewiesenen PDFs abgespeichert werden sollen.  

foreach($pdf in $pdfs) {                                                  #Diese Schleife durchsucht die PDF Dateien und speichert die Ergebnisse in einer CSV.

    Write-Host "processing -" $pdf.FullName  

    # PDF vorbereiten
    $reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $pdf.FullName

    # Seitenzahl auslesen
    for($page = 1; $page -le $reader.NumberOfPages; $page++) {
    
        # Text auslesen
        $pageText = [iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader,$page).Split([char]0x000A)

        # wenn ein keyword gefunden wurde Daten in CSV schreiben
        foreach($keyword in $keywords) {
            if($pageText -match $keyword) {
                $response = @{
                    keyword = $keyword
                    file = $pdf.FullName
                    page = $page
                }
                $results += New-Object PSObject -Property $response
            }
        }
    }
    $reader.Close()
}

$results | epcsv $export -NoTypeInformation

do                                                                    #Diese do While Schleife holt sich die Daten aus der CSV und verschiebt die PDFs in die jeweiligen Ordner.
{
$Excel = New-Object -ComObject excel.application # Excel starten
$Excel.Visible = $excelanzeigen
$Workbook = $Excel.Workbooks.Open($export)
$Table =$workbook.Worksheets.Item($tabelle)
$keywordexcel = $Table.Cells.Item($zeile,$spalte).Text
$pdfdatei = $Table.Cells.Item($zeile2,$spalte2).Text
$Excel.Quit() #Excel beenden   
    switch ($keywordexcel)
    {
    "KEYWORD1" {Move-Item -Path $pdfdatei -Destination C:\PFAD\ORDNER1}       #Hier werden die Ordner für die Jeweiligen PDFs hinterlegt.  
    "KEYWORD2" {Move-Item -Path $pdfdatei -Destination C:\PFAD\ORDNER2}       #Wichtig ist die oben festgelegten Keywords in der selben Reihenfolge hier aufzulisten  
    "KEYWORD3" {Move-Item -Path $pdfdatei -Destination C:\PFAD\ORDNER3}       #und die jeweiligen Ordnerpfade anzugeben  
    "KEYWORD4" {Move-Item -Path $pdfdatei -Destination C:\PFAD\ORDNER4}  
    }
    $zeile++
    $zeile2++
 }
 while ($keywords -contains $keywordexcel)                                                              #Die Schleife läuft so lange, bis die Tabelle abgearbeitet ist. 

$pdfs2 = gci "C:\PFAD\*.pdf"                    #Hier muss der selbe PFAD wie $pdfs angegeben werden nur in einem anderen Format.  

Move-Item -Path $pdfs2 -Destination $Fehlerpfad            # Verschiebt übrige Dateien in den Nicht zugewiesen Ordner / Hier muss der PFAD zu den PDFS manuell angegeben werden
cd $Fehlerpfad                        

Write-Host "Dateien im nicht Zugewiesen Ordner:"  
Get-ChildItem -File | Measure-Object | %{$_.Count}                                  #Zählt die Dateien im nicht zugewiesen Ordner und Zeigt die Anzahl an Dateien an

Write-Host ""  
Write-Host "done"  
Set-Culture -CultureInfo de-AT    

Vielen Dank für die Hilfe. ; -D