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

填寫(xiě)后的效果:

填寫(xiě)代碼如下:
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è)面無(wú)表單字段")
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)無(wú)名字段,跳過(guò)")
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ù)中,跳過(guò)")
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 = "填寫(xiě)完成的個(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)路徑,無(wú)需額外安裝
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畫(huà)布
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)填寫(xiě)PDF表格的文章就介紹到這了,更多相關(guān)Python自動(dòng)填寫(xiě)PDF內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解
今天小編就為大家分享一篇關(guān)于Python3.6.x中內(nèi)置函數(shù)總結(jié)及講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
Python神奇的內(nèi)置函數(shù)locals的實(shí)例講解
今天小編就為大家分享一篇關(guān)于Python神奇的內(nèi)置函數(shù)locals的實(shí)例講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
pandas DataFrame where的實(shí)現(xiàn)示例
pandas.DataFrame.where方法提供了一種靈活的方式來(lái)根據(jù)條件篩選和替換DataFrame中的元素,本文主要介紹了pandas DataFrame where的實(shí)現(xiàn)示例,感興趣的可以了解一下2025-04-04
Python爬蟲(chóng)工程師面試問(wèn)題總結(jié)
本篇文章給大家總結(jié)了關(guān)于Python爬蟲(chóng)工程師面試問(wèn)題總結(jié),希望我們整理的內(nèi)容能夠幫助到大家。2018-03-03
Python實(shí)現(xiàn)使用dir獲取類的方法列表
今天小編就為大家分享一篇Python實(shí)現(xiàn)使用dir獲取類的方法列表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
python3+selenium實(shí)現(xiàn)qq郵箱登陸并發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了python3+selenium實(shí)現(xiàn)qq郵箱登陸,并發(fā)送郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
python爬蟲(chóng)爬取監(jiān)控教務(wù)系統(tǒng)的思路詳解
這篇文章主要介紹了python爬蟲(chóng)監(jiān)控教務(wù)系統(tǒng),主要實(shí)現(xiàn)思路是對(duì)已有的成績(jī)進(jìn)行處理,變?yōu)閘ist集合,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2020-01-01

