Однако, когда данные содержат круглые скобки, средства просмотра PDF-файлов (браузер, Acrobat Reader) отображают экранированные круглые скобки, которые присутствуют только в представлении и поэтому не могут быть удалены:

Режим редактирования:

Что я пробовал: удаление объектов /AP с каждой страницы. Это сработало, но теперь в Acrobat Reader страница выглядит пустой, пока я не щелкну (или не отредактирую) поле, после чего становится видимым только значение этого поля:

Соответствующий фрагмент кода:
Код: Выделить всё
def generate_pdf_file(
a: ObjA,
rows: list[ObjB],
):
# 1) Build a one-page, form-enabled PDF from HTML (WeasyPrint)
form_pdf_bytes = generate_pdf_form(a, rows) # already filled
# 2) Load filled form (1 page) + template (4 pages)
template_path = django.contrib.staticfiles.find("pdf_file.pdf")
assert template_path, "CMR template file not found"
template_reader = pypdf.PdfReader(template_path)
form_reader = pypdf.PdfReader(io.BytesIO(form_pdf_bytes))
# 3) Create final 4-page PDF: each page starts as the (filled) form page
writer = pypdf.PdfWriter()
for page_num in range(4):
# Clone the single form page
form_page = form_reader.pages[0]
base_page = template_reader.pages[page_num]
base_page.merge_page(form_page)
writer.add_page(base_page)
out_buf = io.BytesIO()
writer.write(out_buf)
return out_buf.getvalue()
def generate_pdf_form(a: ObjA, rows: list[ObjB]):
"""
Render the HTML form with WeasyPrint (with AcroForm fields),
then fill those fields using pypdf and return the filled PDF bytes.
"""
html_form = django.template.loader.render_to_string(
"form.html",
context=dict(data_range=range(DATA_ROWS)),
)
# Create an empty (but form-enabled) PDF
empty_form_pdf = HTML(string=html_form).render(pdf_forms=True).write_pdf()
# Fill fields
form_data = data_method(a, rows)
filled_pdf = fill_pdf_form(io.BytesIO(empty_form_pdf), form_data)
return filled_pdf
def fill_pdf_form(document: io.BytesIO, data: dict) -> bytes:
"""
Fill AcroForm fields using pypdf.
"""
reader = pypdf.PdfReader(document)
writer = pypdf.PdfWriter()
writer.append(reader)
for page in writer.pages:
writer.update_page_form_field_values(page, data, auto_regenerate=False)
### Commented out what worked to remove escape characters, but broke Acrobat Reader view
# annots = page.get("/Annots")
# if annots:
# for annot_ref in cast(List[IndirectObject], annots):
# annot = annot_ref.get_object()
# if annot is None:
# continue
# annot_dict = cast(MutableMapping[str, Any], annot)
# if "/AP" in annot_dict:
# del annot_dict["/AP"]
# writer._root_object.update({NameObject("/NeedAppearances"): BooleanObject(True)})
out = io.BytesIO()
writer.write(out)
return out.getvalue()
Подробнее здесь: https://stackoverflow.com/questions/798 ... arentheses
Мобильная версия