122 lines
3.3 KiB
Bash
122 lines
3.3 KiB
Bash
#!/bin/bash
|
||
|
||
# 检查并安装 pdftk
|
||
check_install_pdftk() {
|
||
if ! command -v pdftk &> /dev/null; then
|
||
echo "未检测到 pdftk,正在尝试安装..."
|
||
|
||
# 检测操作系统类型
|
||
if [ -f /etc/os-release ]; then
|
||
. /etc/os-release
|
||
case "$ID" in
|
||
ubuntu|debian)
|
||
sudo apt-get update && sudo apt-get install -y pdftk
|
||
;;
|
||
fedora)
|
||
sudo dnf install -y pdftk
|
||
;;
|
||
centos|rhel)
|
||
sudo yum install -y pdftk
|
||
;;
|
||
*)
|
||
echo "无法确定操作系统类型,请手动安装 pdftk"
|
||
exit 1
|
||
;;
|
||
esac
|
||
elif [ "$(uname)" == "Darwin" ]; then
|
||
# macOS
|
||
if command -v brew &> /dev/null; then
|
||
brew install pdftk-java
|
||
else
|
||
echo "请先安装 Homebrew,然后再安装 pdftk"
|
||
echo "安装 Homebrew: /bin/bash -c \"\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\""
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "不支持的操作系统,请手动安装 pdftk"
|
||
exit 1
|
||
fi
|
||
|
||
# 再次检查安装是否成功
|
||
if ! command -v pdftk &> /dev/null; then
|
||
echo "pdftk 安装失败,请手动安装"
|
||
exit 1
|
||
fi
|
||
echo "pdftk 安装成功!"
|
||
fi
|
||
}
|
||
|
||
# 在开始处理之前检查并安装 pdftk
|
||
check_install_pdftk
|
||
# 检查是否使用 --keep-temp 参数
|
||
KEEP_TEMP=false
|
||
args=()
|
||
for arg in "$@"; do
|
||
if [ "$arg" == "--keep-temp" ]; then
|
||
KEEP_TEMP=true
|
||
else
|
||
args+=("$arg")
|
||
fi
|
||
done
|
||
|
||
# 参数校验
|
||
if [ "${#args[@]}" -eq 0 ]; then
|
||
echo "使用方法: $0 [PDF文件1] [PDF文件2] ... [--keep-temp]"
|
||
exit 1
|
||
fi
|
||
|
||
# 开始处理多个文件
|
||
for PDF_FILE in "${args[@]}"; do
|
||
if [ ! -f "$PDF_FILE" ]; then
|
||
echo "文件不存在: $PDF_FILE"
|
||
continue
|
||
fi
|
||
|
||
if [[ ! "$PDF_FILE" =~ \.pdf$ ]]; then
|
||
echo "不是 PDF 文件,跳过: $PDF_FILE"
|
||
continue
|
||
fi
|
||
|
||
TEMP_FILE="temp_$PDF_FILE"
|
||
OUTPUT_FILE="clean_$PDF_FILE"
|
||
|
||
if [ -f "$OUTPUT_FILE" ]; then
|
||
echo "文件 $OUTPUT_FILE 已存在,跳过处理。"
|
||
continue
|
||
fi
|
||
|
||
echo "解压 PDF: $PDF_FILE"
|
||
if ! pdftk "$PDF_FILE" output "$TEMP_FILE" uncompress; then
|
||
echo "PDF 解压失败: $PDF_FILE"
|
||
continue
|
||
fi
|
||
|
||
echo "清除水印中: '$PDF_FILE'"
|
||
perl -pe '
|
||
s/\(\x00\x32\x00\x37\x00\x30\x00\x35\x00\x35\x00\x38\x00\x20\x52\x18f%i`\)Tj//g;
|
||
s/\(\x00\x15\x00\x1a\x00\x13\x00\x18\x00\x18\x00\x1b\x00\x03\\bN\x1C\[\x1F\x96\)Tj//g;
|
||
' "$TEMP_FILE" > "${TEMP_FILE}.tmp"
|
||
|
||
if [ ! -f "${TEMP_FILE}.tmp" ]; then
|
||
echo "未生成中间文件,跳过: $PDF_FILE"
|
||
rm -f "$TEMP_FILE"
|
||
continue
|
||
fi
|
||
|
||
mv "${TEMP_FILE}.tmp" "$TEMP_FILE"
|
||
|
||
echo "重新压缩生成: $OUTPUT_FILE"
|
||
if ! pdftk "$TEMP_FILE" output "$OUTPUT_FILE" compress; then
|
||
echo "PDF 压缩失败: $PDF_FILE"
|
||
rm -f "$TEMP_FILE"
|
||
continue
|
||
fi
|
||
|
||
if [ "$KEEP_TEMP" = false ]; then
|
||
rm -f "$TEMP_FILE"
|
||
else
|
||
echo "保留临时文件: $TEMP_FILE"
|
||
fi
|
||
|
||
echo "处理完成: $OUTPUT_FILE"
|
||
done |