You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python在PDF指定x,y坐标位置插入可格式化表格数据?

在现有PDF指定坐标插入带格式表格的Python实现方案

首选库:PyMuPDF(fitz)

PyMuPDF是最适合该场景的库——它支持直接读取/编辑现有PDF,能精准定位坐标绘制表格,并且原生支持文本加粗、单元格着色等格式设置,无需额外生成临时文件,步骤更简洁。

实现步骤与代码示例

  1. 安装依赖:
pip install pymupdf
  1. 核心代码:
import fitz

# 打开目标PDF并选择操作页面
doc = fitz.open("existing.pdf")
page = doc[0]  # 操作第1页(索引从0开始)

# 配置表格参数
x, y = 100, 200  # 表格左上角坐标(PDF坐标系:左下角为原点)
col_widths = [100, 100, 100]  # 列宽度列表
row_heights = [30, 30, 30]  # 行高度列表
table_data = [
    ["姓名", "年龄", "部门"],
    ["张三", "28", "技术部"],
    ["李四", "32", "市场部"]
]

# 定义格式样式
bold_font = fitz.Font("helv", bold=True)  # 加粗字体
header_bg = (0.8, 0.8, 0.8)  # 表头背景灰
highlight_bg = (1, 0.9, 0.9)  # 高亮单元格背景浅红

# 逐行绘制表格
current_y = y
for row_idx, row_content in enumerate(table_data):
    current_x = x
    # 绘制表头背景
    if row_idx == 0:
        header_rect = fitz.Rect(current_x, current_y, current_x + sum(col_widths), current_y + row_heights[row_idx])
        page.draw_rect(header_rect, fill=header_bg, color=None)
    
    # 逐单元格绘制内容
    for col_idx, cell_text in enumerate(row_content):
        cell_rect = fitz.Rect(current_x, current_y, current_x + col_widths[col_idx], current_y + row_heights[row_idx])
        # 绘制单元格边框
        page.draw_rect(cell_rect, color=(0, 0, 0))
        # 设置单元格背景(示例:高亮第二行第三列)
        if row_idx == 1 and col_idx == 2:
            page.draw_rect(cell_rect, fill=highlight_bg, color=None)
        # 选择字体(表头加粗)
        used_font = bold_font if row_idx == 0 else fitz.Font("helv")
        # 在单元格内居中插入文本
        page.insert_textbox(
            cell_rect,
            cell_text,
            fontsize=12,
            font=used_font,
            color=(0, 0, 0),
            align=fitz.TEXT_ALIGN_CENTER
        )
        current_x += col_widths[col_idx]
    current_y += row_heights[row_idx]

# 保存修改后的PDF
doc.save("modified_with_table.pdf")
doc.close()

关键细节

  • PDF坐标系以左下角为原点,x向右递增,y向上递增,需根据需求调整坐标值
  • 通过fitz.Font设置加粗、普通字体,draw_rect实现单元格背景着色
  • insert_textbox支持文本对齐、字号调整,可适配不同单元格需求

备选方案:ReportLab + PyPDF2

如果需要更复杂的表格样式(如跨行/跨列),可以用ReportLab生成带格式的表格PDF,再通过PyPDF2叠加到现有PDF的指定位置。

实现步骤与代码示例

  1. 安装依赖:
pip install reportlab pypdf2
  1. 核心代码:
from reportlab.lib import colors
from reportlab.platypus import Table, TableStyle
from reportlab.pdfgen import canvas
from PyPDF2 import PdfReader, PdfWriter

# 1. 用ReportLab生成带格式的临时表格PDF
temp_pdf_path = "temp_table.pdf"
c = canvas.Canvas(temp_pdf_path)

# 定义表格数据与样式
table_data = [
    ["姓名", "年龄", "部门"],
    ["张三", "28", "技术部"],
    ["李四", "32", "市场部"]
]
table_style = TableStyle([
    ('BACKGROUND', (0,0), (-1,0), colors.lightgray),
    ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
    ('ALIGN', (0,0), (-1,-1), 'CENTER'),
    ('BACKGROUND', (2,1), (2,1), colors.lightcoral),
    ('GRID', (0,0), (-1,-1), 1, colors.black)
])
table = Table(table_data, colWidths=[100,100,100], rowHeights=[30,30,30])
table.setStyle(table_style)
# 在临时PDF原点绘制表格
table.wrapOn(c, 0, 0)
table.drawOn(c, 0, 0)
c.save()

# 2. 将表格叠加到现有PDF指定位置
reader = PdfReader("existing.pdf")
writer = PdfWriter()
table_reader = PdfReader(temp_pdf_path)
table_page = table_reader.pages[0]

# 获取目标页面并叠加表格(x=100, y=200为偏移坐标)
target_page = reader.pages[0]
target_page.merge_translated_page(table_page, 100, 200)

writer.add_page(target_page)
# 保存结果
with open("modified_with_table.pdf", "wb") as output_file:
    writer.write(output_file)

内容的提问来源于stack exchange,提问作者akhil viswam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:33:12