ZUGFeRD fix 3

This commit is contained in:
dfuhrmann3 2026-07-03 13:25:51 +02:00
parent d8e90b119e
commit d1604b0388
1 changed files with 59 additions and 2 deletions

61
main.py
View File

@ -583,15 +583,72 @@ with col2:
) )
else: else:
try: try:
# 🔥 FIX: mime-Parameter entfernt, da von PyMuPDF nicht unterstützt
original_pdf_bytes = uploaded_file.getvalue() original_pdf_bytes = uploaded_file.getvalue()
doc = fitz.open(stream=original_pdf_bytes, filetype="pdf") doc = fitz.open(stream=original_pdf_bytes, filetype="pdf")
# 🔥 OPTIMIERUNG 1: Setze das zwingend erforderliche PDF/A-3 Beziehungs-Flag 'Alternative'
doc.embfile_add( doc.embfile_add(
"factur-x.xml", "factur-x.xml",
xml_string.encode("utf-8"), xml_string.encode("utf-8"),
filename="factur-x.xml", filename="factur-x.xml",
desc="Factur-X/ZUGFeRD E-Invoice" desc="Factur-X/ZUGFeRD E-Invoice",
relationship="Alternative"
) )
# 🔥 OPTIMIERUNG 2: Injiziere das offizielle Factur-X / ZUGFeRD 2.x XMP-Schema in den PDF-Header
xmp_xml = """<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about="" xmlns:pdfaExtension="http://www.aiim.org/pdfa/ns/extension/" xmlns:pdfaSchema="http://www.aiim.org/pdfa/ns/schema/" xmlns:pdfaProperty="http://www.aiim.org/pdfa/ns/property#">
<pdfaExtension:schemas>
<rdf:Bag>
<rdf:li rdf:parseType="Resource">
<pdfaSchema:schema>Factur-X PDFA Extension Schema</pdfaSchema:schema>
<pdfaSchema:prefix>fx</pdfaSchema:prefix>
<pdfaSchema:namespace>urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#</pdfaSchema:namespace>
<pdfaSchema:properties>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>DocumentType</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
<pdfaProperty:description>The type of the document, usually INVOICE</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>DocumentFileName</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
<pdfaProperty:description>The name of the embedded file</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>Version</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
<pdfaProperty:description>The version of the document type schema</pdfaProperty:description>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<pdfaProperty:name>ConformanceLevel</pdfaProperty:name>
<pdfaProperty:valueType>Text</pdfaProperty:valueType>
<pdfaProperty:category>external</pdfaProperty:category>
<pdfaProperty:description>The conformance level of the document</pdfaProperty:description>
</rdf:li>
</rdf:Seq>
</pdfaSchema:properties>
</rdf:li>
</rdf:Bag>
</pdfaExtension:schemas>
</rdf:Description>
<rdf:Description rdf:about="" xmlns:fx="urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#">
<fx:DocumentType>INVOICE</fx:DocumentType>
<fx:DocumentFileName>factur-x.xml</fx:DocumentFileName>
<fx:Version>1.0</fx:Version>
<fx:ConformanceLevel>XRECHNUNG</fx:ConformanceLevel>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>"""
doc.set_xmp_metadata(xmp_xml)
zugferd_pdf_bytes = doc.tobytes() zugferd_pdf_bytes = doc.tobytes()
doc.close() doc.close()