我正在开发一个 Python 程序,使用 PyMuPDF (fitz) 自动填写 PDF 表单。我创建了一个基本的 PDF 表单,其中占位符可以是:
文本字段使用下划线 (__________),或 用于在每个块中输入一个字符的块/网格单元。 我通过识别边界框成功地为带有下划线的字段插入了文本,但是当尝试将字符写入网格的各个块时,我的代码失败了。
这是我迄今为止尝试过的:
# JSON data
form_data = {
"Name": "John",
"Surname": "Carter",
"ID": "238094238094",
"Contact": "08348392983",
"email": "[email protected]",
"Address": "123 Street, City",
"City": "Pilgrims",
}
我使用 page.get_drawings() 识别了网格单元(矩形),并验证了它们与标签的接近度(例如“姓氏:”)。 我按照单元格的 x 坐标从左到右对单元格进行排序。 我尝试将文本的每个字符(例如“Jele”)放入网格单元中,但它没有按预期工作。 我可以突出显示网格单元(例如,通过为其边框着色),但文本位置无法正确对齐或完全失败。
import fitz # PyMuPDF
# File paths
input_pdf_path = "Fill_form1.pdf"
output_pdf_path = "Filled_form.pdf"
# Example data
form_data = {"Surname": "Jele"}
# Open the PDF
doc = fitz.open(input_pdf_path)
# Function to detect grid cells
def detect_grid_cells(page, label):
grid_cells = []
text_instances = page.search_for(f"{label}:")
for inst in text_instances:
x_start, y_start, x_end, y_end = inst
drawings = page.get_drawings()
for drawing in drawings:
rect = drawing["rect"]
if rect.y0 > y_start and abs(rect.x0 - x_end) < 200: # Adjust proximity as needed
grid_cells.append((rect.x0, rect.y0, rect.x1, rect.y1))
grid_cells.sort(key=lambda box: box[0]) # Sort left-to-right
return grid_cells
# Function to fill characters into grid cells
def fill_characters_in_grid(page, grid_cells, text):
for i, char in enumerate(text):
if i >= len(grid_cells): # Stop if text exceeds number of cells
break
x_start, y_start, _, _ = grid_cells[i]
page.insert_text((x_start + 2, y_start + 2), char, fontsize=12, color=(0, 0, 0))
# Process the Surname field
for page_num in range(len(doc)):
page = doc[page_num]
grid_cells = detect_grid_cells(page, "Surname")
if grid_cells:
fill_characters_in_grid(page, grid_cells, form_data["Surname"])
# Save the PDF
doc.save(output_pdf_path)
doc.close()
什么有效:
我可以成功识别网格单元并正确对它们进行排序。 我可以为网格单元格的边框着色(使用 page.draw_rect)。
什么不起作用:
当我尝试在每个网格单元格中写入字符时,文本无法正确对齐或根本不显示。
我的问题:
如何使用 PyMuPDF 为每个网格单元正确放置一个字符?
是否有更好的方法来识别 PDF 中的网格字段并与之交互?
PyMuPDF 处理这种字符放置有限制吗?
任何帮助或建议将不胜感激!
你可以尝试使用其他库,例如“ReportLab”或“pdfrw”吗?
对于文本插入,你可以尝试这个吗?
page.insert_text((x_start + 5, y_start + 5), char, fontsize=12, color=(0, 0, 0))
也使用“draw_text”方法
page.draw_text((x_start + 2, y_start + 2), char, fontsize=12, color=(0, 0, 0))