You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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脚本,自动遍历所有页面,检测横向页面并旋转为纵向:

  1. 创建一个名为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"
  1. 给脚本添加执行权限:
chmod +x rotate_pdf_pages.sh
  1. 运行脚本:
./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

火山引擎 最新活动