refactor: optimize PDF image splitting script
refactor: optimize PDF image splitting script - simplify path and filename handling - safely quote file paths - improve temporary directory management - remove redundant shell pipelines - simplify image batching - add error handling and progress output - document usage and processing steps
This commit is contained in:
1 parent
a209038263
commit
f313e9edfa
2 files changed
+102
-54
No files matched your search
Executable
+102
@@ -0,0 +1,102 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Convert a PDF into processed JPG images and split them into
|
||||
# multiple PDF files, with a maximum of 100 images per output PDF.
|
||||
|
||||
set -e
|
||||
|
||||
if [ "$#" -ne 1 ]; then
|
||||
echo "Usage: $0 <pdf-file>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
pdf_file="$1"
|
||||
|
||||
if [ ! -f "$pdf_file" ]; then
|
||||
echo "Error: '$pdf_file' does not exist."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Using $pdf_file"
|
||||
|
||||
# Resolve the input directory and filename.
|
||||
pdf_dir="$(cd "$(dirname "$pdf_file")" && pwd)"
|
||||
pdf_name="$(basename "$pdf_file")"
|
||||
base_name="${pdf_name%.*}"
|
||||
|
||||
buffer_dir="$pdf_dir/.BUFFERFOLDER"
|
||||
|
||||
# Recreate the temporary working directory.
|
||||
rm -rf "$buffer_dir"
|
||||
mkdir -p "$buffer_dir"
|
||||
|
||||
cp "$pdf_file" "$buffer_dir/$pdf_name"
|
||||
|
||||
cd "$buffer_dir"
|
||||
|
||||
echo "Extracting images..."
|
||||
|
||||
# Extract PDF images as PNG.
|
||||
pdfimages -png "$pdf_name" "$base_name"
|
||||
|
||||
count=0
|
||||
|
||||
shopt -s nullglob
|
||||
|
||||
for img in *.png; do
|
||||
jpg="${img%.png}.jpg"
|
||||
|
||||
echo "Processing $jpg"
|
||||
|
||||
# PNG -> JPG
|
||||
convert "$img" "$jpg"
|
||||
rm "$img"
|
||||
|
||||
# Normalize image dimensions.
|
||||
convert "$jpg" -resize 2550x3300! "$jpg"
|
||||
|
||||
# Use different crop dimensions for images containing "000".
|
||||
if [[ "$jpg" == *000* ]]; then
|
||||
convert "$jpg" -crop 2206x3200+200+50 "$jpg"
|
||||
else
|
||||
convert "$jpg" -crop 2106x3200+200+50 "$jpg"
|
||||
fi
|
||||
|
||||
# Remove white background.
|
||||
convert "$jpg" -fuzz 20% -transparent White "$jpg"
|
||||
|
||||
# Center image on a white 2550x3300 canvas.
|
||||
convert "$jpg" \
|
||||
-resize 2550x3300 \
|
||||
-gravity center \
|
||||
-background White \
|
||||
-extent 2550x3300 \
|
||||
"$jpg"
|
||||
|
||||
# Group images into batches of 100.
|
||||
split_var=$((count / 100))
|
||||
split_dir="split_${split_var}"
|
||||
|
||||
mkdir -p "$split_dir"
|
||||
mv "$jpg" "$split_dir/"
|
||||
|
||||
((count++)) || true
|
||||
done
|
||||
|
||||
# Convert each group of images into a PDF.
|
||||
for split_dir in split_*; do
|
||||
[ -d "$split_dir" ] || continue
|
||||
|
||||
split_number="${split_dir#split_}"
|
||||
|
||||
echo "Converting Part $split_number"
|
||||
|
||||
convert "$split_dir"/*.jpg \
|
||||
"$pdf_dir/${base_name}_split_${split_number}.pdf"
|
||||
done
|
||||
|
||||
# Remove temporary files.
|
||||
cd "$pdf_dir"
|
||||
rm -rf "$buffer_dir"
|
||||
|
||||
echo "Done."
|
||||
@@ -1,54 +0,0 @@
|
||||
#!/bin/bash
|
||||
pdf_file="$1"
|
||||
if [ $# -ne 1 ]; then
|
||||
echo "Filename Missing"
|
||||
exit
|
||||
fi
|
||||
if [ -f ${pdf_file} ]; then
|
||||
echo "Using ${pdf_file}"
|
||||
else
|
||||
echo "${pdf_file} doesnt exist!"
|
||||
exit
|
||||
fi
|
||||
NAME="$(echo ${pdf_file} | rev | cut -f1 -d'/' | rev)"
|
||||
if [ "$(echo ${pdf_file} | grep -o '/')" != "" ]; then
|
||||
path="$(echo ${pdf_file} | rev | cut -f2- -d'/' | rev)"
|
||||
else
|
||||
path="$(pwd)"
|
||||
fi
|
||||
cd ${path}
|
||||
if [ -d .BUFFERFOLDER ]; then
|
||||
rm -dr .BUFFERFOLDER
|
||||
fi
|
||||
mkdir .BUFFERFOLDER
|
||||
cp ${NAME} .BUFFERFOLDER/
|
||||
NAME="$(echo ${NAME} | rev | cut -f2- -d'.' | rev)"
|
||||
cd .BUFFERFOLDER
|
||||
pdfimages -png ${NAME}.pdf ${NAME}
|
||||
count=0
|
||||
for img in *.png; do
|
||||
convert ${img} "$(echo ${img} | sed 's/png/jpg/g')"
|
||||
rm ${img}
|
||||
img="$(echo ${img} | sed 's/png/jpg/g')"
|
||||
echo ${img}
|
||||
convert ${img} -resize 2550x3300! ${img}
|
||||
if [ "$(echo ${img} | grep "000")" != "" ]; then
|
||||
convert ${img} -crop 2206x3200+200+50 ${img}
|
||||
else
|
||||
convert ${img} -crop 2106x3200+200+50 ${img}
|
||||
fi
|
||||
convert ${img} -fuzz 20%% -transparent White ${img}
|
||||
convert ${img} -resize 2550x3300 -gravity center -background White -extent 2550x3300 ${img}
|
||||
split_var=$((count / 100))
|
||||
if [ ! -d "split_${split_var}" ]; then
|
||||
mkdir split_${split_var}
|
||||
fi
|
||||
mv ${img} split_${split_var}/
|
||||
((count++))
|
||||
done
|
||||
for ((i=0;i<$(ls | grep split_ | wc -l);i++)); do
|
||||
echo "Convert Part $i"
|
||||
convert split_$i/*.jpg ../${NAME}_split_${i}.pdf
|
||||
done
|
||||
cd ../
|
||||
rm -dr .BUFFERFOLDER
|
||||
Reference in new issue
Block a user