diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java index 8c49a4d6..1f80dad2 100644 --- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java +++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableContact.java @@ -4,7 +4,7 @@ package org.mustangproject.ZUGFeRD; * Neccessary interface for ZUGFeRD exporter * Licensed under the APLv2 * @date 2014-05-10 - * @version 1.0 + * @version 1.2.0 * @author jstaerk * */ diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java index 8054c70c..1ce8c0fc 100644 --- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java +++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableItem.java @@ -4,7 +4,7 @@ package org.mustangproject.ZUGFeRD; * Neccessary interface for ZUGFeRD exporter * Licensed under the APLv2 * @date 2014-05-10 - * @version 1.0 + * @version 1.2.0 * @author jstaerk * */ diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java index 8f552eb2..5cc43930 100644 --- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java +++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableProduct.java @@ -5,7 +5,7 @@ import java.math.BigDecimal; * Necessary interface for ZUGFeRD exporter * Licensed under the APLv2 * @date 2014-05-10 - * @version 1.0 + * @version 1.2.0 * @author jstaerk * */ diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java index 00545145..6a3d79c1 100644 --- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java +++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExportableTransaction.java @@ -4,7 +4,7 @@ package org.mustangproject.ZUGFeRD; * Neccessary interface for ZUGFeRD exporter * Licensed under the APLv2 * @date 2014-05-10 to 2014-06-25 - * @version 1.0.2 + * @version 1.2.0 * @author jstaerk * */ diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java index f1982b40..a9b11608 100644 --- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java +++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/VATAmount.java @@ -1,7 +1,14 @@ package org.mustangproject.ZUGFeRD; import java.math.BigDecimal; - +/** + * Mustangproject's ZUGFeRD implementation + * ZUGFeRD exporter helper class + * Licensed under the APLv2 + * @date 2015-10-29 + * @version 1.2.0 + * @author jstaerk + * */ public class VATAmount { public VATAmount(BigDecimal basis, BigDecimal calculated) { diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java index 9d055c9b..3a842f1e 100644 --- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java +++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaPDFAExtensions.java @@ -4,7 +4,7 @@ package org.mustangproject.ZUGFeRD; * ZUGFeRD exporter helper class * Licensed under the APLv2 * @date 2014-05-10 - * @version 1.0 + * @version 1.2.0 * @author jstaerk * */ import org.apache.jempbox.impl.XMLUtil; diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java index a32214ec..77353bb0 100644 --- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java +++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/XMPSchemaZugferd.java @@ -4,7 +4,7 @@ package org.mustangproject.ZUGFeRD; * ZUGFeRD exporter helper class * Licensed under the APLv2 * @date 2014-05-10 - * @version 1.0 + * @version 1.2.0s * @author jstaerk * */ import org.apache.jempbox.impl.XMLUtil; diff --git a/mustang/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java b/mustang/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java index cdbc2ed3..7096f1b0 100644 --- a/mustang/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java +++ b/mustang/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java @@ -5,7 +5,7 @@ package org.mustangproject.ZUGFeRD; * APLv2 * * @date 2014-07-12 - * @version 1.1 + * @version 1.2.0 * @author jstaerk * */ @@ -23,11 +23,12 @@ import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; + +import javax.activation.FileDataSource; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBElement; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; - import javax.xml.transform.TransformerException; import org.apache.jempbox.xmp.XMPMetadata; @@ -48,6 +49,11 @@ import org.apache.pdfbox.pdmodel.common.COSObjectable; import org.apache.pdfbox.pdmodel.common.PDMetadata; import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification; import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile; +import org.apache.pdfbox.preflight.PreflightDocument; +import org.apache.pdfbox.preflight.ValidationResult; +import org.apache.pdfbox.preflight.exception.SyntaxValidationException; +import org.apache.pdfbox.preflight.exception.ValidationException; +import org.apache.pdfbox.preflight.parser.PreflightParser; import org.mustangproject.ZUGFeRD.model.*; public class ZUGFeRDExporter { @@ -117,6 +123,8 @@ public class ZUGFeRDExporter { byte[] zugferdData = null; private boolean isTest; IZUGFeRDExportableTransaction trans = null; + private boolean ignoreA1Errors; + private PDDocument doc; private BigDecimal nDigitFormat(BigDecimal value, int scale) { /* @@ -197,16 +205,70 @@ public class ZUGFeRDExporter { public void setTest() { isTest = true; } + + public void ignoreA1Errors() { + ignoreA1Errors=true; + } + + public boolean isValidA1(String filename) { + ValidationResult result = null; + + FileDataSource fd = new FileDataSource(filename); + try + { + PreflightParser parser = new PreflightParser(fd); + + /* Parse the PDF file with PreflightParser that inherits from the NonSequentialParser. + * Some additional controls are present to check a set of PDF/A requirements. + * (Stream length consistency, EOL after some Keyword...) + */ + parser.parse(); + + /* Once the syntax validation is done, + * the parser can provide a PreflightDocument + * (that inherits from PDDocument) + * This document process the end of PDF/A validation. + */ + PreflightDocument document = parser.getPreflightDocument(); + document.validate(); + + // Get validation result + result = document.getResult(); + document.close(); + + } + catch (ValidationException e) + { + /* the parse method can throw a SyntaxValidationException + * if the PDF file can't be parsed. + * In this case, the exception contains an instance of ValidationResult + */ + return false; + } catch (IOException e) { + return false; + } + + // display validation result + return result.isValid(); + } /** * Makes A PDF/A3a-compliant document from a PDF-A1 compliant document (on * the metadata level, this will not e.g. convert graphics to JPG-2000) * */ - public PDDocumentCatalog PDFmakeA3compliant(PDDocument doc, String producer, String creator, + public PDDocumentCatalog PDFmakeA3compliant(String filename, String producer, String creator, boolean attachZugferdHeaders) throws IOException, TransformerException { + + if (!ignoreA1Errors&&!isValidA1(filename)) { + throw new IOException("File is not a valid PDF/A-1 input file"); + } + doc = PDDocument + .load(filename); + String fullProducer = producer + " (via mustangproject.org " + versionStr + ")"; + PDDocumentCatalog cat = doc.getDocumentCatalog(); PDMetadata metadata = new PDMetadata(doc); cat.setMetadata(metadata); @@ -870,5 +932,13 @@ public class ZUGFeRDExporter { metadata.addSchema(pdfaex); } + + /**** + * Returns the PDFBox PDF Document + * @return + */ + public PDDocument getDoc() { + return doc; + } }