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,比截图更清晰、比打印更环保。
| 维度 | 本工具 | 竞品 A (iLovePDF) | 竞品 B (Adobe Acrobat Online) | 传统方法 (手动拆分) |
|---|---|---|---|---|
| 数据隐私 | 纯浏览器端处理,文件不上传服务器 | 文件上传至服务器处理,处理完删除 | 文件上传至 Adobe 服务器处理 | 文件始终在本地,无网络传输 |
| 处理速度 | 1-3 秒 (取决于文件大小) | 5-15 秒 (含上传下载时间) | 10-30 秒 (含上传下载及排队时间) | 数分钟至数小时 (取决于页数和工具熟练度) |
| 离线可用 | 是 (页面加载后即可断开网络) | 否 (必须联网) | 否 (必须联网) | 是 (需要实体工具) |
| 文件大小限制 | 取决于浏览器内存 (通常 100MB 以内) | 免费版 10MB,付费版 100MB | 免费版 100MB | 无限制 |
| 收费模式 | 完全免费 | 免费版有次数/功能限制,高级版按月/年付费 | 免费版有功能限制,高级版按月/年付费 | 需要打印机、扫描仪、裁纸刀等硬件投入 |
| 注册要求 | 无需注册 | 免费版无需注册,高级版需注册 | 免费版需注册 Adobe 账户 | 无需注册 |
| 操作平台 | 任何现代浏览器 (桌面端/移动端) | 浏览器 (桌面端/移动端) | 浏览器 (桌面端/移动端) | 需要实体工具和物理空间 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 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 作为起始页码 |
1,3,51-3,5-7逗号分隔表示只提取指定单页,但多数拆分工具用连字符表示范围。用户误以为逗号能分割连续区间,实际得到的是单页列表而非连续段。
0-51-5PDF 内部页索引从0开始,但用户界面和日常使用中页码从1开始。输入0会导致第一页被忽略或报错。
每份张数: 0每份张数: 1拆分成0张无意义;负数更非法。工具通常要求正整数,否则后端校验失败或返回空文件。
总页数10页,拆成20份总页数10页,拆成5份每份至少1页。若份数超过总页数,部分份数会得到空文件,或工具直接报错提示页数不足。
第1页-第5页1-5工具只解析纯数字和连字符/逗号。中文、空格、字母会导致解析失败,返回无效输入提示。
直接下载所有文件为 output.pdf工具自动生成带页码后缀的文件名,如 output_1-5.pdf若浏览器同时下载多个同名文件,只会保留最后一个。工具应生成唯一文件名,否则用户需手动重命名。
拆分后的PDF包含原文件的填写表单数据拆分后仅保留页面内容和基础结构,表单字段和注释可能丢失PDF拆分通常基于页面对象复制,不保留交互式表单字段、注释或数字签名。需用专业PDF编辑工具才能保留。
想每份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 为份数,最后一份可能页数不同。
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 个高频疑问