PDF 拆分

按页/按张数拆分

409 次访问
PDF SPLIT

PDF 拆分

按页范围拆分 PDF · 或每页拆为独立文件

📄
点击 / 拖拽 PDF 文件

页范围语法

语法:用逗号分隔多个范围,每个范围可以是单页(5)或区间(1-5)。

示例1-3 第 1-3 页 / 1, 3, 5 第 1, 3, 5 页 / 1-3, 7, 10-12 混合 / 1-end 第 1 页到最后页(用 end 关键字)。

说明:输出 ZIP 文件包含所有拆分后的 PDF,或单个 PDF(按范围模式)。

关于本工具

了解工具定位 · 使用场景 · 对比优势

按页或按张数将 PDF 拆分成多个独立文件。适合需要从长文档中提取特定章节的学生、需要拆分合同或报表的办公人员。上传后选择拆分方式(按每页拆分或指定每份页数),后端处理完成后即可下载。文件在处理后自动从服务器删除。

使用场景

📑

合同页数拆分

法务或行政人员收到一份 80 页的 PDF 合同,需要将第 1-20 页、第 21-50 页、第 51-80 页分别发给不同部门审核。手动复制粘贴耗时且易漏页。使用本工具直接输入页码范围,一键拆成三个独立 PDF,每份文件自动命名,确保分发内容准确无误。

🎓

课件章节提取

学生或教师从网课平台下载了 200 页的 PDF 课件,但只需第 45-78 页的某一章内容用于复习或分享。用本工具输入起始页和结束页,几秒内提取出目标章节的独立 PDF,避免整本文件传输带来的加载慢、占空间问题。

📄

扫描件按页归档

行政人员将 30 份纸质合同扫描成一个 30 页的 PDF,每份合同对应一页。需要将每页拆成单独文件,按合同编号命名归档。使用本工具的「按张数拆分」模式,每页生成一个 PDF,配合批量重命名工具,快速完成档案数字化整理。

👥

团队报告分发

项目经理汇总了 5 位同事的周报,合并成一个 15 页的 PDF,每人 3 页。需要将每人的部分拆成独立文件,分别邮件发送。用本工具按固定页数(每 3 页一份)拆分,自动生成 5 个 PDF,省去手动裁剪和重排的麻烦。

📊

财务报表节选

财务人员需要从 100 页的年度审计报告中提取第 20-35 页的「利润表」和第 60-75 页的「现金流量表」,分别发给不同部门核对。使用本工具的页码范围拆分功能,同时生成两个独立 PDF,比截图更清晰、比打印更环保。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A (iLovePDF)竞品 B (Adobe Acrobat Online)传统方法 (手动拆分)
数据隐私纯浏览器端处理,文件不上传服务器文件上传至服务器处理,处理完删除文件上传至 Adobe 服务器处理文件始终在本地,无网络传输
处理速度1-3 秒 (取决于文件大小)5-15 秒 (含上传下载时间)10-30 秒 (含上传下载及排队时间)数分钟至数小时 (取决于页数和工具熟练度)
离线可用是 (页面加载后即可断开网络)否 (必须联网)否 (必须联网)是 (需要实体工具)
文件大小限制取决于浏览器内存 (通常 100MB 以内)免费版 10MB,付费版 100MB免费版 100MB无限制
收费模式完全免费免费版有次数/功能限制,高级版按月/年付费免费版有功能限制,高级版按月/年付费需要打印机、扫描仪、裁纸刀等硬件投入
注册要求无需注册免费版无需注册,高级版需注册免费版需注册 Adobe 账户无需注册
操作平台任何现代浏览器 (桌面端/移动端)浏览器 (桌面端/移动端)浏览器 (桌面端/移动端)需要实体工具和物理空间

使用指南

上手步骤 · 输入输出 · 避坑提示

