ludaku
Goto Top

PDF: Alle Seiten entfernen, welche nicht definierten String enthalten

Moin

Ich habe schon ein wenig recherchiert aber nichts gescheites gefunden.
Ich habe eine PDF und möchte in diesem PDF alle Seiten löschen, welche nicht einen bestimmten String enthalten.
Wie stelle ich das am Besten an?

LG MbGb

Content-Key: 323689

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

Printed on: April 16, 2024 at 08:04 o'clock

Member: ashnod
ashnod Dec 13, 2016 at 10:51:41 (UTC)
Goto Top
Zitat von @ludaku:
Wie stelle ich das am Besten an?

Wie immer, zunächst am besten mit mehr Informationen face-wink

Wie sieht der Workflow aus? Wann und an welcher Stelle soll die Prüfung erfolgen?

Wenn es nur eine PDF ist ... lösch die Seiten face-wink

VG
Ashnod
Member: ludaku
ludaku Dec 13, 2016 updated at 10:53:07 (UTC)
Goto Top
Zitat von @ashnod:
Zitat von @ludaku:
Wie stelle ich das am Besten an?
Wie sieht der Workflow aus? Wann und an welcher Stelle soll die Prüfung erfolgen?
Nur einmalig.. Und gesucht werden soll überall. Aber da das PDF 12'000 Seiten hat und es zwei davon gibt ist ein manuelles löschen nicht wirklich eine Option..

LG
Member: ashnod
ashnod Dec 13, 2016 at 11:08:11 (UTC)
Goto Top
Oki ... dann ist die Frage wie der Inhalt behandelt wird ... wie wurde die PDF erstellt? Aus z.B. einer Wordvorlage oder eingescannt?
Zumindest bist du schon in der Kategorie falsch.
Das ist dann wohl eher was für die Kollegen an der Powershellfront face-wink
Aber ohne mehr Details wird das eher nix ...

Ashnod
Member: ludaku
ludaku Dec 13, 2016 at 11:11:56 (UTC)
Goto Top
Zitat von @ashnod:
Oki ... dann ist die Frage wie der Inhalt behandelt wird ... wie wurde die PDF erstellt? Aus z.B. einer Wordvorlage oder eingescannt?
Das PDF wurde aus unserem CRM erstellt und ist nicht eine Grafik sondern wird als Text erkennt. (Sprich man kann suchen, markieren, kopieren, etc.)

Zumindest bist du schon in der Kategorie falsch.
Ich wusste nicht genau wohin damit.

Das ist dann wohl eher was für die Kollegen an der Powershellfront face-wink
Habe mir auch mal überlegt ob das Mittels Batch/Powershell zu lösen ist, aber kenne mich da gar nicht aus...

Aber ohne mehr Details wird das eher nix ...
Dann sag mir was du brauchst face-smile
Member: ashnod
ashnod Dec 13, 2016 at 11:28:55 (UTC)
Goto Top
Zitat von @ludaku:
Dann sag mir was du brauchst face-smile

Sorry, da bin ich auch eher raus .... datt macht der eine oder andere hier in ein paar Minuten. Ich nicht face-wink
Bei einem Interaktiven Formular mit JavaScript gerne ... aber PS steck ich nicht drin.
Ashnod
Member: colinardo
Solution colinardo Dec 13, 2016 updated at 21:00:57 (UTC)
Goto Top
Servus,
mit ein bißchen Powershell und der iTextSharp-DLL ist das schnell gemacht:
Hier das Code-Beispiel inkl. DLL zum Download
extract_pdf_pages_into_new_323689.zip

Zur Anpassung siehe den Variablenbereich im Kopf des Skripts.

Das Skript duchsucht alle Seiten des Dokuments nach einem bestimmten String und übernimmt nur diese Seite mit in ein neues Dokument.
In dem Beispiel-PDF im ZIP-File (demo.pdf) werden als Beispiel nur die Seiten übernommen auf welchen der String 'user@domain.de' enthalten ist, mit in das neue Dokument übernommen.
# ------------------------------------------------------
# Pfad zum Dokument 
$quelldokument = "$PSScriptRoot\demo.pdf"  
# Pfad für das neue Dokument
$zieldokument = "$PSScriptRoot\new.pdf"  
# Suchstring welcher vorhanden sein muss damit Seiten in das neue Dokument übernommen werden
$strSearch = 'user@domain.de'  

#Pfad zur iTextsharp DLL
$PATH_ITEXTSHARP = "$PSScriptRoot\itextsharp.dll"  
# ------------------------------------------------------

# Mindestens PS 3.0
if ($PSVersionTable.PSVersion.Major -lt 3){write-host "ERROR: Minimum Powershell Version 3.0 is required!" -F Yellow; return}    

# iTextSharp DLL laden
Add-Type -Path $PATH_ITEXTSHARP

# Neue PDF-Datei mit den gewünschten Seiten erstellen
write-host "Verarbeite Dokument  '$quelldokument' ..." -F Green  
try{
    $reader = new-object iTextSharp.text.pdf.PdfReader $quelldokument
    $doc = new-object iTextSharp.text.Document
    $fs = New-object System.IO.FileStream ($zieldokument, [System.IO.FileMode]::Create)
    $writer = [iTextSharp.text.pdf.PdfWriter]::GetInstance($doc,$fs)
    $doc.Open()
    1..($reader.NumberOfPages) | ?{[iTextSharp.text.pdf.parser.PdfTextExtractor]::GetTextFromPage($reader,$_) -match [regex]::Escape($strSearch)} | %{
        $doc.NewPage()
        $writer.DirectContent.AddTemplate($writer.GetImportedPage($reader,$_),0,0)
    }
}catch{
    throw $_
}finally{
    [void]$doc.Close();[void]$writer.Close;[void]$fs.Close();[void]$reader.close()
}
start $zieldokument
Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Member: ludaku
ludaku Dec 13, 2016 at 12:42:14 (UTC)
Goto Top
@colinardo
Super, danke! Das scheint funktioniert zu haben face-smile
Member: colinardo
colinardo Dec 13, 2016 updated at 12:46:10 (UTC)
Goto Top
Zitat von @ludaku:
Super, danke! Das scheint funktioniert zu haben face-smile
War zu erwarten face-smile

Schöne Woche wünsche ich.
Uwe
Member: ludaku
ludaku Dec 14, 2016 at 15:08:45 (UTC)
Goto Top
Zitat von @colinardo:
Zitat von @ludaku:
Super, danke! Das scheint funktioniert zu haben face-smile
War zu erwarten face-smile
Das sollte auch nicht heissen, dass ich dachte dass es nicht funktionieren wird face-smile

//Schöne Woche wünsche ich.
Danke gleichfalls!