pat.bat
Goto Top

Powershell - Seitenanzahl aus PDF ermitteln

Hallo zusammen,

ich versuche gerade ein kleines Skript zu schreiben, das mir die Seitenanzahl der PDFs in einem Ordner ermittelt. Aber so einfach wie bei Textdateien wird das wohl nicht funktionieren.

Braucht man dafür wieder eine externe Library oder hat Powershell mit was an Board um Werte einer PDF auszulesen. Im Idealfall liegt die Anzahl der Seiten in den Metadaten.

Mfg

Pat

Content-ID: 508502

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

Ausgedruckt am: 05.11.2024 um 17:11 Uhr

141575
Lösung 141575 25.10.2019 aktualisiert um 11:33:59 Uhr
Goto Top
Mit iTextSharp bzw itext-dotnet z.B.
Add-Type -Path "D:\DLLs\itextsharp.dll"  
$reader = New-Object iTextSharp.text.pdf.PdfReader "D:\Test.pdf"  
$reader.NumberOfPages 
Oder auch mit pdftk
https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/
pdftk file.pdf dump_data output

RAW auszulesen ist unzuverlässig und funktioniert nicht mit jedem PDF. Man sollte das PDF mit einem Parser korrekt parsen lassen.
Kraemer
Kraemer 25.10.2019 um 11:23:50 Uhr
Goto Top
Moin,
Zitat von @Pat.bat:
ich versuche gerade ein kleines Skript zu schreiben, das mir die Seitenanzahl der PDFs in einem Ordner ermittelt. Aber so einfach wie bei Textdateien wird das wohl nicht funktionieren.
wie kommst du darauf, dass das bei Textdateien einfacher wäre?
Pat.bat
Pat.bat 25.10.2019 um 11:32:40 Uhr
Goto Top
Hm also irgendwas mache ich falsch, er findet die dll nicht:

Add-Type -Path "\\vdm-2.sis.net\KONZERN\LUP\50_Bescheiddruck\Skripte\itextsharp.dll"  


$PDFs = Get-ChildItem -path "\\vdm-2.sis.net\KONZERN\LUP\50_Bescheiddruck\Archiv\Test 25.10.19" -File -Filter *.pdf  

foreach ($PDF in $PDFs)
{
    $reader = New-Object iTextSharp.text.pdf.PdfReader $PDF
    write-host $reader.NumberOfPages
}

Zumindest gibt er mir diese Meldung:

New-Object : Der Typ [iTextSharp.text.pdf.PdfReader] kann nicht gefunden werden. Stellen Sie sicher, dass die Assembly, die diesen Typ enthält, geladen wird.
In K:\LUP\50_Bescheiddruck\Skripte\GetNumPages.ps1:8 Zeichen:15
+     $reader = New-Object iTextSharp.text.pdf.PdfReader $PDF
+               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

Habe ich was vergessen oder spinnt ISE rum?
141575
141575 25.10.2019 aktualisiert um 11:37:09 Uhr
Goto Top
Doch er findet die DLL nur der Namespace wird nicht gefunden
Falsche DLL genommen die den neueren Namespace nutzt . itext-dotnet?

Der Code ist für das alte iTextSharp 5.5 API
Pat.bat
Pat.bat 25.10.2019 um 11:50:19 Uhr
Goto Top
hm ich hatte die Version 5.5.13.1 von Github runtergeladen. Dort ist es als Nupkg verpackt. Anders kann ich es ehrlich gesagt auch nicht finden :S
141575
141575 25.10.2019 um 11:56:19 Uhr
Goto Top
Dann hastes für die falsche NET Version geladen.
141575
141575 25.10.2019 aktualisiert um 16:19:09 Uhr
Goto Top
Noch als Ergänzung, mit dem neuen iText7-dotnet sieht das so aus (getestet):
Add-Type -Path "D:\DLLs\itext.kernel.dll"  
$doc = New-Object iText.Kernel.Pdf.PdfDocument((New-Object iText.Kernel.Pdf.PdfReader "D:\test.pdf"))  
$doc.GetNumberOfPages()
$doc.Close()

So Thema erledigt, isch bin raus....
Pat.bat
Pat.bat 29.10.2019 aktualisiert um 14:17:15 Uhr
Goto Top
@141575 hab mich nochmal etwas mehr mit beschäftigt und dein Vorschlag mit dem pdftk funktioniert super.

So bekomme ich nun die Seitenanzahl der PDFs raus face-smile


Eine Sache nur noch, ist vll was kleines, aber Nachdem ich mir die Seitenanzahl in eine Variable speichere und mit einer einfachen Wenn Abfrage prüfen will ob das PDF mehr als 10 Seiten hat, geht auch auch dann rein, wenn das PDF zb. nur 2 Seiten hat. PDFs die nur eine Seite haben überspringt er tatsächlich.

dir "$Path\*.pdf" | foreach-object {  
    $pdf = pdftk.exe $_.FullName dump_data
    [int32]$NumberOfPages = [regex]::match($pdf,'NumberOfPages: (\d+)').Groups[1].Value  
    $NumberOfPages
If ($NumberOfPages -gt 10) {
        $FilePath = $_.FullName
        $FileName = $_.Name
        
        If (Test-Path "$Path\GrosseDokumente") {  
            Move-Item -Path "$FilePath" -Destination "$Path\GrosseDokumente\$FileName" -Force  
        }
        Else {
            mkdir "$Path\GrosseDokumente"  
            Move-Item -Path "$FilePath" -Destination "$Path\GrosseDokumente\$FileName" -Force  
        }
    }

EDIT: Habs gefunden, ich musste die Variable $NumberOfPages als Integer deklarieren, damit er das auch wirklich als Zahl ansieht. Nun funktioniert alles perfekt. Obiger Code ist jetzt fertig. Danke nochmal
141575
141575 29.10.2019 aktualisiert um 14:51:20 Uhr
Goto Top
So bekomme ich nun die Seitenanzahl der PDFs raus
Geht auch mit obigem Code auch einwandfrei, du machst es nur falsch face-smile. Mach ich schon jahrelang damit funktioniert überall. Naja, dann lern mal schön.
dir "$Path\*.pdf"
Fällt dir auf die Schnauze wenn der Ordner einen Ordner mit der Endung ".pdf" hat face-wink. bei sowas hinten dran immer noch ein -File, dann werden wirklich nur Dateien zurückgeliefert.