Skip to content

Instantly share code, notes, and snippets.

@DefaultO
Created June 22, 2023 09:38
Show Gist options
  • Save DefaultO/2330420428edc38ac72e0d742266a8ce to your computer and use it in GitHub Desktop.
Save DefaultO/2330420428edc38ac72e0d742266a8ce to your computer and use it in GitHub Desktop.
Extract images out of pdf files using IrfanViewer and or ImageMagick
# 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