WeasyPrint + pypdf: sichtbare, nicht bearbeitbare Escape-Zeichen in KlammernPython

Python-Programme
Anonymous
 WeasyPrint + pypdf: sichtbare, nicht bearbeitbare Escape-Zeichen in Klammern

Post by Anonymous »

Ich erstelle ein PDF-Formular aus HTML (WeasyPrint), fülle die AcroForm-Felder mit pypdf und füge diese Seite dann in einer 4-seitigen Vorlage zusammen.
Wenn die Daten jedoch Klammern enthalten, zeigen PDF-Viewer (Browser, Acrobat Reader) maskierte Klammern an, die nur in der Ansicht vorhanden sind und daher nicht entfernt werden können:

Image

Bearbeitungsmodus:

Image

Was ich versucht habe: Entfernen der /AP-Objekte von jeder Seite. Das hat funktioniert, aber jetzt sieht die Seite in Acrobat Reader leer aus, bis ich auf ein Feld klicke (oder es bearbeite). An diesem Punkt wird nur der Wert dieses Felds sichtbar:

Image

Relevantes Code-Snippet:

Code: Select all

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()
Gibt es eine Möglichkeit oder eine andere Problemumgehung, Escape-Zeichen für die Klammern zu entfernen und die Sichtbarkeit in Acrobat beizubehalten?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post