pat.bat
Goto Top

PowerShell - PDF auslesen und trennen

Hallo zusammen,

ich bin gerade am recherchieren wie ich in einer PDF mit ca. 210 Seiten jede Seite nach einem Stichwort auslesen kann, damit ich dann zb. alle Seiten mit einem Stichwort in eine extra PDF speichern kann. Und das ganze mit ca. 10 Stichwörtern.

Da es wohl mit stock PowerShell nicht wirklich funktioniert bzw nur mit großem Aufwand und man eher eine Bibliothek wie zb. PDFsharp benutzen sollte, wollte ich hier erst einmal nachfragen ob der eine oder andere mit derartigen tools schon gearbeitet hat und was empfehlenswert ist?

Ich habe derzeit erstmal Probleme die pdfsharp.dll in Powershell einzubinden. Danach hatte ich es via Visual Studio und VB.net mittels NuGet versicht, allerdings müsste ich hier komplett neu einarbeiten. Ich hätte die Lösung eigentlich lieber bei PowerShell, da ich derzeit alles damit mache. Oder meint ihr mit VS C#/vb.net gehen die Sachen sowieso besser/einfacher?

Bin mir momentan nicht sicher mit welcher Lösung ich das am besten hinbekomme.


Ich bedanke mich schonmal über eure Erfahrungen und Tips.

Mit freundlichen Grüßen,
Pat

Content-Key: 453764

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

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

Mitglied: 139708
139708 May 20, 2019 updated at 13:00:04 (UTC)
Goto Top
Member: colinardo
colinardo May 20, 2019 updated at 16:32:56 (UTC)
Goto Top
Servus Pat,
mein Code aus dem Link von @139708 sollte dir schon eine gute Grundlage mit iText geben.
Etwas optimierter ausgeführt und auf deine Anforderungen angepassten Code kannst du hier als Komplett-Paket inkl. Beispiel herunterladen:
extract_pages_to_new_files_453764.zip

Grüße Uwe
Member: Pat.bat
Pat.bat May 21, 2019 at 13:16:26 (UTC)
Goto Top
Hallo,

das funktioniert so schonmal gut. Aber ich verzweifel gerade daran, abzufangen, wenn ein Begriff nicht gefunden wird. Er gibt mir dann eine Fehlermeldung

Ausnahme beim Aufrufen von "Close" mit 0 Argument(en):  "The document has no pages."  
In C:\Users\pvoelz\Desktop\PDFsplitter\PDFsplitter.ps1:45 Zeichen:13
+             [void]$doc.Close();[void]$writer.Close;[void]$fs.Close(); ...
+             ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) , MethodInvocationException
    + FullyQualifiedErrorId : IOException

Ich habe nun versucht, mit einer IF Abfrage das abzufangen, das wenn er keine Seiten hat, soll kein Dokument anlegen. Aber leider klappt das nicht, zumindest habe ich noch keine richtige Stelle gefunden, wo ich das implementieren kann.

Er legt halt derzeit ein Dokument an, obwohl er den Begriff nicht im Hauptdokument findet. Möchte man das Dokument öffnen, gibt der Adobe Reader eine Fehlermeldung ab.
Beim versuch eine kleine Remove-Item funktion zu implementieren, wenn das Dokument keine Seiten hat, scheiterts daran, das wohl eine Seite vorhanden ist.

Weiß da jemand wie man das lösen kann?

MfG
Member: colinardo
colinardo May 21, 2019 updated at 14:32:06 (UTC)
Goto Top
Aber ich verzweifel gerade daran, abzufangen, wenn ein Begriff nicht gefunden wird.
Tipp: Mit Where-Object die zutreffenden Seiten ausfiltern und nur bei Array größer 0 ein neues Dokument erzeugen, sonst nicht.
Weiß da jemand wie man das lösen kann?
Ja, lad dir das Demo-Package, da ist alles das drin was du brauchst, fix un feddisch face-wink
Member: Pat.bat
Pat.bat Jul 01, 2019 at 09:11:42 (UTC)
Goto Top
Hallo @colinardo

ich denke mal, das es ziemlich einfach geht, aber ich hab schwierigkeiten mir den Prozess vorzustellen.

Wenn ich jetzt eine PDF mit 400 Seiten habe, wie kann ich diese am besten aufteilen nach alle paar Seiten?

Add-Type -Path .\itextsharp.dll
$reader = New-Object iTextSharp.text.pdf.pdfreader -ArgumentList $Dokument

for ($page = 1; $page -le $reader.NumberOfPages; $page++) {
 $lines = [char[]]$reader.GetPageContent($page) 

Ich müsste ihm jetzt irgendwie mitteilen, das er nach $page 30 eine PDf mit den Daten erstellen soll und dann weiter machen. Habe gerade ein Gedankenloch :S
Member: colinardo
Solution colinardo Jul 01, 2019 updated at 09:21:48 (UTC)
Goto Top
Im Demo-Package von oben siehst du wie es geht. Ausschnitt:
$foundpages = 1..($reader.NumberOfPages) | ?{[iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader,$_) -match [regex]::Escape($term)}
if ($foundpages){
    # hier neues Dokument erstellen und Seiten hinzufügen
}else{
   # Suchbegrif wurde auf keiner Seite gefunden
}