reflecting-god
Goto Top

Merge (PS-Write Modul) von mehreren pdf-Dokumenten mit Variable

Hallo,

ich arbeite gerade an einer Leerseitenerkennung per OCR


Hierzu zerlege ich jedes Dokument in seine einzelnen Seiten eine OCR Erkennung kann man dann per pdf24 machen und man hat dann über Convertpdf2txt eine ,öglichkeit die Seite nach Zeicheninhalt zu bewerten...

Ich habe aber eine Frage beim Zusammenbauen des PDFs aus den einzenen Seiten:

das sind z.B. die Seiten:

PS C:\Users\Marian\Desktop\pdf blank> $Datei
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0000.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0001.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0002.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0003.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0004.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0005.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0006.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0007.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0008.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0009.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf00010.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf00011.pdf
C:\Users\Marian\Desktop\pdf blank\split\Outputpdf00012.pdf
für das pdf-merge passe ich dann die Ausagbe an ....aber es funktioniert nicht ich habe hier in der ISE immer einen Zeilenumbruch wenn ich die Variable in eine txt Datei schmeiße ist es mit Zeilenumbrauch raus auch hintereinander...
Nehme ich den Inhalt aus der Variable und fügen den hintereinandere ein Funktioniert das "mergen"

 $ob
"C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0000.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0001.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0002.pdf", "C:\Users\Marian\Deskt  
op\pdf blank\split\Outputpdf0003.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0004.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0005.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Out  
putpdf0006.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0007.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0008.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf0009.pdf", "C:\U  
sers\Marian\Desktop\pdf blank\split\Outputpdf00010.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf00011.pdf", "C:\Users\Marian\Desktop\pdf blank\split\Outputpdf00012.pdf"  

Ich habe auch mit pdf24 und expanddirs geschaut aber da habe ich ein Problem mit der Sortierung 1 , 2 ,11, 12 , 3 ,4)

hier mal mein Testcode:

$datneu = 0
set-location "C:\Users\Marian\Desktop\pdf blank"  

$ordner = "C:\Users\Marian\Desktop\pdf blank"  




#sortieren-reihenfolge

#Split-Pdf -FilePath "C:\Users\Marian\Desktop\pdf blank\Anschreiben.pdf" -OutputFolder "C:\Users\Marian\Desktop\pdf blank\split" -OutputName Outputpdf00000              

$Datei=(get-childitem "C:\Users\Marian\Desktop\pdf blank\split").FullName |Sort-Object { [regex]::Match($_, '\d+').Value -as [int] }  
Clear-Variable "datneu"  
foreach ($da in $Datei) {

$datneu += '"'+$da+'", '  
}




$ob=($datneu).TrimEnd(", ")  






merge-pdf -InputFile $ob -OutputFile "C:\Users\Marian\Desktop\pdf blank\out3.pdf"  


anscheinend wird der Inahlt von der Variablen $ob nicht direkt hintereinander verwendet? Setze ich wie gesagt den Inhalt aus der Variable an Stelle der VAriable funktioniert das ganze.

Vielleicht hat einer einen Tipp für mich

Content-Key: 6518864598

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

Printed on: May 15, 2024 at 19:05 o'clock

Mitglied: 12764050420
Solution 12764050420 May 01, 2024 updated at 20:41:33 (UTC)
Goto Top
Einfach nur das String-Gebastel weglassen, Merge-PDF erwartet ja ein String-Array keinen ehlend langen String mit allen Dateien.
$sorted = get-childitem "C:\Users\Marian\Desktop\pdf blank\split" -File -Filter *.pdf | Sort-Object {[int][regex]::match($_.Basename,'\d+$').Value} | % Fullname  
merge-pdf -InputFile $sorted -OutputFile "C:\Users\Marian\Desktop\pdf blank\merged.pdf"    

Gruß schrick
Member: Crusher79
Solution Crusher79 May 01, 2024 at 20:45:39 (UTC)
Goto Top
https://gist.github.com/blackhalt/41d8b4d79a5d9a1ea7502df2c8125b77

Geht auch mit PostScript. Hier wird dann prozentual die Füllung ermittelt.

