All Tools / Blog / 如何为 PDF 添加页码(免费,无需安装)

如何为 PDF 添加页码(免费,无需安装)

2 min read

在提交报告、论文或合同前为 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

页码位置选项

位置 格式 常见用途
底部居中 123 报告、论文、书籍
底部右侧 123 商业文件
顶部居中 123 部分学术期刊
底部居中 第 1 页,共 10 页 法律文件、合同
左右交替 1 / 1 双面打印布局

大多数情况下,底部居中配简单数字是最佳选择,符合读者的阅读习惯。

要点总结

  • 浏览器工具无需安装软件,适合一次性添加页码。
  • pypdf + reportlab 在 Python 中提供完整的编程控制——位置、字体、格式、跳过页面均可自定义。
  • 如果从头生成 PDF,fpdf2 是内置页码的最简方案。
  • cpdf 是自动化脚本中最强大的命令行选项。
  • 文档有封面时,从第 2 页开始编号——封面不应显示"1"。