如何填寫PDF表格的例子

????????實際應用場景中,我們會遇到需要根據會話內容自動填寫表格的情況,比如:pdf 表格。假設根據會話內容已經獲得相關信息,下面以填寫個人信息為例來說明。

個人信息表格.pdf

填寫后的效果:

填寫代碼如下:

from pdfrw import PdfReader, PdfWriter
import tracebackdef fill_personal_info_form(input_path, output_path):# 待填充數據(匹配文檔中的字段項)text_data = {"(full_name)": "李四",  # 對應文檔中“1. 姓名”"(birth_date)": "1985年8月15日",  # 對應“3. 出生日期”"(id_card)": "310104198508152345",  # 對應“4. 身份證號”"(phone)": "13987654321",  # 對應“5. 聯系電話”"(email)": "lisi1985@qq.com",  # 對應“6. 電子郵箱”"(address)": "上海市徐匯區淮海中路789號2號樓1003室"  # 對應“7. 居住地址”}# 性別單選按鈕組目標值(對應文檔中“2. 性別”的“男”)male_value = "male"try:input_pdf = PdfReader(input_path)print(f"? 成功讀取文件:{input_path}")print(f"📄 包含 {len(input_pdf.pages)} 頁")found_fields = []unnamed_annot_count = 0  # 計數無名字段(性別單選按鈕組)gender_male_assigned = False  # 標記“男”是否已選中for page_num, page in enumerate(input_pdf.pages, 1):print(f"\n--- 處理第 {page_num} 頁 ---")if not page.Annots:print("?? 無表單字段")continuefor annot in page.Annots:# 提取字段名(文本框有明確名稱,性別單選按鈕可能無名稱)raw_field_name = annot.T.strip() if (annot.T and hasattr(annot.T, 'strip')) else None# 處理文本框字段(匹配文檔中的姓名、出生日期等)if raw_field_name:if raw_field_name in text_data:annot.V = text_data[raw_field_name]  # 文本框用V屬性賦值found_fields.append(raw_field_name)print(f"?? 已填充 [{raw_field_name}]:{text_data[raw_field_name]}")else:print(f"?? 跳過字段 [{raw_field_name}]")# 處理無名字段(性別單選按鈕組,文檔中含“男”“女”)else:unnamed_annot_count += 1print(f"?? 無名字段(序號:{unnamed_annot_count})")# 第1個無名字段設為“男”(選中),用AS屬性控制單選按鈕狀態if not gender_male_assigned and unnamed_annot_count == 1:annot.AS = male_value  # 單選按鈕用AS屬性設置選中狀態gender_male_assigned = Trueprint(f"?? 已選中第{unnamed_annot_count}個無名字段(男)")# 第2個無名字段設為“女”(未選中)elif unnamed_annot_count == 2:annot.AS = None  # 確保“女”未選中print(f"?? 第{unnamed_annot_count}個無名字段(女)設為未選中")# 填充結果總結print("\n--- 結果總結 ---")print(f"? 成功填充:{found_fields}")print(f"? 性別“男”選中狀態:{'已選中' if gender_male_assigned else '未選中'}")# 保存文件output_pdf = PdfWriter()output_pdf.addpages(input_pdf.pages)with open(output_path, "wb") as f:output_pdf.write(f)print(f"\n💾 保存至:{output_path}")except Exception as e:print(f"\n? 錯誤:{str(e)}")traceback.print_exc()# 執行填充(輸入輸出路徑可修改)
fill_personal_info_form(input_path="個人信息表.pdf",output_path="填寫完成的個人信息表.pdf"
)

