Created
June 22, 2023 09:38
-
-
Save DefaultO/2330420428edc38ac72e0d742266a8ce to your computer and use it in GitHub Desktop.
Extract images out of pdf files using IrfanViewer and or ImageMagick
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Kleine PDF-Konvertier Bibliothek an Funktionen | |
# IrfanView-Exe muss existieren | |
global IrfanViewExe | |
set IrfanViewExe "C:/Program Files/IrfanView/i_view64.exe" | |
if { ![file exists $IrfanViewExe] } { | |
set IrfanViewExe "C:/Program Files (x86)/IrfanView/i_view32.exe" | |
if { ![file exists $IrfanViewExe] } { | |
set IrfanViewExe "C:/Program Files/IrfanView/i_view32.exe" | |
if { ![file exists $IrfanViewExe] } { | |
error "Weder 32 noch 64-bit Version von i_view.exe existiert: [file nativename $IrfanViewExe]" | |
} | |
} | |
} | |
# ImageMagick(Convert)-Exe muss existieren | |
global ImageMagickConvertExe | |
set ImageMagickConvertExe "C:/Program Files/ImageMagick-7.1.0-Q16-HDRI/convert.exe" | |
if { ![file exists $ImageMagickConvertExe] } { | |
error "Weder 32 noch 64-bit Version von convert.exe existiert: [file nativename $ImageMagickConvertExe]" | |
} | |
# Mit Irfanview in JPG umwandeln | |
proc ConvertToJpg { fileName } { | |
# Bereits konvertiert? | |
set firstDestFile "[file rootname $fileName].001.jpg" ;# Mehrseitiges PDF | |
if { [file exists $firstDestFile] && [file size $firstDestFile] > 100 } { | |
# Liste der fertigen JPGs generieren | |
return [lsort -dict [glob "[file rootname $fileName].\[0-9\]\[0-9\]\[0-9\].jpg"]] | |
} | |
set firstDestFile "[file rootname $fileName].jpg" ;# Einseitiges PDF | |
if { [file exists $firstDestFile] && [file size $firstDestFile] > 100 } { return [list $firstDestFile] } | |
# Temporäres Verzeichnis vorher löschen | |
set tmpDir [file join [file dirname $fileName] "temp"] | |
if { [file isdirectory $tmpDir] } { file delete -force $tmpDir } | |
file mkdir $tmpDir | |
# Gibt Dateien im Format OrgName_page_####.JPG aus | |
catch { exec $::ImageMagickConvertExe convert -density 300 [file nativename $fileName] -resize 3508x3508 -scene 1 [file nativename $tmpDir]\\[file rootname [file tail $fileName]]_page_%04d.jpg } result | |
after 500 | |
set timeout [expr [clock seconds] + 5] | |
while { [llength [glob -nocomplain [file join $tmpDir *.jpg]]] == 0 } { | |
after 500 | |
if { [clock seconds] > $timeout } break | |
} | |
after 500 | |
# Pruefen, ob Dateien erstellt wurden | |
set jpgs [glob -nocomplain [file join $tmpDir *.jpg]] | |
if { [llength $jpgs] == 0 } { error "ImageMagick konnte keine Dateien aus [file tail $fileName] extrahieren!" } | |
set destFileList {} | |
if { [llength $jpgs] == 1 } { | |
set file [lindex $jpgs 0] | |
# DPI und Auflösung angleichen | |
# DINA4 -> 2474 = kleinste größe einer Seite, die andere wird dementsprechen skaliert | |
ResizeAndRepairJpgImageDpi $file 2474 300 $file 0 | |
# Datei wie PDF benennen | |
set destFile "[file rootname $fileName].jpg" | |
# Gibt es eine Datei die genauso heißt und mindestens 2% andere Dateigröße hat? -> Fehler | |
if { [file exists $destFile] && abs(100-(100.0/[file size $destFile]*[file size $file]))>2.0 } { error "Ziel-JPG von PDF [file tail $fileName] existiert bereits: [file nativename $destFile]" } | |
file rename -force -- $file $destFile | |
lappend destFileList $destFile | |
} else { | |
# DPI und Auflösung angleichen | |
foreach file $jpgs { | |
ResizeAndRepairJpgImageDpi $file 2474 300 $file 0 | |
} | |
# Datei mit Zähler benennen | |
set id 1 | |
foreach file $jpgs { | |
set destFile "[file rootname $fileName].[format %03d $id].jpg" | |
# Gibt es eine Datei die genauso heißt und mindestens 2% andere Dateigröße hat? -> Fehler | |
if { [file exists $destFile] && abs(100-(100.0/[file size $destFile]*[file size $file]))>2.0 } { error "Ziel-JPG von PDF [file tail $fileName] existiert bereits: [file nativename $destFile]" } | |
file rename -force -- $file $destFile | |
lappend destFileList $destFile | |
incr id 1 | |
} | |
} | |
return $destFileList | |
} | |
# Gleicht die Auflösung und DPI an | |
proc ResizeAndRepairJpgImageDpi { sourceFile maxWidthOrHeight dpi destFile {createSourceBackup 1} } { | |
# doLog 500 "ResizeAndRepairJpgImageDpi $sourceFile $maxWidthOrHeight $dpi $destFile $createSourceBackup" | |
# Bereits berichtigt? | |
set sourceFileBak "$sourceFile.resized.org" | |
if { $createSourceBackup eq "1" && [file exists $sourceFileBak] && [file exists $destFile] } { | |
if { [file exists $sourceFile] } { file delete -force -- $sourceFile } | |
return 0 | |
} | |
if { $createSourceBackup eq "1" } { file copy -force -- $sourceFile "$sourceFileBak.tmp" } | |
exec $::ImageMagickConvertExe "convert -units PixelsPerInch [file nativename $sourceFile] -resample 300 -resize 3508x3508 [file nativename $destFile]" | |
after 500 | |
if { ![file exists $destFile] } { error "ImageMagick konnte aus [file tail $sourceFile] kein [file tail $destFile] extrahieren!" } | |
if { $createSourceBackup eq "1" } { file rename -force -- "$sourceFileBak.tmp" $sourceFileBak } | |
# Original löschen, wenn anders als dest | |
if { ![string match -nocase $sourceFile $destFile] } { file delete -force -- $sourceFile } | |
return 1 | |
} | |
# JPG's zu TIF | |
proc ConvertToTif { fileName } { | |
# Bereits konvertiert? | |
set tifDestFile "[file rootname $fileName].tif" | |
if { [file exists $tifDestFile] } { return $tifDestFile } | |
exec $::IrfanViewExe "[file nativename $fileName] /cmdexit /effect=(13,55,25) /contrast=95 /bright=-18 /dpi=(300,300) /bpp=1 /tifc=4 /convert=[file nativename $tifDestFile]" | |
if { ![file exists $tifDestFile] } { error "Irfanview konnte aus [file nativename $fileName] kein [file tail $tifDestFile] extrahieren!" } | |
return $tifDestFile | |
} | |
# PDF's zu JPG's und TIF's konvertieren - Beispiel | |
proc ConvertAllPDF { folder } { | |
set rootPath $folder | |
foreach rootFile [glob -nocomplain -dir $rootPath *] { | |
if {[file isdirectory $rootFile]} { | |
set pdfPath $rootFile | |
foreach file [glob -nocomplain -dir $pdfPath *.pdf] { | |
puts "$file -> jpg" ; update; | |
ConvertToJpg $file | |
} | |
foreach file [glob -nocomplain -dir $pdfPath *.jpg] { | |
puts "$file -> ressampled jpg" ; update; | |
ResizeAndRepairJpgImageDpi $file 0 300 $file | |
} | |
foreach file [glob -nocomplain -dir $pdfPath *.jpg] { | |
puts "$file -> tif" ; update; | |
ConvertToTif $file | |
} | |
} else { | |
ConvertToJpg $rootFile | |
ResizeAndRepairJpgImageDpi $rootFile 0 300 $rootFile | |
ConvertToTif $rootFile | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment