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.10.0.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.10.0.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.10.0.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.11 und XRechnung 2. 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

Mit

java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.10.0.jar --action visualize

können Sie UN/CEFACT 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.

PDF/A-1 nach PDF/A-3 konvertieren

java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.10.0.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.10.0.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.10.0.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.10.0.jar --action metrics -d <Verzeichnisname>

bspw.

java -Xmx1G -Dfile.encoding=UTF-8 -jar Mustang-CLI-2.10.0.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.10.0.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.10.0.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