PDF 双面打印听起来简单,但很多人遇到打印后翻页顺序错乱、正反面对不上、或最后一张只有正面没有背面的问题。今天聊聊纯前端 PDF 双面打印准备的核心问题和解决方案。
PDF 双面打印的常见场景
| 场景 | 说明 |
|---|---|
| 普通打印机打双面 | 打印机不支持自动双面,需分两次打印 |
| 小册子装订 | 长边装订像书本翻页 |
| 便签式打印 | 短边装订像笔记本翻页 |
| 打印店交付 | 需要正反面分成两个文件 |
技术方案:pdf-lib 拆分双面打印
核心实现
typescript
import { PDFDocument } from 'pdf-lib'
type BindingMode = 'long-edge' | 'short-edge'
async function prepareDuplex(
arrayBuffer: ArrayBuffer,
mode: BindingMode,
padToEven: boolean
): Promise<{ front: Uint8Array; back: Uint8Array }> {
const source = await PDFDocument.load(arrayBuffer)
const total = source.getPageCount()
// 奇数页补一个空白页
if (padToEven && total % 2 === 1) {
source.addPage()
}
// 正面页序列(奇数页)
const frontIndices = []
for (let i = 0; i < total; i += 2) frontIndices.push(i)
// 背面页序列(偶数页,需要反转)
const backIndices = []
for (let i = 1; i < total; i += 2) backIndices.push(i)
backIndices.reverse()
const frontDoc = await PDFDocument.create()
frontDoc.addPage(await source.copyPage(frontIndices))
const backDoc = await PDFDocument.create()
backDoc.addPage(await source.copyPage(backIndices))
return {
front: await frontDoc.save(),
back: await backDoc.save(),
}
}
关键点:背面页序列反转
这是最容易错的地方。正面页是 1, 3, 5, 7,背面页必须是 8, 6, 4, 2(反转顺序),这样翻面后页 2 才能对准页 1。
scss
// 正面:奇数页 1,3,5,7(0 起算 0,2,4,6)
// 背面:偶数页 8,6,4,2(0 起算 7,5,3,1)→ 反转后 1,3,5,7
const backIndices = []
for (let i = 1; i < total; i += 2) backIndices.push(i)
backIndices.reverse() // 关键:反转
关键点:装订模式
两种装订方式的分页逻辑不同:
- 长边装订(像书本):沿长边翻
- 短边装订(像便签):沿短边翻
日常双面打印大多数用短边装订(奇偶页 + 背面反转)。
常见坑位
坑 1:背面页没反转
背面页忘记反转,导致翻面后页面错位。
解决方案:
- 背面序列务必
reverse() - 打印前用 4 页小文档测试
- 对照生成的正反面文件核对
坑 2:奇数页导致最后一页只有正面
页数为奇数时,最后一张纸只有正面没有背面。
解决方案:
- 开启补空白页选项,自动补到偶数
- 或接受最后一张单面
坑 3:装订模式选错
长边/短边装订的分页逻辑不同,选错会导致翻面方向不对。
解决方案:
- 确认实际翻纸方式
- 书本式 → 长边
- 便签式 → 短边
坑 4:页码 0 起算混淆
内部页码 0 起算,容易和显示页码搞混。
解决方案:
- 统一 0 起算
- 正面 = 0,2,4... 背面 = 7,5,3,1(反转)
- 拆完检查每页顺序
坑 5:纸张透字
薄纸双面打印时,背面的字会透到正面。
解决方案:
- 用 20 磅以上较厚纸张
- 或降低背面打印浓度
双面打印 vs 其他方案
| 方案 | 适用 |
|---|---|
| 纯前端双面准备 | 普通打印机、隐私优先 |
| 自动双面打印机 | 支持双面的设备直接打印 |
| Adobe Acrobat | 复杂装订、专业需求 |
纯前端的优势是隐私安全,适合处理敏感文档。
使用建议
- 确认装订方式:长边还是短边
- 奇数页补空白:开启 padding
- 小文档先测:4 页测试翻页方向
- 敏感文档本地处理:不要用上传式工具
总结
- PDF 双面打印核心是 奇偶页拆分 + 背面反转
- 选对装订方式,注意 0 起算页码
- 纯前端方案适合 私密文档
- 打印前务必备份原始文件
搜索「PDF双面打印」即可找到纯浏览器端工具,文件不上传服务器。