Невозможно правильно выровнять элементы формы с помощью pymupdf и reportlab.Python

Программы на Python
Anonymous
Невозможно правильно выровнять элементы формы с помощью pymupdf и reportlab.

Сообщение Anonymous »

Я пишу программу, которая принимает файлы форм и превращает их в интерактивные PDF-формы, используя маркеры для поиска и рисования элементов формы.
Я настроил переключатели для выравнивания на странице правильно, но я не могу правильно выровнять текстовые поля.
Похоже, это может быть связано с тем, как определяется длина предыдущего текста или, возможно, с разницей в единицах измерения между пакеты, но я не могу этого понять.
Этот код получает все местоположения и размеры элементов формы, записывает их в пустой PDF-файл, а затем объединяет этот PDF-файл с оригиналом. форма:

Код: Выделить всё

def extract_pdf(filename):
script_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(script_dir, filename)
print(file_path)
document = fitz.open(file_path)
markers = []
font = fitz.Font()
print(document)

for page_num in range(len(document)):
page = document.load_page(page_num)
text = page.get_text('dict')
for block in text['blocks']:
for line in block['lines']:
for span in line['spans']:
if '[' in span['text']:
bracket_matches = re.finditer(r'\[([^\]]*)\]', span['text'])
for match in bracket_matches:
start_index = match.start()
end_index = match.end()

preceding_text = span['text'][:start_index]
bracket_text = span['text'][start_index:end_index]

preceding_text_width = font.text_length(preceding_text, span['size'])
bracket_text_width = font.text_length(bracket_text, span['size'])

start_x = span['bbox'][0] + preceding_text_width
width = bracket_text_width
height = span['bbox'][3] - span['bbox'][1]
print(height)
markers.append({
"type": "text",
"x": start_x,
"y": span['bbox'][3],
"width": width,
'height': height,
"page_num": page_num
})

original_pdf = PdfReader(open(filename, 'rb'))
output_pdf = PdfWriter()

for i in range(len(original_pdf.pages)):
original_page = original_pdf.pages[i]
original_page_width = original_page.mediabox[2]
original_page_height = original_page.mediabox[3]

packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=(original_page_width, original_page_height))
acroform = can.acroForm

text_counter = 1
for marker in markers:
text_counter += 1
if marker["type"] == "text":
acroform.textfield(
name=f"TextField{text_counter}",
x=marker['x'],
y=original_page_height - marker['y'],
width=marker['width'],
height=marker['height'],
borderStyle="solid",
borderWidth=1,
forceBorder=True,
maxlen=50
)

can.save()

packet.seek(0)
new_pdf = PdfReader(packet)
page = original_pdf.pages[i]
if new_pdf.pages[0]:
page.merge_page(new_pdf.pages[0])

output_pdf.add_page(page)

save_path  = os.path.dirname(os.path.abspath(__file__))
save_file = os.path.join(script_dir, 'output.pdf')
with open(save_file, 'wb') as f:
output_pdf.write(f)

Как вы можете видеть на изображении, мои переключатели расположены примерно по центру своих маркеров, однако мои текстовые поля расположены повсюду. Мои текстовые поля в заголовке формы расположены слишком далеко вправо по оси X. Моя теория заключается в том, что get_text_width неправильно преобразует ширину предыдущего текста. Может быть, пробелы не рассчитываются должным образом? Все выглядит в порядке, когда я печатаю предыдущий текст и длину текста. Любые рекомендации будут полезны.
Вот как форма выглядела раньше:

Изображение

Это окончательная форма:

![Это окончательная форма]
(https://i.sstatic.net/M084nVpB.jpg)

Подробнее здесь: https://stackoverflow.com/questions/787 ... -reportlab

Вернуться в «Python»