inkcov ist da das Zauberwort.

grep und den anderen Teil kannst du auch mit PowerShell abbilden. Was ist mit Grafiken? Der Ansatz mit OCR ist nicht schlecht, aber ggf. wäre es mit der Abdeckung noch besser.

ps gibt es auch für Windows. Lässt sich also auch in dein Script integrieren.
Member: Reflecting-God
Reflecting-God May 02, 2024 at 05:29:11 (UTC)
Goto Top
Danke für die Lösung an euch beide!

Mit der Grafik habe ich mir auch schon überlegt , ich habe auf den Leerseiten aber einen Grauschleier nicht das das dann als Grafik erkannt wird
Member: Reflecting-God
Reflecting-God May 02, 2024 at 08:47:55 (UTC)
Goto Top
Der Code von Schrick hat funktioniert , die PostScript Variante schaue ich mir später an

Ich habe noch ein weiteres Problem mit dem pdf24 Aufruf.

Der Aufruf aus der Powershell funktioniert wahrscheinlich nur mit Start-Prozess aber wie übergebe ich die Pfade ? Ich hatte bisher nur den Aufruf in der cmd getestet der Prozess bleibt dann auch in der Eingabeaufforderung stehen und benötigt nach Abschluss ein exit -kann man auch das irgendwie abfangen?

 start-process -filepath "D:\Program Files\PDF24\pdf24-ocr.exe"-PassThru "/inputfile=$pdfordner\$pdf","/outputfile=$pdfordner\ocr\$pdf","/-language deu","/-dpi 300"  
  
Member: Reflecting-God
Reflecting-God May 02, 2024 at 10:09:42 (UTC)
Goto Top
Den Aufruf konnte ich wie folgt machen

10 Sekunden schlafen für jede Seite des Dokuments

 set-location "D:\Program Files\PDF24\"  
.\pdf24-ocr.exe -inputfile $Inputsplit -outputFile $Outputsplit -language deu -dpi 300
 
sleep 10 
Member: Reflecting-God
Reflecting-God May 02, 2024, updated at May 03, 2024 at 06:20:21 (UTC)
Goto Top
Ich habe das mal zusammen geschrieben manchmal funktioniert das convertPdf2txt nicht richtig

  
 
 

set-location "D:\Program Files\PDF24\"  
.\pdf24-ocr.exe -inputfile $Inputsplit -outputFile $Outputsplit -language deu -dpi 300
 
sleep 10
 
set-location "$pdfordner"  
$txt = 0
Clear-Variable "txt"  
##$txt = Convert-PDFToText -FilePath  "$Outputsplit"     
#anderes Modul
sleep 3
$txt = Convert-PDF2TXT -PDFPath  "$Outputsplit"  
 
 
if ($txt -match '\w'){   
  
  
#nichts
}Else{
sleep 5
move-item "$Inputsplit" "$pdfordner\leereSeiten"  
 
 
}
 
 
} # Split und Ende
 
 

sleep 5
$sorted = get-childitem "$pdfordner\split" -File -Filter *.pdf | Sort-Object {[int][regex]::match($_.Basename,'\d+$').Value} | % Fullname   
merge-pdf -InputFile $sorted -OutputFile "$pdfordner\$pdf"  
}else{
#nichts
}
 
 
 
 
 
 
 
 
} #Ende PDF Datei Scan
 
Exit
  
Member: Crusher79
Crusher79 May 03, 2024 at 19:23:08 (UTC)
Goto Top
Du hattest in der Nachricht Handschriften erwähnt.

Für Barcodes hab ich mal mit PS Bild aufgeteilt, so dass nur der Barcode - immer an einer Stelle in dem Fall - erkannt wird. Die Barcode DLL würde aber auch auf der kompletten Seite Barcode finden. Auch mehrere. Die Logik dahinter ist etwas komplex. Könnte man natürlich auch abwandeln um leere Seiten zu ermitteln. Wäre aber wohl zu viel des Guten face-wink

https://stackoverflow.com/questions/68912911/slice-image-and-save-each-s ...