個人信息表格.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# 注冊Mac系統預裝的STHeiti Light字體
# 字體路徑為macOS默認路徑,無需額外安裝
font_path = "/System/Library/Fonts/STHeiti Light.ttc"
font_name = "STHeitiLight"  # 自定義字體名稱用于引用
pdfmetrics.registerFont(TTFont(font_name, font_path))# 表單字段使用PDF標準字體(避免非標準字體導致的表單錯誤)
form_font_name = "Helvetica"# 初始化PDF畫布
c = canvas.Canvas("個人信息表.pdf", pagesize=A4)
width, height = A4  # A4尺寸:寬595,高842# 繪制標題(使用STHeiti Light字體,中文正常顯示)
c.setFont(font_name, 16)
c.drawCentredString(width/2, height-50, "個人信息登記表")
c.setFont(font_name, 12)  # 恢復標簽字體大小y_position = height - 100  # 起始Y坐標
spacing = 40  # 行間距# 1. 姓名
c.drawString(100, y_position, "1. 姓名:")  # 中文標簽用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  # 表單字段用標準字體
)
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, "男")  # 中文選項用STHeiti Lightc.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. 身份證號
c.drawString(100, y_position, "4. 身份證號:")
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. 聯系電話
c.drawString(100, y_position, "5. 聯系電話:")
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("個人信息表已生成:個人信息表.pdf")

注意:性別竟然找不到對應的(gender),需要特殊處理。

環境為masOS,其它系統字體設置會有所差別。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91798.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91798.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91798.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023年影響重大的網絡安全典型案例

以下是2023年影響重大的網絡安全典型案例,按時間順序梳理事件經過及技術細節:---一、DeFi協議攻擊:dForce借貸協議遭入侵(2023年4月)** - 時間線: - 4月19日08:58:黑客開始攻擊Lendf.Me合約&…

Vue 響應式基礎全解析2

DOM更新時機 修改響應式狀態后,DOM更新不是同步的。Vue會緩沖所有修改,在"next tick"周期中統一更新,確保每個組件只更新一次。 如需在DOM更新后執行代碼,可使用nextTick(): import {nextTick } from vueasync function increment() {count.value++

【黑馬SpringCloud微服務開發與實戰】(九)elasticsearch基礎

1. 認識elasticsearch2. 認識和安裝ES主播這里之前已經安裝好了,資料包里面有鏡像 docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugin…

由淺入深地講清楚瀏覽器緩存

一、什么是瀏覽器緩存?(入門級) 1. 瀏覽器緩存的定義瀏覽器緩存就是:瀏覽器把之前請求過的資源保存起來,下次訪問同樣的資源時可以直接用本地副本,而不是重新請求服務器。舉個生活例子: 你第一次…

Linux I/O 多路復用機制對比分析:poll/ppoll/epoll/select

Linux I/O 多路復用機制對比分析:poll/ppoll/epoll/select 1. 概述 I/O 多路復用是現代高性能網絡編程的核心技術,它允許單個線程同時監視多個文件描述符的狀態變化,從而實現高效的并發處理。Linux 提供了多種 I/O 多路復用機制&#xff0c…

高防服務器租用:保障數據安全

您的網絡速度是否卡頓,業務是否經常受到網絡攻擊的威脅呢?別擔心,高防服務器租用能夠幫助你解決這些困擾!高防服務器租用擁有著卓越的防御能力,可以幫助企業抵御各種網絡攻擊,能夠輕松化解各種超大流量的網…

基于python多光譜遙感數據處理、圖像分類、定量評估及機器學習方法應用

基于衛星或無人機平臺的多光譜數據在地質、土壤調查和農業等應用領域發揮了重要作用,在地質應用方面,綜合Aster的短波紅外波段、landsat熱紅外波段等多光譜數據,可以通過不同的多光譜數據組合,協同用于礦物信息有效提取。第一&…

CSS content-visibility:提升頁面渲染性能的 “智能渲染開關”

在前端開發中,你是否遇到過這樣的問題:頁面包含大量 DOM 元素(如長列表、復雜表格)時,滾動變得卡頓,交互響應遲緩?這往往是因為瀏覽器需要不斷渲染屏幕外的元素,浪費了大量計算資源。…

Javascript面試題及詳細答案150道之(016-030)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

仿真電路:(十七下)DC-DC升壓壓電路原理簡單仿真

1.前言 升壓的環境用的沒降壓的多,但是升壓會用在LED的很多電路上,所以理解一下原理 2.DC-DC升壓原理簡單仿真 升壓原理 下面還是對升壓進行簡單的仿真 拓撲結構以及原理和降壓還是很相似的,只是位置不太一樣,過程推導就不推導…

ros2--source

setup腳本類型 install下面會有幾個setup.xxx的shell腳本。 setup.bash setup.ps1 setup.sh setup.zsh 什么區別呢 文件名 Shell 類型 適用場景 setup.bash Bash (Linux/macOS) 標準 Linux/macOS 終端(默認使用) setup.sh 通用 Shell 兼容性更廣,但功能可能受限 setu…

40.MySQL事務

1.事務的作用事務用于保證數據的一致性,它由一組相關的 dml (update delete insert) 語句組成,該組的 dml (update delete insert) 語句要么全部成功,要么全部失敗。如:轉賬就要用事務來處理,用以保證數據的一致性。假…

java導入pdf(攜帶動態表格,圖片,純java不需要模板)

java導出pdf文件一、介紹二、準備三、實現效果四、代碼一、介紹 上一篇文章(java使用freemarker操作word(攜帶動態表格,圖片))https://blog.csdn.net/weixin_45853881/article/details/129298494 緊跟上文&#xff0c…

【dropdown組件填坑指南】鼠標從觸發元素到下拉框中間間隙時,下拉框消失,怎么解決?

開發dropdown組件填坑之hideDelay 引言 在開發下拉菜單(dropdown)或彈出框(popover)組件時,一個常見的用戶體驗問題就是鼠標移出觸發區域后,彈出內容立即消失,這會導致用戶無法移動到彈出內容上…

Linux I/O 函數完整清單

Linux I/O 函數完整清單 1. 基礎 I/O 函數 1.1 基本讀寫 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);1.2 位置指定讀寫 #include <unistd.h>ssize_t pread(int fd, void *buf, siz…

