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-Key: 508502

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

Printed on: April 20, 2024 at 00:04 o'clock

Mitglied: 141575
Solution 141575 Oct 25, 2019 updated at 09:33:59 (UTC)
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.
Member: Kraemer
Kraemer Oct 25, 2019 at 09:23:50 (UTC)
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?
Member: Pat.bat
Pat.bat Oct 25, 2019 at 09:32:40 (UTC)
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?
Mitglied: 141575
141575 Oct 25, 2019 updated at 09:37:09 (UTC)
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
Member: Pat.bat
Pat.bat Oct 25, 2019 at 09:50:19 (UTC)
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
Mitglied: 141575
141575 Oct 25, 2019 at 09:56:19 (UTC)
Goto Top
Dann hastes für die falsche NET Version geladen.
Mitglied: 141575
141575 Oct 25, 2019 updated at 14:19:09 (UTC)
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....
Member: Pat.bat
Pat.bat Oct 29, 2019 updated at 13:17:15 (UTC)
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
Mitglied: 141575
141575 Oct 29, 2019 updated at 13:51:20 (UTC)
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.