使用网格中逐个字符输入填充 PDF 表单的 Python 脚本失败

问题描述 投票:0回答:1

我正在开发一个 Python 程序,使用 PyMuPDF (fitz) 自动填写 PDF 表单。我创建了一个基本的 PDF 表单,其中占位符可以是:

enter image description here

文本字段使用下划线 (__________),或 用于在每个块中输入一个字符的块/网格单元。 我通过识别边界框成功地为带有下划线的字段插入了文本,但是当尝试将字符写入网格的各个块时,我的代码失败了。

这是我迄今为止尝试过的:

    # 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”)放入网格单元中,但它没有按预期工作。 我可以突出显示网格单元(例如,通过为其边框着色),但文本位置无法正确对齐或完全失败。

enter image description here 这是我到目前为止编写的代码:

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 处理这种字符放置有限制吗?

任何帮助或建议将不胜感激!

python pdf pymupdf
1个回答
0
投票

你可以尝试使用其他库,例如“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))
© www.soinside.com 2019 - 2024. All rights reserved.