You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用qpdf按大小将PDF拆分为200MB的文件块?

按文件大小拆分大型PDF(以200MB为例)

由于Linux下多数PDF工具(如qpdf)仅支持按页码拆分,要实现按文件大小拆分,需要结合脚本动态估算页码范围。以下是基于qpdf和bash的解决方案:

前置准备

确保已安装qpdf(多数发行版可通过包管理器安装,比如apt install qpdf或dnf install qpdf),du为系统自带工具无需额外安装。

自动拆分脚本

创建一个bash脚本,自动批量提取页码范围并控制文件大小:

#!/bin/bash

# 配置参数
INPUT_PDF="your_large_file.pdf"  # 替换为你的大型PDF路径
TARGET_SIZE=$((200 * 1024 * 1024))  # 目标拆分大小(200MB,单位字节)
START_PAGE=1
OUTPUT_PREFIX="pdf_part_"  # 拆分后文件的前缀
PART_NUM=1

# 获取总页数
TOTAL_PAGES=$(qpdf --show-npages "$INPUT_PDF")

while [ $START_PAGE -le $TOTAL_PAGES ]; do
    END_PAGE=$START_PAGE
    CURRENT_SIZE=0

    # 动态扩展页码范围,直到接近目标大小或到达最后一页
    while true; do
        # 临时生成当前页码范围的PDF
        qpdf --pages "$INPUT_PDF" "$START_PAGE-$END_PAGE" -- "$INPUT_PDF" "temp_split.pdf"
        CURRENT_SIZE=$(du -b "temp_split.pdf" | cut -f1)

        # 判断是否需要停止扩展页码
        if [ $CURRENT_SIZE -gt $TARGET_SIZE ] || [ $END_PAGE -ge $TOTAL_PAGES ]; then
            # 若超出目标大小,回退一页重新生成
            if [ $CURRENT_SIZE -gt $TARGET_SIZE ]; then
                END_PAGE=$((END_PAGE - 1))
                qpdf --pages "$INPUT_PDF" "$START_PAGE-$END_PAGE" -- "$INPUT_PDF" "${OUTPUT_PREFIX}${PART_NUM}.pdf"
            else
                # 已到最后一页,直接保留临时文件
                mv "temp_split.pdf" "${OUTPUT_PREFIX}${PART_NUM}.pdf"
            fi
            break
        fi

        END_PAGE=$((END_PAGE + 1))
    done

    echo "已生成:${OUTPUT_PREFIX}${PART_NUM}.pdf,页码范围:$START_PAGE-$END_PAGE"
    START_PAGE=$((END_PAGE + 1))
    PART_NUM=$((PART_NUM + 1))
    rm -f "temp_split.pdf"
done

使用步骤

  1. 将上述脚本保存为split_pdf.sh
  2. 修改脚本中的INPUT_PDF为你的PDF文件路径
  3. 赋予脚本执行权限:chmod +x split_pdf.sh
  4. 运行脚本:./split_pdf.sh

注意事项

  • 拆分后的文件大小会接近200MB,但因每页内容差异(如图片页比文字页大很多),实际大小会略有浮动
  • 若某单页本身大小超过200MB,脚本会单独保存该页,此时该文件会大于目标大小,这种情况无法避免,需单独对该页进行压缩处理

内容的提问来源于stack exchange,提问作者John Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:55:01