Я настроил переключатели для выравнивания на странице правильно, но я не могу правильно выровнять текстовые поля.
Похоже, это может быть связано с тем, как определяется длина предыдущего текста или, возможно, с разницей в единицах измерения между пакеты, но я не могу этого понять.
Этот код получает все местоположения и размеры элементов формы, записывает их в пустой 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)
Вот как форма выглядела раньше:
Это окончательная форма:
![Это окончательная форма]
(https://i.sstatic.net/M084nVpB.jpg)
Подробнее здесь: https://stackoverflow.com/questions/787 ... -reportlab