Was soll das ganze? Man kann Ausschnitt als Objekt in PS weiter übergeben und analysieren. Bei der Variante mit Ghotscript z.B. nur den 5x5 cm Bereich analysieren lassen.

Wenn du bei manchen Seiten an die Grenzen stößt, könntest du die Genauigkeit erhöhen, in dem nur ein begrenztes Feld betrachtet wird.

Bei deiner Variante oben mit PDF zu Text wäre das hilfreich, da komische Hieroglyphen dann reduziert werden, da der Ausschnitt nahezu rein weißen Bereich zeigt.

Ist für den Anfang kein muss. Aber Rectangle ausschneiden ist easy und durch kleine Referenzbilder der Din A4 Seite kann man einiges optimieren.....

Nur so eine Idee.
Member: Crusher79
Crusher79 May 03, 2024 updated at 19:36:52 (UTC)
Goto Top
PS:

Die Barcode DLL oben analysiert das Bild mit Hilfe eines Histogrammes um die Barcodes zu erkennen.

https://github.com/LazoCoder/Image-Processing-Library

https://github.com/topics/histogram?l=c%23


Eine C# DLL kann man in PS sehr einfach einbinden und die Funktion aufrufen.

[void] [System.Reflection.Assembly]::LoadFrom("c:\temp\BarcodeImaging.dll");      
$barcodes = @{}
[BarcodeImaging]::FullScanPage([ref] $barcodes, $src, 150)


Finde auf die schnelle keine einfache DLL für dich. Aber ein Histogram würde auch dein Handschriftenproblem lösen. Man kann es ja sehr genau einstellen.

Histogramm wäre eig. mit das Mittel der Wahl für so ein Vorhaben.


Beispiel: Bildauswahl an DLL übergeben und Barcode ermittel

Grundlage: https://www.nuget.org/packages/BarcodeImaging

using namespace System.Drawing;
Add-Type -AssemblyName System.Drawing;