面經——電子電路技術知識詳解

電子電路技術知識詳解 目錄 德摩根定律周期性矩形波產生方法自激振蕩器原理與設計晶體管溫度效應分析反向飽和電流影響因素放大電路負反饋類型判斷正弦波90相移電路直接耦合放大器的缺點二階有源低通濾波器分析開關電源與線性電源對比 德摩根定律 德摩根定律&#xff08;De …

docker 安裝 gitlab

null文章瀏覽閱讀445次。問題&#xff1a;運行 docker run hello-world 報錯。原因&#xff1a;原鏡像源網絡不穩定。https://blog.csdn.net/sszdzq/article/details/145733419 鏡像獲取 在線下載 docker pull gitlab/gitlab-ce:17.11.1-ce.0 離線獲取 創建運行 sudo docke…

PHP中的日期/時間處理之Carbon組件

日常開發中&#xff0c;我們會經常用到日期和時間的操作&#xff0c;但官方的一般操作比較復雜&#xff0c;需要大量的時間進行格式化問題和大量計算等等。Carbon組件 可以幫助我們在 PHP 開發中處理日期/時間變得更加簡單、更語義化&#xff0c;從而使得我們的代碼更容易閱讀和…

學習嵌入式第十八天

文章目錄1.數據結構1.概念2.衡量代碼質量和效率1.時間復雜度2.空間復雜度3.數據結構分類1.邏輯結構2.存儲結構3.常見的數據結構2.鏈表1.與順序表的區別2.鏈表分類1.單向鏈表1.定義鏈表節點類型2.空鏈表的創建3.鏈表的頭插法4.鏈表的遍歷5.鏈表元素刪除3.makefile習題1.數據結構…

基于SpringBoot+Vue實現校園商鋪系統

作者主頁&#xff1a;編程指南針 作者簡介&#xff1a;Java領域優質創作者、CSDN博客專家 、CSDN內容合伙人、掘金特邀作者、阿里云博客專家、51CTO特邀作者、多年架構師設計經驗、多年校企合作經驗&#xff0c;被多個學校常年聘為校外企業導師&#xff0c;指導學生畢業設計并參…