使用Python實(shí)現(xiàn)自動(dòng)填寫PDF表格
實(shí)際應(yīng)用場(chǎng)景中,我們會(huì)遇到需要根據(jù)會(huì)話內(nèi)容自動(dòng)填寫表格的情況,比如:pdf 表格。假設(shè)根據(jù)會(huì)話內(nèi)容已經(jīng)獲得相關(guān)信息,下面以填寫個(gè)人信息為例來說明。
個(gè)人信息表格.pdf

填寫后的效果:

填寫代碼如下:
from pdfrw import PdfReader, PdfWriter
import traceback
# 針對(duì)“個(gè)人信息表.pdf”性別字段,嘗試更可能的鍵名(單選按鈕常用命名)
data = {
"(full_name)": "李四",
"(sex_male)": "男", # 推測(cè)性別為單選按鈕,可能用“sex_male”表示“男”選項(xiàng)
"(birth_date)": "1985年8月15日",
"(id_card)": "310104198508152345",
"(phone)": "13987654321",
"(email)": "lisi1985@qq.com",
"(address)": "上海市徐匯區(qū)淮海中路789號(hào)2號(hào)樓1003室"
}
try:
input_pdf_path = "個(gè)人信息表.pdf"
input_pdf = PdfReader(input_pdf_path)
print(f"? 成功讀取文件:{input_pdf_path}")
print(f"?? 該P(yáng)DF包含 {len(input_pdf.pages)} 頁(yè)")
found_fields = []
missing_fields = list(data.keys())
for page_num, page in enumerate(input_pdf.pages, 1):
print(f"\n--- 處理第 {page_num} 頁(yè) ---")
if not page.Annots:
print("?? 此頁(yè)面無表單字段")
continue
for annot in page.Annots:
raw_field_name = annot.T.strip() if (annot.T and hasattr(annot.T, 'strip')) else None
if not raw_field_name:
print("?? 發(fā)現(xiàn)無名字段,跳過")
continue
print(f"?? 發(fā)現(xiàn)字段:{raw_field_name}")
found_fields.append(raw_field_name)
if raw_field_name in data:
annot.V = data[raw_field_name]
print(f"?? 已為字段 [{raw_field_name}] 賦值:{data[raw_field_name]}")
missing_fields.remove(raw_field_name)
else:
print(f"?? 字段 [{raw_field_name}] 不在待填充數(shù)據(jù)中,跳過")
print("\n--- 填充結(jié)果總結(jié) ---")
print(f"? 成功填充的字段:{found_fields}")
if missing_fields:
print(f"? 未找到的字段:{missing_fields}(可嘗試(sex_female)、(gender_m)等,或用PDF工具直接查看性別字段名)")
else:
print("? 所有字段(含性別)均已填充完成")
output_pdf_path = "填寫完成的個(gè)人信息表.pdf"
output_pdf = PdfWriter()
output_pdf.addpages(input_pdf.pages)
with open(output_pdf_path, "wb") as f:
output_pdf.write(f)
print(f"\n?? 已保存到:{output_pdf_path}")
except Exception as e:
print(f"\n? 處理出錯(cuò):{str(e)}")
traceback.print_exc()
個(gè)人信息表格.pdf生成代碼如下:
from reportlab.pdfgen import canvas
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase import pdfmetrics
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
# 注冊(cè)Mac系統(tǒng)預(yù)裝的STHeiti Light字體
# 字體路徑為macOS默認(rèn)路徑,無需額外安裝
font_path = "/System/Library/Fonts/STHeiti Light.ttc"
font_name = "STHeitiLight" # 自定義字體名稱用于引用
pdfmetrics.registerFont(TTFont(font_name, font_path))
# 表單字段使用PDF標(biāo)準(zhǔn)字體(避免非標(biāo)準(zhǔn)字體導(dǎo)致的表單錯(cuò)誤)
form_font_name = "Helvetica"
# 初始化PDF畫布
c = canvas.Canvas("個(gè)人信息表.pdf", pagesize=A4)
width, height = A4 # A4尺寸:寬595,高842
# 繪制標(biāo)題(使用STHeiti Light字體,中文正常顯示)
c.setFont(font_name, 16)
c.drawCentredString(width/2, height-50, "個(gè)人信息登記表")
c.setFont(font_name, 12) # 恢復(fù)標(biāo)簽字體大小
y_position = height - 100 # 起始Y坐標(biāo)
spacing = 40 # 行間距
# 1. 姓名
c.drawString(100, y_position, "1. 姓名:") # 中文標(biāo)簽用STHeiti Light
c.acroForm.textfield(
name="full_name",
x=200, y=y_position-20,
width=200, height=20,
borderColor=colors.black,
fillColor=colors.white,
fontName=form_font_name # 表單字段用標(biāo)準(zhǔn)字體
)
y_position -= spacing
# 2. 性別(單選按鈕組)
c.drawString(100, y_position, "2. 性別:")
c.acroForm.radio(
name="gender",
value="male",
x=200, y=y_position-10,
size=10
)
c.drawString(220, y_position, "男") # 中文選項(xiàng)用STHeiti Light
c.acroForm.radio(
name="gender",
value="female",
x=280, y=y_position-10,
size=10
)
c.drawString(300, y_position, "女")
y_position -= spacing
# 3. 出生日期
c.drawString(100, y_position, "3. 出生日期:")
c.acroForm.textfield(
name="birth_date",
x=200, y=y_position-20,
width=200, height=20,
borderColor=colors.black,
fontName=form_font_name
)
y_position -= spacing
# 4. 身份證號(hào)
c.drawString(100, y_position, "4. 身份證號(hào):")
c.acroForm.textfield(
name="id_card",
x=200, y=y_position-20,
width=300, height=20,
borderColor=colors.black,
fontName=form_font_name
)
y_position -= spacing
# 5. 聯(lián)系電話
c.drawString(100, y_position, "5. 聯(lián)系電話:")
c.acroForm.textfield(
name="phone",
x=200, y=y_position-20,
width=200, height=20,
borderColor=colors.black,
fontName=form_font_name
)
y_position -= spacing
# 6. 電子郵箱
c.drawString(100, y_position, "6. 電子郵箱:")
c.acroForm.textfield(
name="email",
x=200, y=y_position-20,
width=300, height=20,
borderColor=colors.black,
fontName=form_font_name
)
y_position -= spacing
# 7. 居住地址
c.drawString(100, y_position, "7. 居住地址:")
c.acroForm.textfield(
name="address",
x=200, y=y_position-20,
width=350, height=20,
borderColor=colors.black,
fontName=form_font_name
)
y_position -= spacing
# 保存PDF
c.save()
print("個(gè)人信息表已生成:個(gè)人信息表.pdf")
到此這篇關(guān)于使用Python實(shí)現(xiàn)自動(dòng)填寫PDF表格的文章就介紹到這了,更多相關(guān)Python自動(dòng)填寫PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python基于多線程操作數(shù)據(jù)庫(kù)相關(guān)問題分析
這篇文章主要介紹了Python基于多線程操作數(shù)據(jù)庫(kù)相關(guān)問題,結(jié)合實(shí)例形式分析了Python使用數(shù)據(jù)庫(kù)連接池并發(fā)操作數(shù)據(jù)庫(kù)避免超時(shí)、連接丟失相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-07-07
Python實(shí)現(xiàn)二維數(shù)組按照某行或列排序的方法【numpy lexsort】
這篇文章主要介紹了Python實(shí)現(xiàn)二維數(shù)組按照某行或列排序的方法,結(jié)合具體實(shí)例形式分析了Python使用numpy模塊的lexsort方法針對(duì)二維數(shù)組進(jìn)行排序的常用操作技巧,需要的朋友可以參考下2017-09-09
python二分查找搜索算法的多種實(shí)現(xiàn)方法
二分查找,也稱折半查找,是一種效率較高的查找方法,本文主要介紹了python二分查找搜索算法的多種實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
python判斷端口是否打開的實(shí)現(xiàn)代碼
python判斷端口是否打開的代碼,有需要的朋友可以參考下2013-02-02
NumPy多項(xiàng)式計(jì)算的實(shí)現(xiàn)方法
本文詳細(xì)介紹了NumPy庫(kù)中多項(xiàng)式的表示方式、核心操作以及應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-01-01
解決matplotlib.pyplot在Jupyter notebook中不顯示圖像問題
這篇文章主要介紹了解決matplotlib.pyplot在Jupyter notebook中不顯示圖像問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04