[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  

$testBild = "C:\temp\code_ls4.png-1.png"  
$src=[System.Drawing.Image]::FromFile($testBild)

$rect = New-Object System.Drawing.Rectangle(740,1500,400,250) # top, left, width, height of slice
$slice = $src.Clone($rect, $src.PixelFormat);
#$slice.Save("c:\temp\test_slice.png", "png"); 

$src = $slice;

[void] [System.Reflection.Assembly]::LoadFrom("c:\temp\BarcodeImaging.dll");      
$barcodes = @{}
[BarcodeImaging]::FullScanPage([ref] $barcodes, $src, 150)

$barcodes
Member: Reflecting-God
Reflecting-God May 03, 2024 at 20:00:42 (UTC)
Goto Top
Das stimmt ich hatte gedacht das ,die ocr bei Handschrift irgendwas ausgibt…

Mit dem Grauschleier da wäre diese histogramm Sache gut …kann man da irgendwie den Farbcode von so 3 Hintergründen rausziehen und als Referenz hinterlegen ?
Member: Crusher79
Crusher79 May 03, 2024 updated at 20:29:10 (UTC)
Goto Top
Könnte. Normal müsste man mit den Werten auch ein table Objekt füllen können.

Vorteil von Zahlen ist dass die vergleichbar sind. Man könnte mit den Werten dann einen Bereich festlegen wo es sicher weiß ist. Bei ungenauen Mail-Benachrichtigung oder Logfile füllen. So kann man später Fehler nachvollziehen.

Sind die Referenz Bilder Seiten füllend oder nur Briefpapier? Rectangle wäre ggf. da was? Also einfach einen Ausschnitt damit croppen und den dann vergleichen? Wenn Grafiken nur an den Rändern sind, könnte man so auch leeres Briefpapier ermitteln.

https://github.com/dmtrKovalenko/odiff

Denke du meinst sowas. Ja das geht auch. Wenn du fit in Visual Studio bist wäre github dein Freund.

Mergen fast ja nur Bilder an Rändern zusammen. Morphen und Demorphen. So kam ich drauf.

odiff scheint schon in die Richtung zu gehen, die dir vorschwebt.

https://github.com/mapbox/pixelmatch

Pixelmatch tut ähnliches.
Member: Reflecting-God
Reflecting-God May 03, 2024 at 20:47:38 (UTC)
Goto Top
Also es geht „nur“ um gescannte Dokumente manche haben einen fast weißen Hintergrund und manche eine richtigen Grauschleier , Nachteil der ocr Geschichte es dauert etwas bis man z.B. 64 Seiten analysiert hat „nur um „ leere Seiten zu entfernen.


Die Multifunktionsgeräte können das nicht (mehr)….da das eingesetzte Papier Ökopapier ist.

Ich hatte mal die cmyk Behandlung. Gemacht …das hatte nichts gebracht da wir nur graustufen scannen und der „Unterschied“ nicht „messbar“ bzw einstellbar war.
sprich über die ganze Seite ist ein Grauschleifer und dann halt Text Maschinenschrift oder manchmal auch nur Handschrift aber immer mit Grauschleier mal mehr mal weniger das müsste man als Referenz nehmen und irgendwie „ausblenden“ zur Bewertung.
Member: Crusher79
Crusher79 May 03, 2024 at 21:14:02 (UTC)
Goto Top
Grauschleier bekommt man auch anders weg! Helligkeit, Kontrast und Gamma Korrektur.

Zeit bei OCR ist relativ. Kommt drauf an wie schnell die Dokumente ankommen sollen. Ein Hersteller macht ähnliches mit Barcode etc .Nennt die Dokumente dann automatisch um. Verlangen teils 3.500 Euro für die Software....

Sowas kann man sich sparen. Handschrift ist natürlich mit eine Show-Stopper.

Wenn du Zeit hast und OCR noch suchst: https://github.com/tesseract-ocr/tesseract

Tesseract wird auch von DMS eingesetzt. Kommt auch bei historischen Schriften zum Einsatz.

https://github.com/DerrickFeiWang/HandwritingRecognition_GoogleCloudVisi ...


Also ja - sowas geht auch. Wir werden nur gerade immer Komplexer!

Ggf. kombinieren und mehrere Channels bereitstellen. Kommt A nicht ganz hin, wird es in B weiter analysiert. Mit Histogrammen oder anderen Methoden die Werte ermitteln kann man Toleranzen festlegen.

Ich würde aber mal langsam anfangen. Ggf. wie oben in meinen Code Bsp. das Image mal durch

https://github.com/BadAga/ImageProcessing

Hau das Bild mal durch Filter durch.

Wenn du keine DLL willst würde auch Batch Verarbeitung mit PhotoFiltre o.ä. gehen. Nur das verlangsamt dann den Prozess.

Es gibt auch command-line tools die auf diese Art Grauschleier entfernen.

Es gibt ja zig Ansätze.
Member: Reflecting-God
Reflecting-God May 04, 2024 at 05:09:43 (UTC)
Goto Top
Ich möchte ja den Grauschleier als leer interpretiert haben ,also müsste ich jetzt so eine Seite erstmal durch das Imageprocesssing Tool hauen und eine c# dll bauen .

Und die dann in dein Barcode Script einbinden das Barcode Paket von der URL https://www.nuget.org/packages/BarcodeImaging benötige ich ja nicht oder ?


Bei mir wäre es halt der Grauschleier wenn die gesamte A4 Seite bis auf die Ränder nur grau ist .
Member: Crusher79
Crusher79 May 04, 2024 at 08:41:02 (UTC)
Goto Top
Nein. Barcode war nur Bsp. wie man es in PS einbinden kann.

Grauschleier hängt ja dann aucht mit OCR zusammen. Ggf. da Settings vornnehmen oder OCR wie Tesseract mal antesten. Ob dann die Ergebnisse besser sind.
Member: Reflecting-God
Reflecting-God May 04, 2024 at 08:47:19 (UTC)
Goto Top
Tesseract Hatte ich über pdf24-ocr gemacht .
Member: Crusher79
Crusher79 May 04, 2024 at 09:05:01 (UTC)
Goto Top
Ok wenn das Ergebnis nicht passt, musst du halt eingreifen. Du kannst testweise ja mal mit Online Bild Tools Grauschleier entfernen lassen. Wenn es dann passt versucht es mit den Script zu automatisieren.