Mac快捷指令执行Shell脚本编辑PDF时文件损坏/报错求助
修复PDF模板文本替换导致文件损坏的问题
原脚本问题点
- qpdf参数逻辑混乱:原命令把输入模板(
$1)和目标输出文件混在一起使用,且直接用--replace-input覆盖文件,容易破坏原模板 - sed语法错误:替换格式里的括号、引号转义错误,且未匹配PDF里实际的“dear client”文本,也没处理客户名称中的特殊字符(比如空格、&)
- 冗余配置写入:每次运行都追加brew环境配置到
.zprofile,会导致配置重复 - 路径重复风险:输入输出文件用同一路径,出错直接损坏原模板
修复后的Bash脚本方案
# 加载Homebrew环境(仅当前会话生效,不重复写入配置) eval "$(/opt/homebrew/bin/brew shellenv)" # 单独存放模板文件,避免直接修改原模板 TEMPLATE_PDF="/Users/jonathan/Desktop/Personal Trainer Stuff/Client Documents/Templates/WELCOME_FORM_TEMPLATE.pdf" # 输出路径用变量替换客户名称 OUTPUT_PDF="/Users/jonathan/Desktop/Personal Trainer Stuff/Client Documents/Signed Client Forms/${Client_Name}/${Client_Name}_WELCOME_FORM.pdf" # 确保输出目录存在,防止路径错误 mkdir -p "$(dirname "$OUTPUT_PDF")" # 1. 复制模板到输出路径,保护原模板 cp "$TEMPLATE_PDF" "$OUTPUT_PDF" # 2. 解压PDF流数据,让sed可以识别文本 qpdf --stream-data=uncompress "$OUTPUT_PDF" --replace-input # 3. 转义客户名称中的特殊字符,避免sed报错 ESCAPED_CLIENT_NAME=$(printf '%s\n' "$Client_Name" | sed -e 's/[\/&]/\\&/g') # 匹配PDF里的"dear client"并替换,Mac版sed需要加-i ''参数 sed -i '' "s/dear client/dear $ESCAPED_CLIENT_NAME/g" "$OUTPUT_PDF" # 4. 重新压缩PDF,恢复正常格式 qpdf --stream-data=compress "$OUTPUT_PDF" --replace-input
关键修正说明
- 模板和输出文件分离,避免原模板被损坏
- 用
mkdir -p自动创建客户专属目录 - 转义客户名称中的特殊字符,适配sed语法
- 严格按“解压→替换→压缩”流程操作PDF
可选方案:使用PDF Expert命令行工具
如果你已经购买PDF Expert,用它的命令行工具更安全,不会破坏PDF结构:
- 打开PDF Expert,进入「偏好设置→高级」,启用「命令行工具」
- 使用以下脚本替换文本:
eval "$(/opt/homebrew/bin/brew shellenv)" TEMPLATE_PDF="/Users/jonathan/Desktop/Personal Trainer Stuff/Client Documents/Templates/WELCOME_FORM_TEMPLATE.pdf" OUTPUT_PDF="/Users/jonathan/Desktop/Personal Trainer Stuff/Client Documents/Signed Client Forms/${Client_Name}/${Client_Name}_WELCOME_FORM.pdf" mkdir -p "$(dirname "$OUTPUT_PDF")" cp "$TEMPLATE_PDF" "$OUTPUT_PDF" # PDF Expert原生替换,自动处理PDF结构 pdfexpert replace-text "$OUTPUT_PDF" --find "dear client" --replace "dear ${Client_Name}" --output "$OUTPUT_PDF"
内容的提问来源于stack exchange,提问作者J W
相关产品推荐
相关产品推荐

