initial commit
commit
37d1745041
@ -0,0 +1,11 @@
|
||||
.env
|
||||
*.local*
|
||||
|
||||
node_modules/
|
||||
|
||||
bin/
|
||||
.out/
|
||||
out/
|
||||
dist/
|
||||
|
||||
.vscode/
|
@ -0,0 +1,5 @@
|
||||
# Scripts written with the help of ChatGPT
|
||||
|
||||
- [`pdf-compress`](./pdf-compress)
|
||||
|
||||
A utility that uses convert to render each page of a PDF to a JPEG image and then merges them back into a single document.
|
@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
function show_usage {
|
||||
cat <<-END
|
||||
usage: $0 [OPTIONS...] input_file output_file
|
||||
|
||||
Converts a PDF file to a series of JPEG images using convert to
|
||||
reduce the quality and then merges back the result in a single pdf
|
||||
|
||||
options:
|
||||
-q, --quality Set the JPEG quality (default: 75)
|
||||
-v, --verbose Enable verbose output
|
||||
-h, --help Display this help message
|
||||
END
|
||||
exit 1
|
||||
}
|
||||
|
||||
quality=75
|
||||
verbose=false
|
||||
|
||||
while [[ $# -gt 0 ]]
|
||||
do
|
||||
key="$1"
|
||||
|
||||
case $key in
|
||||
-q|--quality)
|
||||
quality="$2"
|
||||
shift # past argument
|
||||
shift # past value
|
||||
;;
|
||||
-v|--verbose)
|
||||
verbose=true
|
||||
shift # past argument
|
||||
;;
|
||||
-h|--help)
|
||||
show_usage
|
||||
;;
|
||||
-*)
|
||||
echo "Unknown option: $key"
|
||||
show_usage
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$1" ] || [ -z "$2" ]; then
|
||||
show_usage
|
||||
fi
|
||||
|
||||
input_file="$1"
|
||||
output_file="$2"
|
||||
|
||||
temp_pages_dir="$(mktemp -d)"
|
||||
|
||||
function logf {
|
||||
if [ "$verbose" = true ]; then
|
||||
printf "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
logf "Converting \"$input_file\" to \"$output_file\"\n"
|
||||
|
||||
page_count=$(pdfinfo "$input_file" | grep Pages | awk '{print $2}')
|
||||
|
||||
logf "Processing $page_count pages\n"
|
||||
|
||||
start=$(date +%s.%N)
|
||||
for i in $(seq 0 $((page_count-1))); do
|
||||
iter_start=$(date +%s.%N)
|
||||
|
||||
convert -density 300 -quality "$quality" "${input_file}[$i]" "$temp_pages_dir/$i.jpg"
|
||||
|
||||
# Compute estimated remaining time
|
||||
end=$(date +%s.%N)
|
||||
elapsed=$(echo "$end - $start" | bc)
|
||||
iter_elapsed=$(echo "$end - $iter_start" | bc)
|
||||
remaining=$(echo "($elapsed / ($i + 1)) * ($page_count - $i)" | bc)
|
||||
remaining_fmt=$(printf "%02d:%02d:%02d" $((remaining/3600)) $((remaining/60)) $((remaining%60)))
|
||||
|
||||
logf "Compressed page $((i+1)) in $(printf '%.2f' "$iter_elapsed")s (estimated remaining time $remaining_fmt)\n"
|
||||
done
|
||||
|
||||
logf "Merging compressed pages to a single PDF\n"
|
||||
convert "$temp_pages_dir"/*.jpg "$output_file"
|
||||
|
||||
rm -r "$temp_pages_dir"
|
||||
|
||||
logf "Done\n"
|
Loading…
Reference in New Issue