使用步骤

  1. 上传 PDF 文件,单文件 ≤ 200MB,支持批量拖入多个文件
  2. 选择拆分模式:按页(输入页码范围,如 1-3,5)或按张数(每份固定页数)
  3. 点击「开始拆分」按钮,后端自动处理文件
  4. 拆分完成后,逐份预览并点击「下载」保存,或「全部下载」打包 ZIP

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
1-3,5,7-9输出 6 个 PDF 文件:第 1 页、第 2 页、第 3 页、第 5 页、第 7 页、第 8 页、第 9 页典型场景:混合使用逗号和连字符提取不连续页面
1-10输出 1 个 PDF 文件:包含原文档第 1 至第 10 页典型场景:提取连续页面范围
每 2 页一组输出多个 PDF 文件:每组包含 2 页(第 1-2 页、第 3-4 页……)典型场景:按固定张数拆分,如双面扫描件
1输出 1 个 PDF 文件:仅包含原文档第 1 页边界 case:只提取单页时使用
1-99999报错提示:输入页数超出文档总页数范围边界 case:指定页数超过文档实际页数
1,1,1输出 3 个 PDF 文件:每个文件均包含原文档第 1 页易错 case:重复页码会生成多个相同文件
0-5报错提示:页码从 1 开始,不支持 0易错 case:新手常误用 0 作为起始页码

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 页码范围写成了逗号分隔

错误
1,3,5
修复
1-3,5-7

逗号分隔表示只提取指定单页,但多数拆分工具用连字符表示范围。用户误以为逗号能分割连续区间,实际得到的是单页列表而非连续段。

2. 页码从0开始计数

错误
0-5
修复
1-5

PDF 内部页索引从0开始,但用户界面和日常使用中页码从1开始。输入0会导致第一页被忽略或报错。

3. 拆分张数填了0或负数

错误
每份张数: 0
修复
每份张数: 1

拆分成0张无意义;负数更非法。工具通常要求正整数,否则后端校验失败或返回空文件。

4. 总页数小于拆分份数

错误
总页数10页,拆成20份
修复
总页数10页,拆成5份

每份至少1页。若份数超过总页数,部分份数会得到空文件,或工具直接报错提示页数不足。

5. 输入了非数字字符

错误
第1页-第5页
修复
1-5

工具只解析纯数字和连字符/逗号。中文、空格、字母会导致解析失败,返回无效输入提示。

6. 拆分后文件名混淆

错误
直接下载所有文件为 output.pdf
修复
工具自动生成带页码后缀的文件名,如 output_1-5.pdf

若浏览器同时下载多个同名文件,只会保留最后一个。工具应生成唯一文件名,否则用户需手动重命名。

7. 认为拆分后能保留表单或注释

错误
拆分后的PDF包含原文件的填写表单数据
修复
拆分后仅保留页面内容和基础结构,表单字段和注释可能丢失

PDF拆分通常基于页面对象复制,不保留交互式表单字段、注释或数字签名。需用专业PDF编辑工具才能保留。

8. 混淆了按页拆分和按张数拆分

错误
想每份5页,却选了按页拆分并输入5
修复
按页拆分:指定具体页码;按张数拆分:每份固定页数

按页拆分输出的是指定页码的单个文件;按张数拆分是将文档等分成多份。选错模式会得到非预期结果。

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

N = ceil(P / S)

变量说明

  • N — 拆分后的文件数量
  • P — PDF 原文件总页数
  • S — 每份文件包含的页数(用户指定)

示例

一个 100 页的 PDF,用户指定每份 3 页。则 P=100,S=3。N = ceil(100 / 3) = 34。前 33 份各 3 页,最后 1 份仅 1 页。

适用范围

适用于按固定页数拆分的场景。若用户选择按份数拆分(如均分为 5 份),则公式变为 S = floor(P / K),K 为份数,最后一份可能页数不同。

原理图

上传 PDF 文件选择拆分方式(按页/按张数)设置拆分参数后端 Go 服务解析 PDF 结构按参数切割页面 / 重组新文件生成并下载拆分后的 PDF 文件用户操作区服务端处理区
用户输入 后端处理 输出结果

