Linux命令行下自动将PDF仅横向页面转为纵向的方法
我来帮你解决这个批量处理PDF页面方向的问题,毕竟手动指定页码确实太麻烦了。
诊断问题根源
首先得搞清楚你的PDF到底是哪种情况,是页面本身标记为横向(尺寸是297x210mm),还是页面是纵向尺寸但内容被旋转了?用下面的命令可以快速查看每个页面的详细信息:
# 先获取总页数 TOTAL_PAGES=$(pdfinfo your_file.pdf | grep Pages | awk '{print $2}') # 查看所有页面的尺寸、旋转角度 pdfinfo -f 1 -l $TOTAL_PAGES your_file.pdf | grep -E "Page [0-9]+|Page size|Page rot"
- 如果看到
Page size: 297 x 210 mm(宽大于高)且Page rot: 0,说明这页是横向页面,需要旋转调整; - 如果是
Page size: 210 x 297 mm但内容显示为横向,可能是内容被旋转了90度,这时候Page rot可能是90或270。
自动批量处理方案
下面提供两种命令行工具的解决方案,都是自动识别横向页面并处理,无需手动指定页码:
方案1:用pdftk(经典PDF工具)
写一个简单的bash脚本,自动遍历所有页面,检测横向页面并旋转为纵向:
- 创建一个名为
rotate_pdf_pages.sh的脚本,内容如下:
#!/bin/bash # 检查输入参数 if [ $# -ne 1 ]; then echo "用法: $0 <输入PDF文件>" exit 1 fi INPUT_PDF="$1" OUTPUT_PDF="${INPUT_PDF%.pdf}_fixed.pdf" # 获取总页数 TOTAL_PAGES=$(pdfinfo "$INPUT_PDF" | grep Pages | awk '{print $2}') ROTATE_COMMANDS="" # 遍历每个页面 for PAGE in $(seq 1 $TOTAL_PAGES); do # 获取页面宽高(单位:mm) PAGE_SIZE=$(pdfinfo -f $PAGE -l $PAGE "$INPUT_PDF" | grep "Page size" | awk '{print $3, $5}') WIDTH=$(echo $PAGE_SIZE | awk '{print $1}') HEIGHT=$(echo $PAGE_SIZE | awk '{print $2}') # 判断是否为横向页面(宽>高) if (( $(echo "$WIDTH > $HEIGHT" | bc -l) )); then # 逆时针旋转90度(pdftk的west参数),转为纵向页面 ROTATE_COMMANDS="$ROTATE_COMMANDS rotate west $PAGE" fi done # 执行pdftk命令生成处理后的PDF pdftk "$INPUT_PDF" cat $ROTATE_COMMANDS output "$OUTPUT_PDF" echo "处理完成!输出文件:$OUTPUT_PDF"
- 给脚本添加执行权限:
chmod +x rotate_pdf_pages.sh
- 运行脚本:
./rotate_pdf_pages.sh your_file.pdf
方案2:用qpdf(更现代、高效的工具)
qpdf自带自动旋转页面的功能,命令更简洁,适合快速处理:
qpdf --rotate-pages --rotate-pages-direction counterclockwise your_file.pdf your_file_fixed.pdf
--rotate-pages:自动检测页面内容方向,旋转页面让文本水平;--rotate-pages-direction counterclockwise:指定旋转方向为逆时针(对应你提到的打印机处理方式);- 如果需要强制所有页面为A4纵向,可以加上
--adjust-page-size "210mm 297mm"参数。
验证处理结果
处理完成后,再次用之前的pdfinfo命令检查,确保所有页面的尺寸都是210 x 297 mm,且Page rot: 0,同时用evince或Foxit Reader打开查看,确认所有文本都是水平的。
内容的提问来源于stack exchange,提问作者Evgeny Makarov




