如何为 PDF 添加页码(免费,无需安装)
在提交报告、论文或合同前为 PDF 添加页码,是常见的临时任务。大多数 PDF 软件要么收费,要么需要安装一个以后再也用不到的应用。以下方法均可避免这两种情况。
在浏览器中操作(无需安装)
打开 PDF 页码工具,上传 PDF 文件,选择位置(上方或下方、左/居中/右),设置字体大小和页边距,然后下载结果。所有操作均在浏览器中运行——文件不会离开您的设备。
该工具支持大多数常见 PDF:扫描文档、从 Word 导出的报告,以及任何应用程序生成的 PDF。
Python:pypdf
pypdf 是一个纯 Python 库,无需任何二进制依赖即可读写 PDF。
pip install pypdf reportlab
from pypdf import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import io
def add_page_numbers(input_path: str, output_path: str, start: int = 1):
reader = PdfReader(input_path)
writer = PdfWriter()
for i, page in enumerate(reader.pages):
page_num = i + start
# 创建仅包含页码的 PDF 叠加层
packet = io.BytesIO()
c = canvas.Canvas(packet, pagesize=(
float(page.mediabox.width),
float(page.mediabox.height)
))
# 在底部居中绘制页码
c.setFont('Helvetica', 10)
x = float(page.mediabox.width) / 2
y = 20 # 距底边 20 点
c.drawCentredString(x, y, str(page_num))
c.save()
# 将叠加层合并到页面
packet.seek(0)
from pypdf import PdfReader as PR
overlay = PR(packet).pages[0]
page.merge_page(overlay)
writer.add_page(page)
with open(output_path, 'wb') as f:
writer.write(f)
add_page_numbers('report.pdf', 'report-numbered.pdf')
跳过第一页(封面):
def add_page_numbers_skip_first(input_path: str, output_path: str):
reader = PdfReader(input_path)
writer = PdfWriter()
for i, page in enumerate(reader.pages):
if i == 0:
# 复制第一页,不添加页码
writer.add_page(page)
continue
page_num = i # 第 2 页显示数字 1(i=1),以此类推
packet = io.BytesIO()
c = canvas.Canvas(packet, pagesize=(
float(page.mediabox.width),
float(page.mediabox.height)
))
c.setFont('Helvetica', 10)
c.drawCentredString(float(page.mediabox.width) / 2, 20, str(page_num))
c.save()
packet.seek(0)
overlay = PdfReader(packet).pages[0]
page.merge_page(overlay)
writer.add_page(page)
with open(output_path, 'wb') as f:
writer.write(f)
格式为"第 X 页,共 Y 页":
def add_page_numbers_with_total(input_path: str, output_path: str):
reader = PdfReader(input_path)
total = len(reader.pages)
writer = PdfWriter()
for i, page in enumerate(reader.pages):
packet = io.BytesIO()
c = canvas.Canvas(packet, pagesize=(
float(page.mediabox.width),
float(page.mediabox.height)
))
c.setFont('Helvetica', 10)
label = f'第 {i + 1} 页,共 {total} 页'
c.drawCentredString(float(page.mediabox.width) / 2, 20, label)
c.save()
packet.seek(0)
overlay = PdfReader(packet).pages[0]
page.merge_page(overlay)
writer.add_page(page)
with open(output_path, 'wb') as f:
writer.write(f)
Python:fpdf2(从头创建 PDF)
如果您要从头生成 PDF 并希望内置页码:
from fpdf import FPDF
class NumberedPDF(FPDF):
def footer(self):
self.set_y(-15) # 距底边 15mm
self.set_font('Helvetica', 'I', 8)
self.cell(0, 10, f'第 {self.page_no()} 页', align='C')
pdf = NumberedPDF()
pdf.set_auto_page_break(auto=True, margin=15)
for i in range(1, 6):
pdf.add_page()
pdf.set_font('Helvetica', size=12)
pdf.cell(0, 10, f'第 {i} 页内容', ln=True)
pdf.output('document-with-numbers.pdf')
命令行:pdftk
pdftk 是 PDF 操作的多功能工具。它不能直接添加页码,但可以将含有页码的水印 PDF 叠加到目标 PDF 的每一页上。
# 安装
brew install pdftk-java # macOS
sudo apt install pdftk # Ubuntu
# 拆分为单独页面
pdftk input.pdf burst output page_%04d.pdf
# 用其他工具为每页添加页码后重新合并
pdftk page_*.pdf cat output numbered.pdf
对于页码添加,上面的 Python 方案更为简便。
命令行:cpdf(商业软件,非商业用途免费)
cpdf 是功能最强大的 PDF 命令行工具,原生支持页码添加:
# 在底部居中添加页码
cpdf -add-text "%Page" -bottom 20pt input.pdf -o output.pdf
# "第 X 页,共 Y 页"格式
cpdf -add-text "Page %Page of %EndPage" -bottom 20pt -font "Helvetica" -font-size 10 input.pdf -o output.pdf
# 右上角
cpdf -add-text "%Page" -topright 20pt input.pdf -o output.pdf
# 从特定页开始编号(跳过前 2 页)
cpdf -add-text "%Page" -bottom 20pt -firstpage 3 input.pdf -o output.pdf
页码位置选项
| 位置 | 格式 | 常见用途 |
|---|---|---|
| 底部居中 | 1、2、3 |
报告、论文、书籍 |
| 底部右侧 | 1、2、3 |
商业文件 |
| 顶部居中 | 1、2、3 |
部分学术期刊 |
| 底部居中 | 第 1 页,共 10 页 |
法律文件、合同 |
| 左右交替 | 1 / 1 |
双面打印布局 |
大多数情况下,底部居中配简单数字是最佳选择,符合读者的阅读习惯。
要点总结
- 浏览器工具无需安装软件,适合一次性添加页码。
pypdf+reportlab在 Python 中提供完整的编程控制——位置、字体、格式、跳过页面均可自定义。- 如果从头生成 PDF,
fpdf2是内置页码的最简方案。 cpdf是自动化脚本中最强大的命令行选项。- 文档有封面时,从第 2 页开始编号——封面不应显示"1"。