使用pdftk提取PDF页面时出现页面伪影问题求助
问题分析与解决建议
先排除脚本问题
你的脚本本身不会导致页面伪影,具体说明:
var=$(echo $PAGE1)这行完全多余,直接用$PAGE1即可,但不影响功能;- 输出文件名里的单引号会让文件名带奇怪字符(比如输入
3 5,文件名会变成QuickQuiz'3 5'.pdf),可以改成QuickQuiz_${PAGE1// /_}.pdf把空格换成下划线,更规范,但这和伪影无关; $*是获取所有命令行参数,如果你运行脚本时只传了一个PDF文件,这部分也没问题。
所以问题肯定不在脚本上,大概率是pdftk本身的兼容性问题,或者原PDF的特殊结构导致的。
伪影的可能原因
你看到的“6_DirLine”“6_NumList”这类标记,是PDF内部的结构元素名称(比如标签、图层或者表单域的命名)。pdftk是个比较老的工具,对现代PDF(比如带无障碍标签的PDF、带图层的PDF、复杂表单PDF)的支持很差,处理这类文件时容易把内部标记错误地渲染出来,就出现了你看到的伪影。
解决办法
1. 换用更靠谱的现代工具
推荐用qpdf或者pdfjam,这俩都是免费开源的,兼容性比pdftk好太多。
比如用qpdf提取页面的命令:
qpdf 你的原PDF文件.pdf --pages . 要提取的页码 -- 输出文件.pdf
把你的脚本改成qpdf版本的话,这样写更稳妥:
echo "What PDF pages do you want to save? (Hint: use a single space between numbers.)" read PAGE1 # 把页码里的空格换成下划线,生成更整洁的文件名 OUTPUT_NAME="QuickQuiz_${PAGE1// /_}.pdf" # 只处理第一个传入的PDF文件,避免多文件混淆 qpdf "$1" --pages . $PAGE1 -- "$OUTPUT_NAME"
2. 先扁平化原PDF再用pdftk
如果必须用pdftk,先把原PDF转成“无结构”的版本(去掉标签、图层这些复杂元素):
- 用Adobe Acrobat的话,直接打印到PDF(选Adobe PDF打印机,不用勾选“作为图像打印”也可以,打印后的PDF会自动扁平化);
- 用命令行的话,用ghostscript转换:
gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=扁平化后的文件.pdf 原文件.pdf
之后再用你的pdftk脚本处理这个扁平化后的PDF,伪影应该就消失了。
3. 检查原PDF的标签
如果只有特定页面出问题,你可以用Adobe Acrobat打开原PDF,打开“标签”面板(视图>显示/隐藏>导航面板>标签),看看有没有“6_DirLine”这类标签,直接删掉这些标签再提取页面,也能解决问题。
内容的提问来源于stack exchange,提问作者bwoah
相关产品推荐
相关产品推荐

