Also, wie aus Notes eine Rechnung als PDF erstellt wird, sollte klar und bereits realisierbar sein. Es muss aber ein PDF/X-3 sein. Das Aufwendigste an der ganzen Sache ist die richtlinienkonforme Erstellung der XML-Datei. Eine gute Beispieldatei findet sich hier:
https://github.com/itplr-kosit/xrechnung-testsuite/blob/master/src/test/business-cases/standard/01.10a-INVOICE_ubl.xmlUm die xml aus Notes zu generieren, sollten im Rechnungsdokument vier Felder angelegt werden, aus denen dann das Gesamt-xml generiert wird. Es sind bei mir vier, weil die Zeichenzahl für ein Feld zu groß ist. Die xml-Datei sollte dann per Feldformel in die Felder geschrieben werden, wobei natürlich die ins xml einzutragende Werte dann variabel aus dem Dokument geholt werden. Wie genau, hängt stark von eurer individuellen Rechnungsstruktur ab. Ihr müsst einfach Wert für Wert aus den Feldern eures Dokuments holen.
Ihr habt sicherlich einen Button, der eure Rechnung und das dazugehörige PDF erstellt. Ich würde diesen erweitern und die xml-Datei in ein beliebiges Verzeichnis speichern:
sdatei_inhalt = uidoc2.fieldgettext("erechnung1") + Chr(10) + uidoc2.fieldgettext("erechnung2")+ Chr(10) + uidoc2.fieldgettext("erechnung_positionen_addiert")+uidoc2.fieldgettext("erechnung_position")+ Chr(10)
strTemp = uidoc.FieldGetText("auftragsnummer")
Dim sFile As String
sFile = sStbrVerzeichnis + "invoice_"+strTemp + ".xml"
Print sFile
fileNum = Freefile()
Open sFile For Output As fileNum Charset = "UTF-8"
Print #fileNum, sdatei_inhalt
Close fileNum
Die xml muss ausführlich getestet und validiert werden. Dieses Tool eignet sich ganz gut:
https://erechnungsvalidator.service-bw.de/Nun habt ihr also eine PDF- und eine xml-Datei. Letztere muss nun an die PDF angehängt werden.
Daze generiere ich ein Python-Skript ebenfalls als Feldformel. Das Skript wird dann wie die xml als Datei gespeichert und per ebenfalls generierter Batch-Datei ausgeführt. Das Skript sieht als Feldformel bei mir so aus:
"import fitz
import os
def embed_xml_in_pdf(pdf_path, xml_path):
# Laden der PDF-Datei
try:
pdf_document = fitz.open(pdf_path)
except Exception as e:
print(f\"Fehler beim Öffnen der PDF: {e}\")
return
# Sicherstellen, dass die XML-Datei existiert
if not os.path.exists(xml_path):
print(\"Die XML-Datei wurde nicht gefunden!\")
return
# XML-Inhalt als Anhang hinzufügen
try:
with open(xml_path, \"rb\") as xml_file:
xml_data = xml_file.read()
pdf_document.embfile_add(buffer_=xml_data, name=os.path.basename(xml_path))
except Exception as e:
print(f\"Fehler beim Einbetten der XML: {e}\")
return
# Temporäre Datei für das Speichern
temp_output = pdf_path + \".tmp\"
# Speichern der PDF in temporäre Datei
try:
pdf_document.save(temp_output)
pdf_document.close()
except Exception as e:
print(f\"Fehler beim Speichern der temporären PDF: {e}\")
return
# Originaldatei mit der temporären Datei ersetzen
try:
os.replace(temp_output, pdf_path)
print(f\"Die XML wurde erfolgreich in die PDF eingebettet und überschrieben: {pdf_path}\")
except Exception as e:
print(f\"Fehler beim Ersetzen der Originaldatei: {e}\")
# Beispielausführung
pdf_path = r"+"\""+pfad_rechnung+"invoice_"+@Text(rechnungsnummer_2)+".pdf\"
# xml_path = r"+"\""+pfad_rechnung+"xrechnung.xml\"
xml_path = r"+"\""+pfad_rechnung+"invoice_"+@Text(rechnungsnummer_2)+".xml\"
embed_xml_in_pdf(pdf_path, xml_path)"
Dabei entsteht dann ein hybrides PDF, das einfache PDF wird überschrieben. Das hybride PDF kann hier getestet werden:
https://erechnungs-validator.winball.de/Das wäre das Grundgerüst des Vorgangs. Der Weg zur fertigen E-Rechnung kann allerdings sehr kompliziert sein. Vor allem die fehlerfreie Erstellung der xml-Datei ist sehr aufwendig. Ich empfehle, ChatGPT als Unterstützung während des Programmiervorgangs und vor allem zur Erklärung der xml-Tags zu verwenden. ChatGPT kann einem sagen, welche Tags optional sind und welche Werte wohin kommen.
Vielleicht gibt es akuratere Lösungen, aber diese hat für mich funktioniert. Die Erstellung von xml und hybridem PDF dauert weniger als eine Sekunde.