Kommandozeile
Mustang können Sie auch auf der Kommandozeile nutzen:
XML extrahieren
➜ target git:(master) ✗ java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action extract
Source PDF (default: invoice.pdf):
ZUGFeRD XML (default: ZUGFeRD-invoice.xml):
Written to ZUGFeRD-invoice.xml
PDF und XML kombinieren
In diesem Fall muss die PDF-Quelldatei eine PDF/A-1 wie unser “blanko” sein
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action combine
Source PDF (default: invoice.pdf):
ZUGFeRD XML (default: factur-x.xml):
Ouput PDF (default: invoice.ZUGFeRD.pdf):
ZUGFeRD version (1 or 2) (default: 2):
Profile [M]INIMUM, BASIC [W]L, [B]ASIC,
[C]IUS, [E]N16931, EX[T]ENDED or [X]RECHNUNG (default: E):
Written to invoice.ZUGFeRD.pdf
ZUGFeRD 1, 2 oder XRechnungsdateien validieren
Beispielhaft die Validierung einer angegeben, gültigen XML-Datei mit der –no-notices-Option. Um zusätzlich nur XML-Ausgaben zuzulassen leiten Sie die Fehlerausgabe auf /dev/null auf Linux und Mac, auf NUL unter MS Windows cmd.exe oder zu $null in der MS Windows Powershell um:
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --no-notices --action validate --source invoice.xml 2>/dev/null<?xml version="1.0" encoding="UTF-8"?>
<validation filename="invoice.xml" datetime="2020-11-12 10:45:12">
<xml>
<info>
<version>2</version>
<profile>urn:cen.eu:en16931:2017#compliant:factur-x.eu:1p0:en16931</profile>
<validator version="2.0.0"/>
<rules>
<fired>201</fired>
<failed>0</failed>
</rules>
<duration unit="ms">8225</duration>
</info>
<summary status="valid"/>
</xml>
<summary status="valid"/>
</validation>
Oder als Beispiel eine ungültige PDF-Datei ohne –no-notices:
Source PDF or XML (default: invoice.pdf):
10:49:38.729 [main] ERROR o.m.validator.ZUGFeRDValidator - Error 25: Unsupported profile type urn:cen.eu:en16931:2017:compliant:factur-x.eu:1p0:en16931
10:49:38.790 [main] INFO c.h.s.x.SchematronResourceXSLTCache - Compiling XSLT instance [cpPath=/xslt/ZF_211/FACTUR-X_EN16931.xslt; urlResolved=true; URL=jar:file:/C:/Users/jstaerk/workspace/mustangproject/Mustang-CLI/target/Mustang-CLI-2.0.0.jar!/xslt/ZF_211/FACTUR-X_EN16931.xslt]
10:49:46.128 [main] INFO c.h.s.x.SchematronResourceXSLTCache - Compiling XSLT instance [cpPath=/xslt/cii16931schematron/EN16931-CII-validation.xslt; urlResolved=true; URL=jar:file:/C:/Users/jstaerk/workspace/mustangproject/Mustang-CLI/target/Mustang-CLI-2.0.0.jar!/xslt/cii16931schematron/EN16931-CII-validation.xslt]
10:49:46.943 [main] INFO c.h.s.x.SchematronResourceXSLTCache - Compiling XSLT instance [cpPath=/xslt/XR_20/XRechnung-CII-validation.xslt; urlResolved=true; URL=jar:file:/C:/Users/jstaerk/workspace/mustangproject/Mustang-CLI/target/Mustang-CLI-2.0.0.jar!/xslt/XR_20/XRechnung-CII-validation.xslt]
10:49:47.043 [main] INFO o.m.validator.XMLValidator - FailedAssert
10:49:47.048 [main] INFO o.m.validator.ZUGFeRDValidator - Notice 27: [BR-DE-15] Das Element "Buyer reference" (BT-10) muss ³bermittelt werden.
10:49:47.049 [main] INFO o.m.validator.XMLValidator - FailedAssert
10:49:47.052 [main] INFO o.m.validator.ZUGFeRDValidator - Notice 27: [BR-DE-21] Das Element "Specification identifier" (BT-24) soll syntaktisch der Kennung des Standards XRechnung entsprechen.
10:49:47.052 [main] INFO o.m.validator.XMLValidator - FailedAssert
10:49:47.052 [main] INFO o.m.validator.ZUGFeRDValidator - Notice 27: [BR-DE-2] Die Gruppe "SELLER CONTACT" (BG-6) muss ³bermittelt werden.
10:49:47.083 [main] INFO o.m.validator.ZUGFeRDValidator - Parsed PDF:valid XML:invalid Signature:Mustang Checksum:392A91BA0FB8BF07BE93BE5A9629987E1F80EDBA Profile:urn:cen.eu:en16931:2017:compliant:factur-x.eu:1p0:en16931 Version:2 Took:11927ms Errors:[25,27,27,27]
<?xml version="1.0" encoding="UTF-8"?>
<validation filename="invoice.pdf" datetime="2020-11-12 10:49:35">
<pdf>
<report>
<buildInformation>
<releaseDetails id="core" version="1.16.1" buildDate="2020-05-12T00:43:00+02:00"/>
<releaseDetails id="validation-model" version="1.16.1" buildDate="2020-05-12T00:46:00+02:00"/>
</buildInformation>
<jobs>
<job>
<item size="110821">
<name>C:\Users\jstaerk\workspace\mustangproject\invoice.pdf</name>
</item>
<validationReport profileName="PDF/A-3U validation profile" statement="PDF file is compliant with Validation Profile requirements." isCompliant="true">
<details passedRules="126" failedRules="0" passedChecks="11415" failedChecks="0"/>
</validationReport>
<duration start="1605174575761" finish="1605174578071">00:00:02.310</duration>
</job>
</jobs>
<batchSummary totalJobs="1" failedToParse="0" encrypted="0">
<validationReports compliant="1" nonCompliant="0" failedJobs="0">1</validationReports>
<featureReports failedJobs="0">0</featureReports>
<repairReports failedJobs="0">0</repairReports>
<duration start="1605174575397" finish="1605174578105">00:00:02.708</duration>
</batchSummary>
</report>
<info>
<signature>Mustang</signature>
<duration unit="ms">3209</duration>
</info>
<summary status="valid"/>
</pdf>
<xml>
<info>
<version>2</version>
<profile>urn:cen.eu:en16931:2017:compliant:factur-x.eu:1p0:en16931</profile>
<validator version="2.0.0"/>
<rules>
<fired>209</fired>
<failed>3</failed>
</rules>
<duration unit="ms">8505</duration>
</info>
<messages>
<error type="25">Unsupported profile type urn:cen.eu:en16931:2017:compliant:factur-x.eu:1p0:en16931</error>
<notice type="27" location="/*:CrossIndustryInvoice[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]" criterion="rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeAgreement/ram:BuyerReference[boolean(normalize-space(.))]">[BR-DE-15] Das Element "Buyer reference" (BT-10) muss übermittelt werden.</notice>
<notice type="27" location="/*:CrossIndustryInvoice[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]/*:ExchangedDocumentContext[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]" criterion="ram:GuidelineSpecifiedDocumentContextParameter/ram:ID = 'urn:cen.eu:en16931:2017#compliant#urn:xoev-de:kosit:standard:xrechnung_2.0'">[BR-DE-21] Das Element "Specification identifier" (BT-24) soll syntaktisch der Kennung des Standards XRechnung entsprechen.</notice>
<notice type="27" location="/*:CrossIndustryInvoice[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]/*:SupplyChainTradeTransaction[namespace-uri()='urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'][1]/*:ApplicableHeaderTradeAgreement[namespace-uri()='urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'][1]/*:SellerTradeParty[namespace-uri()='urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'][1]" criterion="ram:DefinedTradeContact">[BR-DE-2] Die Gruppe "SELLER CONTACT" (BG-6) muss übermittelt werden.</notice>
</messages>
<summary status="invalid"/>
</xml>
<messages></messages>
<summary status="invalid"/>
</validation>
Eingabedatei kann eine PDF oder eine XML-Datei sein. Unterstützt werden Factur-X/ZUGFeRD 1, 2.20 und XRechnung 3. Dateien im EN16931-Profil werfen zusätzlich Notices wenn sie gegen XRechnung verstoßen und keine –no-notices angegeben ist. Die entsprechenden Notices werden als Fehler ausgegeben sofern es sich erkennbar um eine XRechnunghandelt (Guideline-ID oder XRechnung-Referenzprofil). Bei PDF-Eingabe wird zusätzlich die Ausgabe eines eingebetten VeraPDFs in die XML-Ausgabe aufgenommen.
Das Ergebnis ist XML auf der Standardausgabe, Ausgabe auf Error-Out und ein Logeintrag in einem “logs” Verzeichnis.
Falls Sie das Log live auswerten möchten gibt es eine passende Konfigurationsdatei für Elasticsearch/Logstash/Kibana.
Es gibt die folgenden Fehlertypen:
ID | Bedeutung |
---|---|
1 | file not found |
2 | additional data schema validation fails |
3 | xml data not found |
4 | schematron rule failed |
5 | file too small |
6 | VeraPDFException |
7 | IOException PDF |
8 | File does not look like PDF nor XML (contains neither %PDF nor <?xml) |
9 | IOException XML |
11 | XMP Metadata: ConformanceLevel not found |
12 | XMP Metadata: ConformanceLevel contains invalid value |
13 | XMP Metadata: DocumentType not found |
14 | XMP Metadata: DocumentType invalid |
15 | XMP Metadata: Version not found |
16 | XMP Metadata: Version contains invalid value |
18 | schema validation failed |
19 | XMP Metadata: DocumentFileName contains invalid value |
20 | not a pdf |
21 | XMP Metadata: DocumentFileName not found”) |
22 | generic XML validation exception |
23 | Not a PDF/A-3 |
24 | Issues in CEN EN16931 Schematron Check |
25 | Unsupported profile type |
26 | No rules matched, XML to minimal? |
27 | XRechnung schematron validation |
Der Rückgabewert des Kommandozeilenaufrufs wird 0 bei korrekten und !=0 bei ungültigen Dateien sein.
Benutzen Sie –action validateExpectValid und –d um ein Verzeichnis anzugeben, das rekursiv nur gültige Dateien enthalten soll, für Verzeichnisse mit absichtlich ungültigen Dateien nutzen Sie bitte –action validateExpectInvalid.
XML visualisieren in HTML
Mit
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action visualize
können Sie XML in HTML konvertieren, was insbesondere für das Extended-Profil von ZUGFeRD 2 ein experimentelles Feature ist. Bitte melden Sie auftretende Fehler unter Angabe von Schritten um den Fehler zu reproduzieren.
XML visualisieren in PDF
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action pdf
erstellt aus einer XML-Eingabedatei eine PDF-A-Datei (ohne combine noch ohne ZUGFeRD/Factur-X informationen).
PDF/A-1 nach PDF/A-3 konvertieren
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action a3only
Migriert eine PDF/A-1 in eine PDF/A-3-Datei ohne ZUGFeRD-Daten hinzuzufügen. Derselbe Dateiinhalt wird schlicht als die neue Version ausgewiesen (was funktionieren muss weil das Format rückwärts-kompatibel ist). Zusätzliche Features wie die in PDF/A-2 eingeführte JPG2000-Kompression von Bildern werden nicht genutzt werden.
Umwandlung von CII auf UBL
Mustang bettet eine Bibliothek von Phillip Helger ein um von UN/CEFACT CII XML nach UBL XML umwandeln zu können:
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action ubl
Factur-X XML source (default: factur-x.xml):
UBL target (default: ubl-invoice.xml):
Written to ubl-invoice.xml
ZUGFeRD 1 auf 2 migrieren
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action upgrade
ZUGFeRD 1.0 XML
source (default: ZUGFeRD-invoice.xml):
ZUGFeRD 2.0 XML target (default: factur-x.xml):
Written to factur-x.xml
Die Migration von ZF1 zu Version 2 benutzt intern eine selbstgeschriebene (lies: unvollständige) XSLT-Transformation. Korrekturen und Ergänzungen sind willkommen.
Metriken
Der Ursprungszweck des Kommandozeilentools war, herauszufinden, wie viele PDF-Dateien in bestimmten Pfaden bereits ZUGFeRD-Rechnungen sind.
Nutzen Sie
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action metrics -d <Verzeichnisname>
bspw.
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action metrics -d /tmp/XMLExamples
.................................................................................................................................................
===================================================================
Files: 145 Dirs: 15 PDF: 18 ZUGFeRD: 14
Jeder Punkt ist eine überprüfte Datei.
Verzeichnisse werden rekursiv abgehandelt, in diesem Beispiel wurden 18 PDF-Dateien in 15 Verzeichnissen gefunden. 14 der 18 Dateien wurden als ZUGFeRD 1 oder 2 identifiziert. Üblicherweise werden nur Dateien die auf .pdf oder .PDF enden überprüft. Ein zusätzliches -i überprüft alle Dateien.
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action metrics -l
Mit -l kann eine Liste der zu überprüfenden Dateien angegeben werden. Eine leere Zeile startet die Überprüfung.
Beispiel:
java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.14.1.jar --action metrics -l
./MustangGnuaccountingBeispielRE-20170509_505PDFA3.pdf
./MustangGnuaccountingBeispielRE-20171118_506blanko.pdf
./MustangGnuaccountingBeispielRE-20170509_505PDF14.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_COMFORT_Sachversicherung_berechneter_Steuersatz.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_COMFORT_Einfach.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_COMFORT_Rechnungskorrektur.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_EXTENDED_Warenrechnung.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_COMFORT_Kraftfahrversicherung_Bruttopreise.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_COMFORT_SEPA_Prenotification.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_EXTENDED_Kostenrechnung.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_EXTENDED_Rechnungskorrektur.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_BASIC_Rechnungskorrektur.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_BASIC_Einfach.pdf
./ZUGFerdExamples/xslt/factur-x.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_COMFORT_Haftpflichtversicherung_Versicherungssteuer.pdf
./ZUGFerdExamples/ZUGFeRD_1p0_COMFORT_Rabatte.pdf
./MustangGnuaccountingBeispielRE-20170509_505.pdf
./MustangGnuaccountingBeispielRE-20170509_505blanko.pdf
./zf2test.pdf
...................
===================================================================
Files: 19 Dirs: 0 PDF: 19 ZUGFeRD: 15
Detaillierte Parameter
Falls Sie Mustang nicht-interaktiv, beispielsweise in einem Skript verwenden möchten, können Sie je nach Operation auf folgende Parameter zugreifen:
- –source <filename>
- Eingabe-PDF-Datei
- –source-xml <filename>
- Eingabe XML-Datei
- –out <filename>
- Ausgabe-Datei (meist PDF)
- –format <fx|zf>
- Ausgabe-Datei (meist PDF)
- –attachments <datei.pdf>
- Zusätzlich ins PDF einzubettende Dateien mit rechnungsbegründenden Unterlagen (Aufmaß, Stundenliste, Wartungsprotokoll o.ä.). “” für keine zustätzlich einzubettenden Dateien.
- –version <1|2>
- ZUGFeRD-Version
- –profile <…>
- ZUGFeRD-Profile
- Für ZUGFeRD v1: <b>ASIC, <c>OMFORT oder <e>XTENDED
- Für ZUGFeRD v2: <m>INIMUM, BASIC <w>L, <b>ASIC, <c>IUS, <e>N16931, E<x>TENDED