I am unsuccessfully trying to create a view copy from this X-Invoice (Code shortened to relevant bits):
<?xml version="1.0" encoding="UTF-8"?>
<rsm:CrossIndustryInvoice xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:rsm="urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100" xmlns:ram="urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100" xmlns:qdt="urn:un:unece:uncefact:data:standard:QualifiedDataType:100">
[...]
<rsm:SupplyChainTradeTransaction>
[...]
<ram:ApplicableHeaderTradeSettlement>
[...]
<ram:SpecifiedTradePaymentTerms>
<ram:Description>30 Tage 3%, 60 Tage netto</ram:Description>
<ram:DueDateDateTime>
<udt:DateTimeString format="102">20250420</udt:DateTimeString>
</ram:DueDateDateTime>
</ram:SpecifiedTradePaymentTerms>
<ram:SpecifiedTradePaymentTerms>
<ram:Description>30 Tage 3%, 60 Tage netto</ram:Description>
<ram:DueDateDateTime>
<udt:DateTimeString format="102">20250321</udt:DateTimeString>
</ram:DueDateDateTime>
<ram:ApplicableTradePaymentDiscountTerms>
<ram:BasisDateTime>
<udt:DateTimeString format="102">20250219</udt:DateTimeString>
</ram:BasisDateTime>
<ram:BasisAmount>[... omitted ...]</ram:BasisAmount>
<ram:CalculationPercent>3.00</ram:CalculationPercent>
<ram:ActualDiscountAmount>[... omitted ...]</ram:ActualDiscountAmount>
</ram:ApplicableTradePaymentDiscountTerms>
</ram:SpecifiedTradePaymentTerms>
</ram:ApplicableHeaderTradeSettlement>
</rsm:SupplyChainTradeTransaction>
</rsm:CrossIndustryInvoice>
Note that my XML invoice has got two elements
rsm:CrossIndustryInvoice/rsm:SupplyChainTradeTransaction[1]/ram:ApplicableHeaderTradeSettlement[1]/SpecifiedTradePaymentTerms
The X-Invoice validates OK with no messages
<?xml version="1.0" encoding="UTF-8"?>
<validation filename="zugferd-invoice.xml" datetime="2025-02-28 15:13:11">
<xml>
<info>
<version>2</version>
<profile>urn:cen.eu:en16931:2017#conformant#urn:zugferd.de:2p0:extended</profile>
<validator version="2.16.2"/>
<rules>
<fired>324</fired>
<failed>0</failed>
</rules>
<duration unit="ms">1816</duration>
</info>
<summary status="valid"/>
</xml>
<summary status="valid"/>
</validation>
I store the XML content of the X-Invoice inside a string. To create a view copy I apply:
import org.mustangproject.validator.ZUGFeRDValidator;
[... lots of code ...]
ZUGFeRDVisualizer mustangVisualizer;
byte[] fileContent;
mustangVisualizer = new ZUGFeRDVisualizer();
try {
fileContent = mustangVisualizer.toPDF(xInvoiceXML);
if (fileContent != null) {
// send fileContent to display
} else {
// log ("Plain PDF, has no X-Invoice inside");
}
catch (Throwable e) { // yes, I am lazy
System.err.println (
e.getClass().getSimpleName() + ": " + e.getMessage()
);
}
[... lots of more code ...]
With the given XML invoice this code produces on the standard error output:
NullPointerException: Cannot invoke "String.getBytes(java.nio.charset.Charset)" because "fopInput" is null
I run the program on my IDE and get below exception message and stack trace. I assume the date CSV 2025-04-20;2025-03-21 are two dates 20250420 and 20250321 in the ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime tags.
When I remove one of the ram:SpecifiedTradePaymentTerms tags the visualizer produces a view copy successfully,
without any exceptions.
With other X-Invoices I do get a view copy - with ZUGFeRD PDFs and invoice XMLs.
I don't know the underlying standard, but I think it is allowed to put two ram:SpecifiedTradePaymentTerms tags at that place.
My `java` version:
openjdk version "22.0.1" 2024-04-16
OpenJDK Runtime Environment (build 22.0.1+8-16)
OpenJDK 64-Bit Server VM (build 22.0.1+8-16, mixed mode, sharing)
My OS:
DISTRIB_ID="ManjaroLinux"
DISTRIB_RELEASE="25.0.0"
DISTRIB_CODENAME="Zetar"
DISTRIB_DESCRIPTION="Manjaro Linux"
Is there anything I should do different to get a view copy for X-Invoices which have two ram:SpecifiedTradePaymentTerms tags in the given location?
Thank you so much for clarification!
The exception message:
net.sf.saxon.trans.XPathException: Invalid date "2025-04-20;2025-03-21" (Day must be two digits). Found while atomizing the first argument of fn:normalize-space() in {$content} on line 128
at net.sf.saxon.expr.Atomizer$AtomizerElaborator.lambda$elaborateForPull$0(Atomizer.java:687) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.AtomicSequenceConverter$AtomicSequenceConverterElaborator.lambda$elaborateForPull$0(AtomicSequenceConverter.java:536) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.CardinalityChecker$CardinalityCheckerElaborator.lambda$elaborateForPull$0(CardinalityChecker.java:506) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForItem$1(PullElaborator.java:54) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.elab.PullElaborator.lambda$elaborateForUnicodeString$3(PullElaborator.java:76) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.functions.NormalizeSpace_1$NormalizeSpaceFnElaborator.lambda$elaborateForBoolean$2(NormalizeSpace_1.java:115) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Choose$ChooseExprElaborator.lambda$elaborateForPush$10(Choose.java:1168) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$3(Block.java:885) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:247) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.CallTemplate$CallTemplatePackage.processLeavingTail(CallTemplate.java:515) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.Expression.dispatchTailCall(Expression.java:976) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:634) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:895) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.DocumentInstr$DocumentInstrElaborator.lambda$elaborateForItem$3(DocumentInstr.java:392) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.elab.OptionalItemEvaluator.evaluate(OptionalItemEvaluator.java:41) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.elab.LearningEvaluator.evaluate(LearningEvaluator.java:61) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.WithParam.getSelectValue(WithParam.java:322) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Instruction.assembleParams(Instruction.java:200) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$0(CallTemplate.java:590) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:247) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:633) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:895) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:247) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:633) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.DocumentInstr$DocumentInstrElaborator.lambda$elaborateForItem$3(DocumentInstr.java:392) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.elab.OptionalItemEvaluator.evaluate(OptionalItemEvaluator.java:41) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.elab.LearningEvaluator.evaluate(LearningEvaluator.java:61) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.WithParam.getSelectValue(WithParam.java:322) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Instruction.assembleParams(Instruction.java:200) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$0(CallTemplate.java:590) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.NamedTemplate.expand(NamedTemplate.java:247) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:633) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:895) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.FixedElement$FixedElementElaborator.lambda$elaborateForPush$0(FixedElement.java:640) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.DocumentInstr$DocumentInstrElaborator.lambda$elaborateForItem$3(DocumentInstr.java:392) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.elab.OptionalItemEvaluator.evaluate(OptionalItemEvaluator.java:41) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.elab.LearningEvaluator.evaluate(LearningEvaluator.java:61) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.WithParam.getSelectValue(WithParam.java:322) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Instruction.assembleParams(Instruction.java:200) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.CallTemplate$CallTemplateElaborator.lambda$elaborateForPush$1(CallTemplate.java:625) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.Block$BlockElaborator.lambda$elaborateForPush$4(Block.java:895) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.FixedElement$FixedElementElaborator.lambda$elaborateForPush$0(FixedElement.java:640) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:376) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.trans.Mode.handleRuleNotNull(Mode.java:587) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:521) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.trans.rules.TextOnlyCopyRuleSet.process(TextOnlyCopyRuleSet.java:72) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:518) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.trans.XsltController.applyTemplates(XsltController.java:684) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.s9api.AbstractXsltTransformer.applyTemplatesToSource(AbstractXsltTransformer.java:430) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:358) ~[validator-2.16.2-shaded.jar:2.16.2]
at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:75) ~[validator-2.16.2-shaded.jar:2.16.2]
at org.mustangproject.ZUGFeRD.ZUGFeRDVisualizer.applyXSLTToPDF(ZUGFeRDVisualizer.java:432) ~[validator-2.16.2-shaded.jar:2.16.2]
at org.mustangproject.ZUGFeRD.ZUGFeRDVisualizer.toFOP(ZUGFeRDVisualizer.java:250) ~[validator-2.16.2-shaded.jar:2.16.2]
at org.mustangproject.ZUGFeRD.ZUGFeRDVisualizer.toPDF(ZUGFeRDVisualizer.java:293) ~[validator-2.16.2-shaded.jar:2.16.2]
at d.b.z.x.r.s.ValidatorBackend.addViewCopyTo(ValidatorBackend.java:162) ~[classes/:na]
at d.b.z.x.r.c.ValidationController.submitAndReturnAll(ValidationController.java:51) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-6.0.21.jar:6.0.21]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-6.0.21.jar:6.0.21]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.0.21.jar:6.0.21]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-6.0.21.jar:6.0.21]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:798) ~[spring-webmvc-6.0.21.jar:6.0.21]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.0.21.jar:6.0.21]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1081) ~[spring-webmvc-6.0.21.jar:6.0.21]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:974) ~[spring-webmvc-6.0.21.jar:6.0.21]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.0.21.jar:6.0.21]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:914) ~[spring-webmvc-6.0.21.jar:6.0.21]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:590) ~[tomcat-embed-core-10.1.24.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.0.21.jar:6.0.21]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.24.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.24.jar:10.1.24]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.21.jar:6.0.21]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.21.jar:6.0.21]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.21.jar:6.0.21]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.21.jar:6.0.21]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.21.jar:6.0.21]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.21.jar:6.0.21]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.24.jar:10.1.24]
at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na]