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-ID: 323689

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

Ausgedruckt am: 18.11.2024 um 22:11 Uhr

ashnod
ashnod 13.12.2016 um 11:51:41 Uhr
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
ludaku
ludaku 13.12.2016 aktualisiert um 11:53:07 Uhr
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
ashnod
ashnod 13.12.2016 um 12:08:11 Uhr
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
ludaku
ludaku 13.12.2016 um 12:11:56 Uhr
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
ashnod
ashnod 13.12.2016 um 12:28:55 Uhr
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
colinardo
Lösung colinardo 13.12.2016 aktualisiert um 22:00:57 Uhr
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
ludaku
ludaku 13.12.2016 um 13:42:14 Uhr
Goto Top
@colinardo
Super, danke! Das scheint funktioniert zu haben face-smile
colinardo
colinardo 13.12.2016 aktualisiert um 13:46:10 Uhr
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
ludaku
ludaku 14.12.2016 um 16:08:45 Uhr
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!