diff --git a/.gitignore b/.gitignore index 514265d6..de7b2f4b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ PDFA*.pdf target/ pom.xml.* bin/ +/.gradle/ diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java index 7ac9d643..232223a4 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExportException.java @@ -1,7 +1,12 @@ package org.mustangproject.ZUGFeRD; public class ZUGFeRDExportException extends RuntimeException { - public ZUGFeRDExportException() { + /** + * + */ + private static final long serialVersionUID = 1L; + + public ZUGFeRDExportException() { } public ZUGFeRDExportException(String message) { diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java index f8561001..f2c95a60 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporter.java @@ -28,19 +28,12 @@ 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.xmpbox.XMPMetadata; -import org.apache.xmpbox.schema.XMPBasicSchema; -import org.apache.xmpbox.schema.DublinCoreSchema; -import org.apache.xmpbox.schema.AdobePDFSchema; -import org.apache.xmpbox.schema.PDFAIdentificationSchema; import org.apache.pdfbox.cos.COSArray; import org.apache.pdfbox.cos.COSBase; import org.apache.pdfbox.cos.COSDictionary; @@ -58,13 +51,57 @@ import org.apache.pdfbox.preflight.ValidationResult; import org.apache.pdfbox.preflight.exception.ValidationException; import org.apache.pdfbox.preflight.parser.PreflightParser; import org.apache.pdfbox.preflight.utils.ByteArrayDataSource; +import org.apache.pdfbox.util.Version; +import org.apache.xmpbox.XMPMetadata; +import org.apache.xmpbox.schema.AdobePDFSchema; +import org.apache.xmpbox.schema.DublinCoreSchema; +import org.apache.xmpbox.schema.PDFAIdentificationSchema; +import org.apache.xmpbox.schema.XMPBasicSchema; import org.apache.xmpbox.type.BadFieldValueException; import org.apache.xmpbox.xml.XmpSerializer; -import org.mustangproject.ZUGFeRD.model.*; +import org.mustangproject.ZUGFeRD.model.AmountType; +import org.mustangproject.ZUGFeRD.model.CodeType; +import org.mustangproject.ZUGFeRD.model.CountryIDType; +import org.mustangproject.ZUGFeRD.model.CreditorFinancialAccountType; +import org.mustangproject.ZUGFeRD.model.CreditorFinancialInstitutionType; +import org.mustangproject.ZUGFeRD.model.CrossIndustryDocumentType; +import org.mustangproject.ZUGFeRD.model.DateTimeType; +import org.mustangproject.ZUGFeRD.model.DocumentCodeType; +import org.mustangproject.ZUGFeRD.model.DocumentContextParameterType; +import org.mustangproject.ZUGFeRD.model.DocumentLineDocumentType; +import org.mustangproject.ZUGFeRD.model.ExchangedDocumentContextType; +import org.mustangproject.ZUGFeRD.model.ExchangedDocumentType; +import org.mustangproject.ZUGFeRD.model.IDType; +import org.mustangproject.ZUGFeRD.model.IndicatorType; +import org.mustangproject.ZUGFeRD.model.LogisticsServiceChargeType; +import org.mustangproject.ZUGFeRD.model.NoteType; +import org.mustangproject.ZUGFeRD.model.ObjectFactory; +import org.mustangproject.ZUGFeRD.model.PaymentMeansCodeType; +import org.mustangproject.ZUGFeRD.model.PercentType; +import org.mustangproject.ZUGFeRD.model.QuantityType; +import org.mustangproject.ZUGFeRD.model.SupplyChainEventType; +import org.mustangproject.ZUGFeRD.model.SupplyChainTradeAgreementType; +import org.mustangproject.ZUGFeRD.model.SupplyChainTradeDeliveryType; +import org.mustangproject.ZUGFeRD.model.SupplyChainTradeLineItemType; +import org.mustangproject.ZUGFeRD.model.SupplyChainTradeSettlementType; +import org.mustangproject.ZUGFeRD.model.SupplyChainTradeTransactionType; +import org.mustangproject.ZUGFeRD.model.TaxCategoryCodeType; +import org.mustangproject.ZUGFeRD.model.TaxRegistrationType; +import org.mustangproject.ZUGFeRD.model.TaxTypeCodeType; +import org.mustangproject.ZUGFeRD.model.TextType; +import org.mustangproject.ZUGFeRD.model.TradeAddressType; +import org.mustangproject.ZUGFeRD.model.TradeAllowanceChargeType; +import org.mustangproject.ZUGFeRD.model.TradePartyType; +import org.mustangproject.ZUGFeRD.model.TradePaymentTermsType; +import org.mustangproject.ZUGFeRD.model.TradePriceType; +import org.mustangproject.ZUGFeRD.model.TradeProductType; +import org.mustangproject.ZUGFeRD.model.TradeSettlementMonetarySummationType; +import org.mustangproject.ZUGFeRD.model.TradeSettlementPaymentMeansType; +import org.mustangproject.ZUGFeRD.model.TradeTaxType; public class ZUGFeRDExporter implements Closeable { - + private void init() { try { jaxbContext = JAXBContext @@ -75,7 +112,7 @@ public class ZUGFeRDExporter implements Closeable { } catch (JAXBException e) { throw new ZUGFeRDExportException("Could not initialize JAXB", e); } - + } /** * * You will need Apache PDFBox. To use the ZUGFeRD exporter, implement @@ -100,7 +137,7 @@ public class ZUGFeRDExporter implements Closeable { public ZUGFeRDExporter(PDDocument doc2) { init(); doc=doc2; - + } private class LineCalc { @@ -264,12 +301,12 @@ public class ZUGFeRDExporter implements Closeable { * DecimalFormatSymbols(); symbols.setDecimalSeparator(','); * symbols.setGroupingSeparator(' '); * df.setDecimalFormatSymbols(symbols); - * + * * but that would not switch off grouping. Although I liked very much * the (incomplete) "BNF diagram" in * http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html * in the end I decided to calculate myself and take eur+sparator+cents - * + * * This function will cut off, i.e. floor() subcent values Tests: * System.err.println(utils.currencyFormat(new BigDecimal(0), * ".")+"\n"+utils.currencyFormat(new BigDecimal("-1.10"), @@ -278,7 +315,7 @@ public class ZUGFeRDExporter implements Closeable { * ",")+"\n"+utils.currencyFormat(new BigDecimal("20000123.3489"), * ",")+"\n"+utils.currencyFormat(new BigDecimal("20000123.3419"), * ",")+"\n"+utils.currencyFormat(new BigDecimal("12"), ",")); - * + * * results 0.00 -1,10 -1,10 -1,01 20000123,34 20000123,34 12,00 */ value = value.setScale(scale, BigDecimal.ROUND_HALF_UP); // first, round @@ -384,13 +421,12 @@ public class ZUGFeRDExporter implements Closeable { * 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(); + try (PreflightDocument document = parser.getPreflightDocument()) { + document.validate(); + // Get validation result + result = document.getResult(); + } } catch (ValidationException e) { /* * the parse method can throw a SyntaxValidationException if the PDF @@ -425,15 +461,25 @@ public class ZUGFeRDExporter implements Closeable { /** * 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) + * @param filename + * @param producer + * @param creator + * @param attachZugferdHeaders + * @return + * @throws IOException + * @throws TransformerException * */ - public PDDocumentCatalog PDFmakeA3compliant(String filename, - String producer, String creator, boolean attachZugferdHeaders) + public PDDocumentCatalog PDFmakeA3compliant(String filename, String producer, String creator, boolean attachZugferdHeaders) throws IOException, TransformerException { - - if (!ignoreA1Errors && !isValidA1(new FileInputStream(filename))) { - throw new IOException("File is not a valid PDF/A-1 input file"); + + try (FileInputStream fis = new FileInputStream(filename)) { + boolean validA1 = isValidA1(fis); + if (!ignoreA1Errors && !validA1) { + throw new IOException("File is not a valid PDF/A-1 input file"); + } } + loadPDFA3(filename); return makeDocPDFA3compliant(producer, creator, attachZugferdHeaders); @@ -452,37 +498,39 @@ public class ZUGFeRDExporter implements Closeable { baos.write(buf, 0, n); byte[] content = baos.toByteArray(); - InputStream is1 = new ByteArrayInputStream(content); - if (!ignoreA1Errors && !isValidA1(is1)) { - throw new IOException("File is not a valid PDF/A-1 input file"); + try (InputStream is1 = new ByteArrayInputStream(content)) { + if (!ignoreA1Errors && !isValidA1(is1)) { + throw new IOException("File is not a valid PDF/A-1 input file"); + } } + InputStream is2 = new ByteArrayInputStream(content); loadPDFA3(is2); return makeDocPDFA3compliant(producer, creator, attachZugferdHeaders); - } + } private PDDocumentCatalog makeDocPDFA3compliant(String producer, String creator, boolean attachZugferdHeaders) throws IOException, TransformerException { String fullProducer = producer + " (via mustangproject.org " - + Version.VERSION + ")"; + + Version.getVersion() + ")"; PDDocumentCatalog cat = doc.getDocumentCatalog(); PDMetadata metadata = new PDMetadata(doc); cat.setMetadata(metadata); XMPMetadata xmp = XMPMetadata.createXMPMetadata(); - + PDFAIdentificationSchema pdfaid = new PDFAIdentificationSchema(xmp); - + xmp.addSchema(pdfaid); DublinCoreSchema dc = xmp.createAndAddDublinCoreSchema(); - + dc.addCreator(creator); - + XMPBasicSchema xsb = xmp.createAndAddXMPBasicSchema(); - + xsb.setCreatorTool(creator); xsb.setCreateDate(GregorianCalendar.getInstance()); // PDDocumentInformation pdi=doc.getDocumentInformation(); @@ -530,10 +578,11 @@ public class ZUGFeRDExporter implements Closeable { ByteArrayOutputStream baos = new ByteArrayOutputStream(); serializer.serialize(xmp, baos, false); metadata.importXMPMetadata( baos.toByteArray() ); - + return cat; } + @Override public void close() throws IOException { if (doc != null) { doc.close(); @@ -548,10 +597,10 @@ public class ZUGFeRDExporter implements Closeable { private Totals totals; - private String createZugferdXMLForTransaction(IZUGFeRDExportableTransaction trans) { - this.trans = trans; + private String createZugferdXMLForTransaction(IZUGFeRDExportableTransaction trans1) { + this.trans = trans1; this.totals = new Totals(); - currency = trans.getCurrency(); + currency = trans1.getCurrency(); CrossIndustryDocumentType invoice = xmlFactory .createCrossIndustryDocumentType(); @@ -621,7 +670,7 @@ public class ZUGFeRDExporter implements Closeable { TextType name = xmlFactory.createTextType(); name.setValue("RECHNUNG"); document.getName().add(name); - + if (trans.getOwnOrganisationFullPlaintextInfo() != null) { NoteType regularInfo = xmlFactory.createNoteType(); CodeType regularInfoSubjectCode = xmlFactory.createCodeType(); @@ -633,13 +682,13 @@ public class ZUGFeRDExporter implements Closeable { regularInfo.getContent().add(regularInfoContent); document.getIncludedNote().add(regularInfo); } - + if (trans.getReferenceNumber() != null && !new String().equals(trans.getReferenceNumber())){ NoteType referenceInfo = xmlFactory.createNoteType(); TextType referenceInfoContent = xmlFactory.createTextType(); referenceInfoContent.setValue("Ursprungsbeleg: " + trans.getReferenceNumber()); referenceInfo.getContent().add(referenceInfoContent); - document.getIncludedNote().add(referenceInfo); + document.getIncludedNote().add(referenceInfo); } return document; @@ -1385,7 +1434,7 @@ public class ZUGFeRDExporter implements Closeable { * data should hav ebeen set via * setZUGFeRDXMLData(byte[] zugferdData) */ - public void PDFattachZugferdFile(IZUGFeRDExportableTransaction trans) + public void PDFattachZugferdFile(IZUGFeRDExportableTransaction trans1) throws IOException { if (zugferdData == null) // XML ZUGFeRD data not set externally, needs @@ -1394,7 +1443,7 @@ public class ZUGFeRDExporter implements Closeable { // create a dummy file stream, this would probably normally be a // FileInputStream - byte[] zugferdRaw = createZugferdXMLForTransaction(trans).getBytes(); //$NON-NLS-1$ + byte[] zugferdRaw = createZugferdXMLForTransaction(trans1).getBytes(); //$NON-NLS-1$ if ((zugferdRaw[0] == (byte) 0xEF) && (zugferdRaw[1] == (byte) 0xBB) @@ -1437,12 +1486,12 @@ public class ZUGFeRDExporter implements Closeable { * the binary data of the file/attachment * @throws java.io.IOException */ - public void PDFAttachGenericFile(PDDocument doc, String filename, + public void PDFAttachGenericFile(PDDocument doc1, String filename, String relationship, String description, String subType, byte[] data) throws IOException { PDComplexFileSpecification fs = new PDComplexFileSpecification(); fs.setFile(filename); - + COSDictionary dict = fs.getCOSObject(); dict.setName("AFRelationship", relationship); @@ -1450,7 +1499,7 @@ public class ZUGFeRDExporter implements Closeable { dict.setString("Desc", description); ByteArrayInputStream fakeFile = new ByteArrayInputStream(data); - PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile); + PDEmbeddedFile ef = new PDEmbeddedFile(doc1, fakeFile); ef.setSubtype(subType); ef.setSize(data.length); ef.setCreationDate(new GregorianCalendar()); @@ -1468,7 +1517,7 @@ public class ZUGFeRDExporter implements Closeable { // now add the entry to the embedded file tree and set in the document. PDDocumentNameDictionary names = new PDDocumentNameDictionary( - doc.getDocumentCatalog()); + doc1.getDocumentCatalog()); PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles(); if (efTree == null) { efTree = new PDEmbeddedFilesNameTreeNode(); @@ -1486,20 +1535,20 @@ public class ZUGFeRDExporter implements Closeable { efTree.setNames(namesMap); names.setEmbeddedFiles(efTree); - doc.getDocumentCatalog().setNames(names); + doc1.getDocumentCatalog().setNames(names); // AF entry (Array) in catalog with the FileSpec - COSArray cosArray = (COSArray) doc.getDocumentCatalog() + COSArray cosArray = (COSArray) doc1.getDocumentCatalog() .getCOSObject().getItem("AF"); if (cosArray == null) { cosArray = new COSArray(); } cosArray.add(fs); - COSDictionary dict2 = doc.getDocumentCatalog().getCOSObject(); + COSDictionary dict2 = doc1.getDocumentCatalog().getCOSObject(); COSArray array = new COSArray(); array.add(fs.getCOSObject()); // see below dict2.setItem("AF",array); - doc.getDocumentCatalog().getCOSObject().setItem("AF", cosArray); + doc1.getDocumentCatalog().getCOSObject().setItem("AF", cosArray); } /** @@ -1532,7 +1581,7 @@ public class ZUGFeRDExporter implements Closeable { * * @param zUGFeRDConformanceLevel * the new conformance level - * + * * @deprecated Use {@link #setConformanceLevel(PDFAConformanceLevel)} instead */ @Deprecated @@ -1555,14 +1604,14 @@ public class ZUGFeRDExporter implements Closeable { metadata.addSchema(zf); XMPSchemaPDFAExtensions pdfaex = new XMPSchemaPDFAExtensions(metadata); - + metadata.addSchema(pdfaex); } /**** * Returns the PDFBox PDF Document - * + * * @return PDDocument */ public PDDocument getDoc() { diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java index 9eb39d7d..aed4bfd6 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA1Factory.java @@ -9,6 +9,7 @@ import org.apache.pdfbox.preflight.PreflightDocument; import org.apache.pdfbox.preflight.exception.ValidationException; import org.apache.pdfbox.preflight.parser.PreflightParser; import org.apache.pdfbox.preflight.utils.ByteArrayDataSource; +import org.apache.pdfbox.util.Version; import org.apache.xmpbox.XMPMetadata; import org.apache.xmpbox.schema.AdobePDFSchema; import org.apache.xmpbox.schema.DublinCoreSchema; @@ -45,9 +46,13 @@ public class ZUGFeRDExporterFromA1Factory { public ZUGFeRDExporter loadFromPDFA1(String pdfFilename) throws IOException { ensurePDFIsValidA1(new FileDataSource(pdfFilename)); - PDDocument doc = PDDocument.load(new File(pdfFilename)); - makePDFA3compliant(doc); - return new ZUGFeRDExporter(doc); + ZUGFeRDExporter zugFeRDExporter = null; + try(PDDocument doc = PDDocument.load(new File(pdfFilename))) { + makePDFA3compliant(doc); + zugFeRDExporter = new ZUGFeRDExporter(doc); + } + + return zugFeRDExporter; } /** @@ -56,12 +61,16 @@ public class ZUGFeRDExporterFromA1Factory { * * @param pdfBinary binary of a PDF/A1 compliant document */ - public ZUGFeRDExporter loadFromPDFA1(byte[] pdfBinary) throws IOException, TransformerException { + public ZUGFeRDExporter loadFromPDFA1(byte[] pdfBinary) throws IOException { ensurePDFIsValidA1(new ByteArrayDataSource(new ByteArrayInputStream(pdfBinary))); - PDDocument doc = PDDocument.load(pdfBinary); - makePDFA3compliant(doc); - return new ZUGFeRDExporter(doc); + ZUGFeRDExporter zugFeRDExporter; + try (PDDocument doc = PDDocument.load(pdfBinary)) { + makePDFA3compliant(doc); + zugFeRDExporter = new ZUGFeRDExporter(doc); + } + + return zugFeRDExporter; } /** @@ -70,7 +79,7 @@ public class ZUGFeRDExporterFromA1Factory { * * @param pdfSource source to read a PDF/A1 compliant document from */ - public ZUGFeRDExporter loadFromPDFA1(InputStream pdfSource) throws IOException, TransformerException { + public ZUGFeRDExporter loadFromPDFA1(InputStream pdfSource) throws IOException { return loadFromPDFA1(readAllBytes(pdfSource)); } @@ -87,7 +96,7 @@ public class ZUGFeRDExporterFromA1Factory { } private void makePDFA3compliant(PDDocument doc) throws IOException { - String fullProducer = producer + " (via mustangproject.org " + Version.VERSION + ")"; + String fullProducer = producer + " (via mustangproject.org " + Version.getVersion() + ")"; PDDocumentCatalog cat = doc.getDocumentCatalog(); PDMetadata metadata = new PDMetadata(doc); @@ -198,23 +207,22 @@ public class ZUGFeRDExporterFromA1Factory { } private static boolean getA1ParserValidationResult(PreflightParser parser) throws IOException { - PreflightDocument document = null; - try { + /* + * 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(); - /* - * 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(); + try ( PreflightDocument document = parser.getPreflightDocument()) { /* * 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. */ - document = parser.getPreflightDocument(); + document.validate(); // Get validation result @@ -226,10 +234,6 @@ public class ZUGFeRDExporterFromA1Factory { * instance of ValidationResult */ return false; - } finally { - if (document != null) { - document.close(); - } } } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java index 142302e9..9cd76f84 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDImporter.java @@ -8,14 +8,13 @@ package org.mustangproject.ZUGFeRD; * @author jstaerk * */ +import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.BufferedInputStream; -import java.io.FileInputStream; import java.util.Map; -import javax.management.RuntimeErrorException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; @@ -23,7 +22,6 @@ import javax.xml.parsers.ParserConfigurationException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary; import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode; -import org.apache.pdfbox.pdmodel.common.COSObjectable; import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification; import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile; import org.w3c.dom.Document; @@ -62,13 +60,10 @@ public class ZUGFeRDImporter { * Extracts a ZUGFeRD invoice from a PDF document represented by a file name. * Errors are just logged to STDOUT. */ - public void extract(String pdfFilename) - { - try - { - extractLowLevel(new BufferedInputStream(new FileInputStream(pdfFilename))); - } catch (IOException ioe) - { + public void extract(String pdfFilename) { + try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pdfFilename))) { + extractLowLevel(bis); + } catch (IOException ioe) { ioe.printStackTrace(); } } @@ -78,18 +73,15 @@ public class ZUGFeRDImporter { * Errors are reported via exception handling. */ public void extractLowLevel(InputStream pdfStream) throws IOException { - PDDocument doc = null; - try { - doc = PDDocument.load(pdfStream); + PDEmbeddedFilesNameTreeNode etn; + try (PDDocument doc = PDDocument.load(pdfStream)) { // PDDocumentInformation info = doc.getDocumentInformation(); - PDDocumentNameDictionary names = new PDDocumentNameDictionary( - doc.getDocumentCatalog()); - PDEmbeddedFilesNameTreeNode etn; + PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog()); etn = names.getEmbeddedFiles(); - if (etn==null) { - doc.close(); + if (etn == null) { return; } + Map efMap = etn.getNames(); // String filePath = "/tmp/"; for (String filename : efMap.keySet()) { @@ -100,8 +92,7 @@ public class ZUGFeRDImporter { if (filename.equals("ZUGFeRD-invoice.xml")) { //$NON-NLS-1$ containsMeta = true; - PDComplexFileSpecification fileSpec = (PDComplexFileSpecification) efMap - .get(filename); + PDComplexFileSpecification fileSpec = efMap.get(filename); PDEmbeddedFile embeddedFile = fileSpec.getEmbeddedFile(); // String embeddedFilename = filePath + filename; // File file = new File(filePath + filename); @@ -109,7 +100,7 @@ public class ZUGFeRDImporter { // ByteArrayOutputStream fileBytes=new // ByteArrayOutputStream(); // FileOutputStream fos = new FileOutputStream(file); - + rawXML = embeddedFile.toByteArray(); setMeta(new String(rawXML)); extracted=true; @@ -117,18 +108,7 @@ public class ZUGFeRDImporter { // fos.close(); } } - - } catch (IOException e1) { - throw e1; } - finally { - try { - if(doc!=null) { - doc.close(); - } - } catch (IOException e) {} - } - } public void parse() { @@ -421,9 +401,9 @@ public class ZUGFeRDImporter { public String getMeta() { if (rawXML==null){ return null; - } else { - return new String(rawXML); } + + return new String(rawXML); } diff --git a/src/main/java/org/mustangproject/ZUGFeRD/model/ObjectFactory.java b/src/main/java/org/mustangproject/ZUGFeRD/model/ObjectFactory.java index bc159efe..520a790d 100644 --- a/src/main/java/org/mustangproject/ZUGFeRD/model/ObjectFactory.java +++ b/src/main/java/org/mustangproject/ZUGFeRD/model/ObjectFactory.java @@ -1,8 +1,8 @@ // -// Diese Datei wurde mit der JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 generiert -// Siehe http://java.sun.com/xml/jaxb -// �nderungen an dieser Datei gehen bei einer Neukompilierung des Quellschemas verloren. -// Generiert: 2015.10.16 um 06:16:03 PM CEST +// Diese Datei wurde mit der JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11 generiert +// Siehe http://java.sun.com/xml/jaxb +// �nderungen an dieser Datei gehen bei einer Neukompilierung des Quellschemas verloren. +// Generiert: 2015.10.16 um 06:16:03 PM CEST // @@ -11,23 +11,22 @@ package org.mustangproject.ZUGFeRD.model; import javax.xml.bind.JAXBElement; import javax.xml.bind.annotation.XmlElementDecl; import javax.xml.bind.annotation.XmlRegistry; -import javax.xml.bind.annotation.XmlRootElement; import javax.xml.namespace.QName; /** - * This object contains factory methods for each - * Java content interface and Java element interface - * generated in the org.mustangproject.ZUGFeRD.model package. - *

An ObjectFactory allows you to programatically - * construct new instances of the Java representation - * for XML content. The Java representation of XML - * content can consist of schema derived interfaces - * and classes representing the binding of schema - * type definitions, element declarations and model - * groups. Factory methods for each of these are + * This object contains factory methods for each + * Java content interface and Java element interface + * generated in the org.mustangproject.ZUGFeRD.model package. + *

An ObjectFactory allows you to programatically + * construct new instances of the Java representation + * for XML content. The Java representation of XML + * content can consist of schema derived interfaces + * and classes representing the binding of schema + * type definitions, element declarations and model + * groups. Factory methods for each of these are * provided in this class. - * + * */ @XmlRegistry public class ObjectFactory { @@ -36,14 +35,14 @@ public class ObjectFactory { /** * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: org.mustangproject.ZUGFeRD.model - * + * */ public ObjectFactory() { } /** * Create an instance of {@link DateTimeType } - * + * */ public DateTimeType createDateTimeType() { return new DateTimeType(); @@ -51,7 +50,7 @@ public class ObjectFactory { /** * Create an instance of {@link CrossIndustryDocumentType } - * + * */ public CrossIndustryDocumentType createCrossIndustryDocumentType() { return new CrossIndustryDocumentType(); @@ -59,7 +58,7 @@ public class ObjectFactory { /** * Create an instance of {@link AllowanceChargeReasonCodeType } - * + * */ public AllowanceChargeReasonCodeType createAllowanceChargeReasonCodeType() { return new AllowanceChargeReasonCodeType(); @@ -67,7 +66,7 @@ public class ObjectFactory { /** * Create an instance of {@link CountryIDType } - * + * */ public CountryIDType createCountryIDType() { return new CountryIDType(); @@ -75,7 +74,7 @@ public class ObjectFactory { /** * Create an instance of {@link DeliveryTermsCodeType } - * + * */ public DeliveryTermsCodeType createDeliveryTermsCodeType() { return new DeliveryTermsCodeType(); @@ -83,7 +82,7 @@ public class ObjectFactory { /** * Create an instance of {@link DocumentCodeType } - * + * */ public DocumentCodeType createDocumentCodeType() { return new DocumentCodeType(); @@ -91,7 +90,7 @@ public class ObjectFactory { /** * Create an instance of {@link PaymentMeansCodeType } - * + * */ public PaymentMeansCodeType createPaymentMeansCodeType() { return new PaymentMeansCodeType(); @@ -99,7 +98,7 @@ public class ObjectFactory { /** * Create an instance of {@link ReferenceCodeType } - * + * */ public ReferenceCodeType createReferenceCodeType() { return new ReferenceCodeType(); @@ -107,7 +106,7 @@ public class ObjectFactory { /** * Create an instance of {@link TaxCategoryCodeType } - * + * */ public TaxCategoryCodeType createTaxCategoryCodeType() { return new TaxCategoryCodeType(); @@ -115,7 +114,7 @@ public class ObjectFactory { /** * Create an instance of {@link TaxTypeCodeType } - * + * */ public TaxTypeCodeType createTaxTypeCodeType() { return new TaxTypeCodeType(); @@ -123,7 +122,7 @@ public class ObjectFactory { /** * Create an instance of {@link AmountType } - * + * */ public AmountType createAmountType() { return new AmountType(); @@ -131,7 +130,7 @@ public class ObjectFactory { /** * Create an instance of {@link CodeType } - * + * */ public CodeType createCodeType() { return new CodeType(); @@ -139,7 +138,7 @@ public class ObjectFactory { /** * Create an instance of {@link IDType } - * + * */ public IDType createIDType() { return new IDType(); @@ -147,7 +146,7 @@ public class ObjectFactory { /** * Create an instance of {@link IndicatorType } - * + * */ public IndicatorType createIndicatorType() { return new IndicatorType(); @@ -155,7 +154,7 @@ public class ObjectFactory { /** * Create an instance of {@link MeasureType } - * + * */ public MeasureType createMeasureType() { return new MeasureType(); @@ -163,7 +162,7 @@ public class ObjectFactory { /** * Create an instance of {@link NumericType } - * + * */ public NumericType createNumericType() { return new NumericType(); @@ -171,7 +170,7 @@ public class ObjectFactory { /** * Create an instance of {@link PercentType } - * + * */ public PercentType createPercentType() { return new PercentType(); @@ -179,7 +178,7 @@ public class ObjectFactory { /** * Create an instance of {@link QuantityType } - * + * */ public QuantityType createQuantityType() { return new QuantityType(); @@ -187,7 +186,7 @@ public class ObjectFactory { /** * Create an instance of {@link TextType } - * + * */ public TextType createTextType() { return new TextType(); @@ -195,7 +194,7 @@ public class ObjectFactory { /** * Create an instance of {@link CreditorFinancialAccountType } - * + * */ public CreditorFinancialAccountType createCreditorFinancialAccountType() { return new CreditorFinancialAccountType(); @@ -203,7 +202,7 @@ public class ObjectFactory { /** * Create an instance of {@link CreditorFinancialInstitutionType } - * + * */ public CreditorFinancialInstitutionType createCreditorFinancialInstitutionType() { return new CreditorFinancialInstitutionType(); @@ -211,7 +210,7 @@ public class ObjectFactory { /** * Create an instance of {@link DebtorFinancialAccountType } - * + * */ public DebtorFinancialAccountType createDebtorFinancialAccountType() { return new DebtorFinancialAccountType(); @@ -219,7 +218,7 @@ public class ObjectFactory { /** * Create an instance of {@link DebtorFinancialInstitutionType } - * + * */ public DebtorFinancialInstitutionType createDebtorFinancialInstitutionType() { return new DebtorFinancialInstitutionType(); @@ -227,7 +226,7 @@ public class ObjectFactory { /** * Create an instance of {@link DocumentContextParameterType } - * + * */ public DocumentContextParameterType createDocumentContextParameterType() { return new DocumentContextParameterType(); @@ -235,7 +234,7 @@ public class ObjectFactory { /** * Create an instance of {@link DocumentLineDocumentType } - * + * */ public DocumentLineDocumentType createDocumentLineDocumentType() { return new DocumentLineDocumentType(); @@ -243,7 +242,7 @@ public class ObjectFactory { /** * Create an instance of {@link ExchangedDocumentContextType } - * + * */ public ExchangedDocumentContextType createExchangedDocumentContextType() { return new ExchangedDocumentContextType(); @@ -251,7 +250,7 @@ public class ObjectFactory { /** * Create an instance of {@link ExchangedDocumentType } - * + * */ public ExchangedDocumentType createExchangedDocumentType() { return new ExchangedDocumentType(); @@ -259,7 +258,7 @@ public class ObjectFactory { /** * Create an instance of {@link LogisticsServiceChargeType } - * + * */ public LogisticsServiceChargeType createLogisticsServiceChargeType() { return new LogisticsServiceChargeType(); @@ -267,7 +266,7 @@ public class ObjectFactory { /** * Create an instance of {@link LogisticsTransportMovementType } - * + * */ public LogisticsTransportMovementType createLogisticsTransportMovementType() { return new LogisticsTransportMovementType(); @@ -275,7 +274,7 @@ public class ObjectFactory { /** * Create an instance of {@link NoteType } - * + * */ public NoteType createNoteType() { return new NoteType(); @@ -283,7 +282,7 @@ public class ObjectFactory { /** * Create an instance of {@link ProductCharacteristicType } - * + * */ public ProductCharacteristicType createProductCharacteristicType() { return new ProductCharacteristicType(); @@ -291,7 +290,7 @@ public class ObjectFactory { /** * Create an instance of {@link ProductClassificationType } - * + * */ public ProductClassificationType createProductClassificationType() { return new ProductClassificationType(); @@ -299,7 +298,7 @@ public class ObjectFactory { /** * Create an instance of {@link ReferencedDocumentType } - * + * */ public ReferencedDocumentType createReferencedDocumentType() { return new ReferencedDocumentType(); @@ -307,7 +306,7 @@ public class ObjectFactory { /** * Create an instance of {@link ReferencedProductType } - * + * */ public ReferencedProductType createReferencedProductType() { return new ReferencedProductType(); @@ -315,7 +314,7 @@ public class ObjectFactory { /** * Create an instance of {@link SpecifiedPeriodType } - * + * */ public SpecifiedPeriodType createSpecifiedPeriodType() { return new SpecifiedPeriodType(); @@ -323,7 +322,7 @@ public class ObjectFactory { /** * Create an instance of {@link SupplyChainConsignmentType } - * + * */ public SupplyChainConsignmentType createSupplyChainConsignmentType() { return new SupplyChainConsignmentType(); @@ -331,7 +330,7 @@ public class ObjectFactory { /** * Create an instance of {@link SupplyChainEventType } - * + * */ public SupplyChainEventType createSupplyChainEventType() { return new SupplyChainEventType(); @@ -339,7 +338,7 @@ public class ObjectFactory { /** * Create an instance of {@link SupplyChainTradeAgreementType } - * + * */ public SupplyChainTradeAgreementType createSupplyChainTradeAgreementType() { return new SupplyChainTradeAgreementType(); @@ -347,7 +346,7 @@ public class ObjectFactory { /** * Create an instance of {@link SupplyChainTradeDeliveryType } - * + * */ public SupplyChainTradeDeliveryType createSupplyChainTradeDeliveryType() { return new SupplyChainTradeDeliveryType(); @@ -355,7 +354,7 @@ public class ObjectFactory { /** * Create an instance of {@link SupplyChainTradeLineItemType } - * + * */ public SupplyChainTradeLineItemType createSupplyChainTradeLineItemType() { return new SupplyChainTradeLineItemType(); @@ -363,7 +362,7 @@ public class ObjectFactory { /** * Create an instance of {@link SupplyChainTradeSettlementType } - * + * */ public SupplyChainTradeSettlementType createSupplyChainTradeSettlementType() { return new SupplyChainTradeSettlementType(); @@ -371,7 +370,7 @@ public class ObjectFactory { /** * Create an instance of {@link SupplyChainTradeTransactionType } - * + * */ public SupplyChainTradeTransactionType createSupplyChainTradeTransactionType() { return new SupplyChainTradeTransactionType(); @@ -379,7 +378,7 @@ public class ObjectFactory { /** * Create an instance of {@link TaxRegistrationType } - * + * */ public TaxRegistrationType createTaxRegistrationType() { return new TaxRegistrationType(); @@ -387,7 +386,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeAccountingAccountType } - * + * */ public TradeAccountingAccountType createTradeAccountingAccountType() { return new TradeAccountingAccountType(); @@ -395,7 +394,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeAddressType } - * + * */ public TradeAddressType createTradeAddressType() { return new TradeAddressType(); @@ -403,7 +402,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeAllowanceChargeType } - * + * */ public TradeAllowanceChargeType createTradeAllowanceChargeType() { return new TradeAllowanceChargeType(); @@ -411,7 +410,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeContactType } - * + * */ public TradeContactType createTradeContactType() { return new TradeContactType(); @@ -419,7 +418,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeCountryType } - * + * */ public TradeCountryType createTradeCountryType() { return new TradeCountryType(); @@ -427,7 +426,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeDeliveryTermsType } - * + * */ public TradeDeliveryTermsType createTradeDeliveryTermsType() { return new TradeDeliveryTermsType(); @@ -435,7 +434,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradePartyType } - * + * */ public TradePartyType createTradePartyType() { return new TradePartyType(); @@ -443,7 +442,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradePaymentDiscountTermsType } - * + * */ public TradePaymentDiscountTermsType createTradePaymentDiscountTermsType() { return new TradePaymentDiscountTermsType(); @@ -451,7 +450,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradePaymentPenaltyTermsType } - * + * */ public TradePaymentPenaltyTermsType createTradePaymentPenaltyTermsType() { return new TradePaymentPenaltyTermsType(); @@ -459,7 +458,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradePaymentTermsType } - * + * */ public TradePaymentTermsType createTradePaymentTermsType() { return new TradePaymentTermsType(); @@ -467,7 +466,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradePriceType } - * + * */ public TradePriceType createTradePriceType() { return new TradePriceType(); @@ -475,7 +474,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeProductType } - * + * */ public TradeProductType createTradeProductType() { return new TradeProductType(); @@ -483,7 +482,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeSettlementMonetarySummationType } - * + * */ public TradeSettlementMonetarySummationType createTradeSettlementMonetarySummationType() { return new TradeSettlementMonetarySummationType(); @@ -491,7 +490,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeSettlementPaymentMeansType } - * + * */ public TradeSettlementPaymentMeansType createTradeSettlementPaymentMeansType() { return new TradeSettlementPaymentMeansType(); @@ -499,7 +498,7 @@ public class ObjectFactory { /** * Create an instance of {@link TradeTaxType } - * + * */ public TradeTaxType createTradeTaxType() { return new TradeTaxType(); @@ -507,7 +506,7 @@ public class ObjectFactory { /** * Create an instance of {@link UniversalCommunicationType } - * + * */ public UniversalCommunicationType createUniversalCommunicationType() { return new UniversalCommunicationType(); @@ -515,7 +514,7 @@ public class ObjectFactory { /** * Create an instance of {@link DateTimeType.DateTimeString } - * + * */ public DateTimeType.DateTimeString createDateTimeTypeDateTimeString() { return new DateTimeType.DateTimeString(); @@ -523,7 +522,7 @@ public class ObjectFactory { /** * Create an instance of {@link JAXBElement }{@code <}{@link CrossIndustryDocumentType }{@code >}} - * + * */ @XmlElementDecl(namespace = "urn:ferd:CrossIndustryDocument:invoice:1p0", name = "CrossIndustryDocument") public JAXBElement createCrossIndustryDocument(CrossIndustryDocumentType value) { diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java index 8a12c9a0..c42a00cf 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterEdgeTest.java @@ -401,27 +401,18 @@ public class MustangReaderWriterEdgeTest extends TestCase implements IZUGFeRDExp public void testZExport() { - final InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf"); - final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505newEdge.pdf"; - // the writing part + final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505newEdge.pdf"; - try - { - // automatically add Zugferd to all outgoing invoices - ZUGFeRDExporter ze = new ZUGFeRDExporter(); - ze.PDFmakeA3compliant(SOURCE_PDF, "My Application", System.getProperty("user.name"), true); - ze.PDFattachZugferdFile(this); - ze.export(TARGET_PDF); + // the writing part + // automatically add Zugferd to all outgoing invoices + try (ZUGFeRDExporter ze = new ZUGFeRDExporter()) { + try(final InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf")){ + ze.PDFmakeA3compliant(SOURCE_PDF, "My Application", System.getProperty("user.name"), true); + } + ze.PDFattachZugferdFile(this); + ze.export(TARGET_PDF); } - catch (IOException e) - { - e.printStackTrace(); - } - catch (TransformerException e) - { - e.printStackTrace(); - } - catch (Exception e) + catch (Exception e) { e.printStackTrace(); } diff --git a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java index 7f371f75..ce5e6122 100644 --- a/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java +++ b/src/test/java/org/mustangproject/ZUGFeRD/MustangReaderWriterTest.java @@ -10,14 +10,13 @@ import java.util.GregorianCalendar; import javax.xml.transform.TransformerException; +import org.junit.FixMethodOrder; +import org.junit.runners.MethodSorters; + import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.junit.FixMethodOrder; -import org.junit.runners.MethodSorters; - @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExportableTransaction { @@ -326,7 +325,7 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta public void setVATPercent(BigDecimal VATPercent) { - VATPercent = VATPercent; + this.VATPercent = VATPercent; } } @@ -363,8 +362,10 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta public void testAImport() throws IOException { ZUGFeRDImporter zi = new ZUGFeRDImporter(); - InputStream inputStream = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf"); - zi.extractLowLevel(inputStream); + try (InputStream inputStream = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf")) { + zi.extractLowLevel(inputStream); + } + // Reading ZUGFeRD String amount = null; @@ -400,27 +401,19 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta */ public void testZExport() { - final InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf"); - final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505new.pdf"; + + final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505new.pdf"; // the writing part - try - { - // automatically add Zugferd to all outgoing invoices - ZUGFeRDExporter ze = new ZUGFeRDExporter(); - ze.PDFmakeA3compliant(SOURCE_PDF, "My Application", System.getProperty("user.name"), true); - ze.PDFattachZugferdFile(this); - ze.export(TARGET_PDF); + // automatically add Zugferd to all outgoing invoices + try (ZUGFeRDExporter ze = new ZUGFeRDExporter()) { + try (final InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf")) { + ze.PDFmakeA3compliant(SOURCE_PDF, "My Application", System.getProperty("user.name"), true); + } + ze.PDFattachZugferdFile(this); + ze.export(TARGET_PDF); } - catch (IOException e) - { - e.printStackTrace(); - } - catch (TransformerException e) - { - e.printStackTrace(); - } - catch (Exception e) + catch (Exception e) { e.printStackTrace(); }