开发者集成

3 种主流语言 · 复制即用

import PyPDF2
from PyPDF2 import PdfReader, PdfWriter

# 按页拆分 PDF
input_path = "input.pdf"
reader = PdfReader(input_path)

# 将每一页保存为独立文件
for i, page in enumerate(reader.pages):
    writer = PdfWriter()
    writer.add_page(page)
    output_path = f"page_{i+1}.pdf"
    with open(output_path, "wb") as f:
        writer.write(f)
    print(f"已生成: {output_path}")

# 按张数拆分(每 3 页合并为一个文件)
reader = PdfReader(input_path)
chunk_size = 3
for start in range(0, len(reader.pages), chunk_size):
    writer = PdfWriter()
    end = min(start + chunk_size, len(reader.pages))
    for page_num in range(start, end):
        writer.add_page(reader.pages[page_num])
    output_path = f"chunk_{start//chunk_size + 1}.pdf"
    with open(output_path, "wb") as f:
        writer.write(f)
    print(f"已生成: {output_path}")
package main

import (
	"fmt"
	"os"
	"github.com/pdfcpu/pdfcpu/pkg/api"
	"github.com/pdfcpu/pdfcpu/pkg/pdfcpu"
)

func main() {
	// 按页拆分:每页一个独立文件
	inputFile := "input.pdf"
	outDir := "output_pages"
	os.MkdirAll(outDir, 0755)

	// 读取 PDF 页数
	ctx, err := api.ReadContextFile(inputFile, nil)
	if err != nil {
		panic(err)
	}

	for i := 1; i <= ctx.PageCount; i++ {
		// 提取单页
		selectedPages := []int{i}
		outputFile := fmt.Sprintf("%s/page_%d.pdf", outDir, i)
		err := api.ExtractPagesFile(inputFile, outputFile, selectedPages, nil)
		if err != nil {
			fmt.Printf("提取第 %d 页失败: %v\n", i, err)
			continue
		}
		fmt.Printf("已生成: %s\n", outputFile)
	}

	// 按张数拆分(每 3 页一组)
	chunkSize := 3
	for start := 1; start <= ctx.PageCount; start += chunkSize {
		end := start + chunkSize - 1
		if end > ctx.PageCount {
			end = ctx.PageCount
		}
		selectedPages := make([]int, 0)
		for p := start; p <= end; p++ {
			selectedPages = append(selectedPages, p)
		}
		outputFile := fmt.Sprintf("%s/chunk_%d.pdf", outDir, (start-1)/chunkSize+1)
		err := api.ExtractPagesFile(inputFile, outputFile, selectedPages, nil)
		if err != nil {
			fmt.Printf("提取第 %d-%d 页失败: %v\n", start, end, err)
			continue
		}
		fmt.Printf("已生成: %s\n", outputFile)
	}
}
const fs = require('fs');
const { PDFDocument } = require('pdf-lib');

async function splitPDF(inputPath) {
  const pdfBytes = fs.readFileSync(inputPath);
  const pdfDoc = await PDFDocument.load(pdfBytes);
  const pageCount = pdfDoc.getPageCount();

  // 按页拆分:每页一个独立文件
  for (let i = 0; i < pageCount; i++) {
    const newDoc = await PDFDocument.create();
    const [copiedPage] = await newDoc.copyPages(pdfDoc, [i]);
    newDoc.addPage(copiedPage);
    const outputBytes = await newDoc.save();
    fs.writeFileSync(`page_${i + 1}.pdf`, outputBytes);
    console.log(`已生成: page_${i + 1}.pdf`);
  }

  // 按张数拆分(每 3 页合并为一个文件)
  const chunkSize = 3;
  for (let start = 0; start < pageCount; start += chunkSize) {
    const newDoc = await PDFDocument.create();
    const end = Math.min(start + chunkSize, pageCount);
    const pageIndices = Array.from({ length: end - start }, (_, i) => start + i);
    const copiedPages = await newDoc.copyPages(pdfDoc, pageIndices);
    copiedPages.forEach(page => newDoc.addPage(page));
    const outputBytes = await newDoc.save();
    const chunkNum = Math.floor(start / chunkSize) + 1;
    fs.writeFileSync(`chunk_${chunkNum}.pdf`, outputBytes);
    console.log(`已生成: chunk_${chunkNum}.pdf`);
  }
}

