PDF 对半切割工具
功能概述
将 PDF 文件的每一页竖向对半切割成左右两页,按顺序重新生成新的 PDF。例如 A3 左右两页切割后变成 A4 的两页。
技术原理
- 纯前端实现:使用
pdf-lib(JavaScript) 在浏览器中直接处理 PDF,无需服务器 - 矢量裁剪:通过
copyPages+setMediaBox修改页面裁剪框,保留矢量内容,文字可选、文件小、无质量损失 - 旋转自适应:自动检测页面旋转角度(0/90/180/270),正确处理不同方向的切割
- 旋转 0°/180°:沿 x 轴(左右)切割
- 旋转 90°/270°:沿 y 轴(上下)切割,因为原始坐标的上下 = 视觉上的左右
核心代码逻辑
// 读取 PDF
const srcDoc = await PDFDocument.load(arrayBuffer);
const outDoc = await PDFDocument.create();
for (let i = 0; i < total; i++) {
const srcPage = srcDoc.getPage(i);
const { width, height } = srcPage.getSize();
const rotation = srcPage.getRotation().angle;
if (rotation === 90 || rotation === 270) {
const mid = height / 2;
// 左半页 = 原始坐标系上半
const [leftCopied] = await outDoc.copyPages(srcDoc, [i]);
leftCopied.setMediaBox(0, mid, width, height - mid);
outDoc.addPage(leftCopied);
// 右半页 = 原始坐标系下半
const [rightCopied] = await outDoc.copyPages(srcDoc, [i]);
rightCopied.setMediaBox(0, 0, width, mid);
outDoc.addPage(rightCopied);
} else {
const mid = width / 2;
// 左半页 = 原始坐标系左半
const [leftCopied] = await outDoc.copyPages(srcDoc, [i]);
leftCopied.setMediaBox(0, 0, mid, height);
outDoc.addPage(leftCopied);
// 右半页 = 原始坐标系右半
const [rightCopied] = await outDoc.copyPages(srcDoc, [i]);
rightCopied.setMediaBox(mid, 0, width - mid, height);
outDoc.addPage(rightCopied);
}
}
使用方式
- 打开
index.html(纯静态页面,双击即可在浏览器中打开) - 拖拽 PDF 文件到页面,或点击选择文件
- 自动切割并下载
_切割版.pdf
部署方式
- Netlify Drop:直接拖拽
index.html到 https://app.netlify.com/drop 即可生成在线链接 - GitHub Pages:上传到 GitHub 仓库,开启 Pages 即可
- 本地使用:双击
index.html直接用浏览器打开
依赖
pdf-libv1.17.1(通过 CDN 引入,无需安装)
扩展能力
基于 pdf-lib 还可扩展:
- PDF 合并(多个 PDF 拼接成一个)
- 添加水印(文字/图片)
- 页面旋转
- 删除/插入/移动页面
- 填写 PDF 表单
- 生成证书/批量填表