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