splitPDF('input.pdf').catch(console.error);

常见问题

7 个高频疑问

我想把一份PDF按页拆成多个文件,具体怎么操作?
在工具页面的输入区上传PDF文件,然后选择拆分方式为“按页拆分”。接着指定每份文件包含的页数(例如每2页拆成一个文件),或选择“每页一文件”。点击开始后,服务器端会逐页处理,拆完后自动打包成ZIP下载。注意:如果PDF超过100页或文件超过50MB,处理时间会稍长,建议耐心等待进度条走完。
为什么我指定按张数拆分,但拆出来的文件页数和预期不一样?
可能是PDF本身包含空白页或纯图片页,工具是按物理页计数,不是按内容有效页。例如一份10页的PDF,第3页是空白,按“每2页一份”拆,第1-2页为文件1,第3-4页为文件2(含空白),结果文件2只有1页有效内容。建议拆分前先用PDF阅读器检查页数,或选择“按页范围”手动指定。另外,加密或损坏的PDF也可能导致计数异常。
这个拆分工具和Adobe Acrobat的拆分功能比,有什么不同?
主要区别在成本和限制。本工具完全免费,无需安装,浏览器上传即可,适合偶尔拆分少量文件。Adobe Acrobat Pro支持更精细的控制(如按书签、按文件大小拆分),且能处理超大文件(500页以上)和加密PDF,但需要付费订阅。本工具更适合日常简单拆分(按页/按张数),文件上限为200页/100MB,超过这个规模建议用Acrobat。
上传后等了很久还没拆分完,是不是卡住了?
通常不会卡住,但处理时间取决于文件大小和服务器负载。100页以内的PDF一般10-30秒完成;超过100页或文件包含大量高清图片时,可能需要1-3分钟。如果进度条超过5分钟没动,可以尝试以下步骤:1) 刷新页面重新上传,避免浏览器缓存问题;2) 检查文件是否损坏(先用其他阅读器打开确认);3) 如果文件超过200页,建议分两次上传。
拆分出来的文件命名很乱,能自定义文件名吗?
目前工具默认按“原文件名_页码”格式命名(如 报告_1-2.pdf)。暂不支持自定义前缀或编号格式。如果需要统一命名,可以在下载ZIP后批量重命名:Windows上选中所有文件按F2,输入名称后自动加序号;Mac上选中文件后右键“给X个项目重新命名”。如果这个功能对工作流很重要,建议反馈给我们考虑后续版本添加。
我在手机浏览器上能用这个工具拆分PDF吗?
可以,但建议用WiFi环境。手机浏览器(Chrome/Safari/Edge)均支持上传和下载,但操作体验不如电脑:1) 文件选择器可能无法直接访问系统文件管理器,需先下载PDF到本地;2) 大文件上传速度受网络限制,50MB以上文件在4G下可能超时;3) 拆分后的ZIP在手机上解压可能需额外安装解压App。简单拆分(10页以内)手机端完全够用。
拆分后部分页面内容丢失或变成空白,是什么原因?
通常是PDF本身的问题。可能原因:1) PDF包含非标准编码(如某些扫描仪生成的OCR层),工具后端解析时跳过;2) 文件包含表单或交互元素,拆分后部分元素未保留;3) 页面使用了特殊字体,服务器端字体库不全导致渲染空白。建议先用Adobe Reader打开原PDF确认页面是否正常,如果原文件显示正常,可以尝试“另存为”标准PDF后再上传拆分。
选择 打开 +新窗口 esc关闭