close resource leaks and use tryWithResource
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -5,3 +5,4 @@ PDFA*.pdf
|
|||||||
target/
|
target/
|
||||||
pom.xml.*
|
pom.xml.*
|
||||||
bin/
|
bin/
|
||||||
|
/.gradle/
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
package org.mustangproject.ZUGFeRD;
|
package org.mustangproject.ZUGFeRD;
|
||||||
|
|
||||||
public class ZUGFeRDExportException extends RuntimeException {
|
public class ZUGFeRDExportException extends RuntimeException {
|
||||||
public ZUGFeRDExportException() {
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public ZUGFeRDExportException() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public ZUGFeRDExportException(String message) {
|
public ZUGFeRDExportException(String message) {
|
||||||
|
|||||||
@@ -28,19 +28,12 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.activation.FileDataSource;
|
|
||||||
import javax.xml.bind.JAXBContext;
|
import javax.xml.bind.JAXBContext;
|
||||||
import javax.xml.bind.JAXBElement;
|
import javax.xml.bind.JAXBElement;
|
||||||
import javax.xml.bind.JAXBException;
|
import javax.xml.bind.JAXBException;
|
||||||
import javax.xml.bind.Marshaller;
|
import javax.xml.bind.Marshaller;
|
||||||
import javax.xml.transform.TransformerException;
|
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.COSArray;
|
||||||
import org.apache.pdfbox.cos.COSBase;
|
import org.apache.pdfbox.cos.COSBase;
|
||||||
import org.apache.pdfbox.cos.COSDictionary;
|
import org.apache.pdfbox.cos.COSDictionary;
|
||||||
@@ -58,9 +51,53 @@ import org.apache.pdfbox.preflight.ValidationResult;
|
|||||||
import org.apache.pdfbox.preflight.exception.ValidationException;
|
import org.apache.pdfbox.preflight.exception.ValidationException;
|
||||||
import org.apache.pdfbox.preflight.parser.PreflightParser;
|
import org.apache.pdfbox.preflight.parser.PreflightParser;
|
||||||
import org.apache.pdfbox.preflight.utils.ByteArrayDataSource;
|
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.type.BadFieldValueException;
|
||||||
import org.apache.xmpbox.xml.XmpSerializer;
|
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 {
|
public class ZUGFeRDExporter implements Closeable {
|
||||||
|
|
||||||
@@ -384,13 +421,12 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
* PreflightDocument (that inherits from PDDocument) This document
|
* PreflightDocument (that inherits from PDDocument) This document
|
||||||
* process the end of PDF/A validation.
|
* process the end of PDF/A validation.
|
||||||
*/
|
*/
|
||||||
PreflightDocument document = parser.getPreflightDocument();
|
try (PreflightDocument document = parser.getPreflightDocument()) {
|
||||||
document.validate();
|
document.validate();
|
||||||
|
|
||||||
// Get validation result
|
|
||||||
result = document.getResult();
|
|
||||||
document.close();
|
|
||||||
|
|
||||||
|
// Get validation result
|
||||||
|
result = document.getResult();
|
||||||
|
}
|
||||||
} catch (ValidationException e) {
|
} catch (ValidationException e) {
|
||||||
/*
|
/*
|
||||||
* the parse method can throw a SyntaxValidationException if the PDF
|
* 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
|
* 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)
|
* 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,
|
public PDDocumentCatalog PDFmakeA3compliant(String filename, String producer, String creator, boolean attachZugferdHeaders)
|
||||||
String producer, String creator, boolean attachZugferdHeaders)
|
|
||||||
throws IOException, TransformerException {
|
throws IOException, TransformerException {
|
||||||
|
|
||||||
if (!ignoreA1Errors && !isValidA1(new FileInputStream(filename))) {
|
try (FileInputStream fis = new FileInputStream(filename)) {
|
||||||
throw new IOException("File is not a valid PDF/A-1 input file");
|
boolean validA1 = isValidA1(fis);
|
||||||
|
if (!ignoreA1Errors && !validA1) {
|
||||||
|
throw new IOException("File is not a valid PDF/A-1 input file");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
loadPDFA3(filename);
|
loadPDFA3(filename);
|
||||||
|
|
||||||
return makeDocPDFA3compliant(producer, creator, attachZugferdHeaders);
|
return makeDocPDFA3compliant(producer, creator, attachZugferdHeaders);
|
||||||
@@ -452,10 +498,12 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
baos.write(buf, 0, n);
|
baos.write(buf, 0, n);
|
||||||
byte[] content = baos.toByteArray();
|
byte[] content = baos.toByteArray();
|
||||||
|
|
||||||
InputStream is1 = new ByteArrayInputStream(content);
|
try (InputStream is1 = new ByteArrayInputStream(content)) {
|
||||||
if (!ignoreA1Errors && !isValidA1(is1)) {
|
if (!ignoreA1Errors && !isValidA1(is1)) {
|
||||||
throw new IOException("File is not a valid PDF/A-1 input file");
|
throw new IOException("File is not a valid PDF/A-1 input file");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
InputStream is2 = new ByteArrayInputStream(content);
|
InputStream is2 = new ByteArrayInputStream(content);
|
||||||
loadPDFA3(is2);
|
loadPDFA3(is2);
|
||||||
|
|
||||||
@@ -465,7 +513,7 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
String creator, boolean attachZugferdHeaders) throws IOException,
|
String creator, boolean attachZugferdHeaders) throws IOException,
|
||||||
TransformerException {
|
TransformerException {
|
||||||
String fullProducer = producer + " (via mustangproject.org "
|
String fullProducer = producer + " (via mustangproject.org "
|
||||||
+ Version.VERSION + ")";
|
+ Version.getVersion() + ")";
|
||||||
|
|
||||||
PDDocumentCatalog cat = doc.getDocumentCatalog();
|
PDDocumentCatalog cat = doc.getDocumentCatalog();
|
||||||
PDMetadata metadata = new PDMetadata(doc);
|
PDMetadata metadata = new PDMetadata(doc);
|
||||||
@@ -534,6 +582,7 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
return cat;
|
return cat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
if (doc != null) {
|
if (doc != null) {
|
||||||
doc.close();
|
doc.close();
|
||||||
@@ -548,10 +597,10 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
|
|
||||||
private Totals totals;
|
private Totals totals;
|
||||||
|
|
||||||
private String createZugferdXMLForTransaction(IZUGFeRDExportableTransaction trans) {
|
private String createZugferdXMLForTransaction(IZUGFeRDExportableTransaction trans1) {
|
||||||
this.trans = trans;
|
this.trans = trans1;
|
||||||
this.totals = new Totals();
|
this.totals = new Totals();
|
||||||
currency = trans.getCurrency();
|
currency = trans1.getCurrency();
|
||||||
|
|
||||||
CrossIndustryDocumentType invoice = xmlFactory
|
CrossIndustryDocumentType invoice = xmlFactory
|
||||||
.createCrossIndustryDocumentType();
|
.createCrossIndustryDocumentType();
|
||||||
@@ -1385,7 +1434,7 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
* data should hav ebeen set via
|
* data should hav ebeen set via
|
||||||
* <code>setZUGFeRDXMLData(byte[] zugferdData)</code>
|
* <code>setZUGFeRDXMLData(byte[] zugferdData)</code>
|
||||||
*/
|
*/
|
||||||
public void PDFattachZugferdFile(IZUGFeRDExportableTransaction trans)
|
public void PDFattachZugferdFile(IZUGFeRDExportableTransaction trans1)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
if (zugferdData == null) // XML ZUGFeRD data not set externally, needs
|
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
|
// create a dummy file stream, this would probably normally be a
|
||||||
// FileInputStream
|
// FileInputStream
|
||||||
|
|
||||||
byte[] zugferdRaw = createZugferdXMLForTransaction(trans).getBytes(); //$NON-NLS-1$
|
byte[] zugferdRaw = createZugferdXMLForTransaction(trans1).getBytes(); //$NON-NLS-1$
|
||||||
|
|
||||||
if ((zugferdRaw[0] == (byte) 0xEF)
|
if ((zugferdRaw[0] == (byte) 0xEF)
|
||||||
&& (zugferdRaw[1] == (byte) 0xBB)
|
&& (zugferdRaw[1] == (byte) 0xBB)
|
||||||
@@ -1437,7 +1486,7 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
* the binary data of the file/attachment
|
* the binary data of the file/attachment
|
||||||
* @throws java.io.IOException
|
* @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)
|
String relationship, String description, String subType, byte[] data)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
PDComplexFileSpecification fs = new PDComplexFileSpecification();
|
PDComplexFileSpecification fs = new PDComplexFileSpecification();
|
||||||
@@ -1450,7 +1499,7 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
dict.setString("Desc", description);
|
dict.setString("Desc", description);
|
||||||
|
|
||||||
ByteArrayInputStream fakeFile = new ByteArrayInputStream(data);
|
ByteArrayInputStream fakeFile = new ByteArrayInputStream(data);
|
||||||
PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile);
|
PDEmbeddedFile ef = new PDEmbeddedFile(doc1, fakeFile);
|
||||||
ef.setSubtype(subType);
|
ef.setSubtype(subType);
|
||||||
ef.setSize(data.length);
|
ef.setSize(data.length);
|
||||||
ef.setCreationDate(new GregorianCalendar());
|
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.
|
// now add the entry to the embedded file tree and set in the document.
|
||||||
PDDocumentNameDictionary names = new PDDocumentNameDictionary(
|
PDDocumentNameDictionary names = new PDDocumentNameDictionary(
|
||||||
doc.getDocumentCatalog());
|
doc1.getDocumentCatalog());
|
||||||
PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles();
|
PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles();
|
||||||
if (efTree == null) {
|
if (efTree == null) {
|
||||||
efTree = new PDEmbeddedFilesNameTreeNode();
|
efTree = new PDEmbeddedFilesNameTreeNode();
|
||||||
@@ -1486,20 +1535,20 @@ public class ZUGFeRDExporter implements Closeable {
|
|||||||
efTree.setNames(namesMap);
|
efTree.setNames(namesMap);
|
||||||
|
|
||||||
names.setEmbeddedFiles(efTree);
|
names.setEmbeddedFiles(efTree);
|
||||||
doc.getDocumentCatalog().setNames(names);
|
doc1.getDocumentCatalog().setNames(names);
|
||||||
|
|
||||||
// AF entry (Array) in catalog with the FileSpec
|
// AF entry (Array) in catalog with the FileSpec
|
||||||
COSArray cosArray = (COSArray) doc.getDocumentCatalog()
|
COSArray cosArray = (COSArray) doc1.getDocumentCatalog()
|
||||||
.getCOSObject().getItem("AF");
|
.getCOSObject().getItem("AF");
|
||||||
if (cosArray == null) {
|
if (cosArray == null) {
|
||||||
cosArray = new COSArray();
|
cosArray = new COSArray();
|
||||||
}
|
}
|
||||||
cosArray.add(fs);
|
cosArray.add(fs);
|
||||||
COSDictionary dict2 = doc.getDocumentCatalog().getCOSObject();
|
COSDictionary dict2 = doc1.getDocumentCatalog().getCOSObject();
|
||||||
COSArray array = new COSArray();
|
COSArray array = new COSArray();
|
||||||
array.add(fs.getCOSObject()); // see below
|
array.add(fs.getCOSObject()); // see below
|
||||||
dict2.setItem("AF",array);
|
dict2.setItem("AF",array);
|
||||||
doc.getDocumentCatalog().getCOSObject().setItem("AF", cosArray);
|
doc1.getDocumentCatalog().getCOSObject().setItem("AF", cosArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.apache.pdfbox.preflight.PreflightDocument;
|
|||||||
import org.apache.pdfbox.preflight.exception.ValidationException;
|
import org.apache.pdfbox.preflight.exception.ValidationException;
|
||||||
import org.apache.pdfbox.preflight.parser.PreflightParser;
|
import org.apache.pdfbox.preflight.parser.PreflightParser;
|
||||||
import org.apache.pdfbox.preflight.utils.ByteArrayDataSource;
|
import org.apache.pdfbox.preflight.utils.ByteArrayDataSource;
|
||||||
|
import org.apache.pdfbox.util.Version;
|
||||||
import org.apache.xmpbox.XMPMetadata;
|
import org.apache.xmpbox.XMPMetadata;
|
||||||
import org.apache.xmpbox.schema.AdobePDFSchema;
|
import org.apache.xmpbox.schema.AdobePDFSchema;
|
||||||
import org.apache.xmpbox.schema.DublinCoreSchema;
|
import org.apache.xmpbox.schema.DublinCoreSchema;
|
||||||
@@ -45,9 +46,13 @@ public class ZUGFeRDExporterFromA1Factory {
|
|||||||
public ZUGFeRDExporter loadFromPDFA1(String pdfFilename) throws IOException {
|
public ZUGFeRDExporter loadFromPDFA1(String pdfFilename) throws IOException {
|
||||||
ensurePDFIsValidA1(new FileDataSource(pdfFilename));
|
ensurePDFIsValidA1(new FileDataSource(pdfFilename));
|
||||||
|
|
||||||
PDDocument doc = PDDocument.load(new File(pdfFilename));
|
ZUGFeRDExporter zugFeRDExporter = null;
|
||||||
makePDFA3compliant(doc);
|
try(PDDocument doc = PDDocument.load(new File(pdfFilename))) {
|
||||||
return new ZUGFeRDExporter(doc);
|
makePDFA3compliant(doc);
|
||||||
|
zugFeRDExporter = new ZUGFeRDExporter(doc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return zugFeRDExporter;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,12 +61,16 @@ public class ZUGFeRDExporterFromA1Factory {
|
|||||||
*
|
*
|
||||||
* @param pdfBinary binary of a PDF/A1 compliant document
|
* @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)));
|
ensurePDFIsValidA1(new ByteArrayDataSource(new ByteArrayInputStream(pdfBinary)));
|
||||||
|
|
||||||
PDDocument doc = PDDocument.load(pdfBinary);
|
ZUGFeRDExporter zugFeRDExporter;
|
||||||
makePDFA3compliant(doc);
|
try (PDDocument doc = PDDocument.load(pdfBinary)) {
|
||||||
return new ZUGFeRDExporter(doc);
|
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
|
* @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));
|
return loadFromPDFA1(readAllBytes(pdfSource));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,7 +96,7 @@ public class ZUGFeRDExporterFromA1Factory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void makePDFA3compliant(PDDocument doc) throws IOException {
|
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();
|
PDDocumentCatalog cat = doc.getDocumentCatalog();
|
||||||
PDMetadata metadata = new PDMetadata(doc);
|
PDMetadata metadata = new PDMetadata(doc);
|
||||||
@@ -198,23 +207,22 @@ public class ZUGFeRDExporterFromA1Factory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean getA1ParserValidationResult(PreflightParser parser) throws IOException {
|
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
|
* Once the syntax validation is done, the parser can provide a
|
||||||
* PreflightDocument (that inherits from PDDocument) This document
|
* PreflightDocument (that inherits from PDDocument) This document
|
||||||
* process the end of PDF/A validation.
|
* process the end of PDF/A validation.
|
||||||
*/
|
*/
|
||||||
document = parser.getPreflightDocument();
|
|
||||||
document.validate();
|
document.validate();
|
||||||
|
|
||||||
// Get validation result
|
// Get validation result
|
||||||
@@ -226,10 +234,6 @@ public class ZUGFeRDExporterFromA1Factory {
|
|||||||
* instance of ValidationResult
|
* instance of ValidationResult
|
||||||
*/
|
*/
|
||||||
return false;
|
return false;
|
||||||
} finally {
|
|
||||||
if (document != null) {
|
|
||||||
document.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,14 +8,13 @@ package org.mustangproject.ZUGFeRD;
|
|||||||
* @author jstaerk
|
* @author jstaerk
|
||||||
* */
|
* */
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.BufferedInputStream;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.management.RuntimeErrorException;
|
|
||||||
import javax.xml.parsers.DocumentBuilder;
|
import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
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.PDDocument;
|
||||||
import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
|
import org.apache.pdfbox.pdmodel.PDDocumentNameDictionary;
|
||||||
import org.apache.pdfbox.pdmodel.PDEmbeddedFilesNameTreeNode;
|
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.PDComplexFileSpecification;
|
||||||
import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
|
import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
|
||||||
import org.w3c.dom.Document;
|
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.
|
* Extracts a ZUGFeRD invoice from a PDF document represented by a file name.
|
||||||
* Errors are just logged to STDOUT.
|
* Errors are just logged to STDOUT.
|
||||||
*/
|
*/
|
||||||
public void extract(String pdfFilename)
|
public void extract(String pdfFilename) {
|
||||||
{
|
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pdfFilename))) {
|
||||||
try
|
extractLowLevel(bis);
|
||||||
{
|
} catch (IOException ioe) {
|
||||||
extractLowLevel(new BufferedInputStream(new FileInputStream(pdfFilename)));
|
|
||||||
} catch (IOException ioe)
|
|
||||||
{
|
|
||||||
ioe.printStackTrace();
|
ioe.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,18 +73,15 @@ public class ZUGFeRDImporter {
|
|||||||
* Errors are reported via exception handling.
|
* Errors are reported via exception handling.
|
||||||
*/
|
*/
|
||||||
public void extractLowLevel(InputStream pdfStream) throws IOException {
|
public void extractLowLevel(InputStream pdfStream) throws IOException {
|
||||||
PDDocument doc = null;
|
PDEmbeddedFilesNameTreeNode etn;
|
||||||
try {
|
try (PDDocument doc = PDDocument.load(pdfStream)) {
|
||||||
doc = PDDocument.load(pdfStream);
|
|
||||||
// PDDocumentInformation info = doc.getDocumentInformation();
|
// PDDocumentInformation info = doc.getDocumentInformation();
|
||||||
PDDocumentNameDictionary names = new PDDocumentNameDictionary(
|
PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog());
|
||||||
doc.getDocumentCatalog());
|
|
||||||
PDEmbeddedFilesNameTreeNode etn;
|
|
||||||
etn = names.getEmbeddedFiles();
|
etn = names.getEmbeddedFiles();
|
||||||
if (etn==null) {
|
if (etn == null) {
|
||||||
doc.close();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, PDComplexFileSpecification> efMap = etn.getNames();
|
Map<String, PDComplexFileSpecification> efMap = etn.getNames();
|
||||||
// String filePath = "/tmp/";
|
// String filePath = "/tmp/";
|
||||||
for (String filename : efMap.keySet()) {
|
for (String filename : efMap.keySet()) {
|
||||||
@@ -100,8 +92,7 @@ public class ZUGFeRDImporter {
|
|||||||
if (filename.equals("ZUGFeRD-invoice.xml")) { //$NON-NLS-1$
|
if (filename.equals("ZUGFeRD-invoice.xml")) { //$NON-NLS-1$
|
||||||
containsMeta = true;
|
containsMeta = true;
|
||||||
|
|
||||||
PDComplexFileSpecification fileSpec = (PDComplexFileSpecification) efMap
|
PDComplexFileSpecification fileSpec = efMap.get(filename);
|
||||||
.get(filename);
|
|
||||||
PDEmbeddedFile embeddedFile = fileSpec.getEmbeddedFile();
|
PDEmbeddedFile embeddedFile = fileSpec.getEmbeddedFile();
|
||||||
// String embeddedFilename = filePath + filename;
|
// String embeddedFilename = filePath + filename;
|
||||||
// File file = new File(filePath + filename);
|
// File file = new File(filePath + filename);
|
||||||
@@ -117,18 +108,7 @@ public class ZUGFeRDImporter {
|
|||||||
// fos.close();
|
// fos.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (IOException e1) {
|
|
||||||
throw e1;
|
|
||||||
}
|
}
|
||||||
finally {
|
|
||||||
try {
|
|
||||||
if(doc!=null) {
|
|
||||||
doc.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void parse() {
|
public void parse() {
|
||||||
@@ -421,9 +401,9 @@ public class ZUGFeRDImporter {
|
|||||||
public String getMeta() {
|
public String getMeta() {
|
||||||
if (rawXML==null){
|
if (rawXML==null){
|
||||||
return null;
|
return null;
|
||||||
} else {
|
|
||||||
return new String(rawXML);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return new String(rawXML);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ package org.mustangproject.ZUGFeRD.model;
|
|||||||
import javax.xml.bind.JAXBElement;
|
import javax.xml.bind.JAXBElement;
|
||||||
import javax.xml.bind.annotation.XmlElementDecl;
|
import javax.xml.bind.annotation.XmlElementDecl;
|
||||||
import javax.xml.bind.annotation.XmlRegistry;
|
import javax.xml.bind.annotation.XmlRegistry;
|
||||||
import javax.xml.bind.annotation.XmlRootElement;
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -401,27 +401,18 @@ public class MustangReaderWriterEdgeTest extends TestCase implements IZUGFeRDExp
|
|||||||
public void testZExport()
|
public void testZExport()
|
||||||
{
|
{
|
||||||
|
|
||||||
final InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
|
final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505newEdge.pdf";
|
||||||
final String TARGET_PDF = "./target/testout-MustangGnuaccountingBeispielRE-20170509_505newEdge.pdf";
|
|
||||||
// the writing part
|
|
||||||
|
|
||||||
try
|
// the writing part
|
||||||
{
|
// automatically add Zugferd to all outgoing invoices
|
||||||
// automatically add Zugferd to all outgoing invoices
|
try (ZUGFeRDExporter ze = new ZUGFeRDExporter()) {
|
||||||
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.PDFmakeA3compliant(SOURCE_PDF, "My Application", System.getProperty("user.name"), true);
|
||||||
ze.PDFattachZugferdFile(this);
|
}
|
||||||
ze.export(TARGET_PDF);
|
ze.PDFattachZugferdFile(this);
|
||||||
|
ze.export(TARGET_PDF);
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (Exception e)
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
catch (TransformerException e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,14 +10,13 @@ import java.util.GregorianCalendar;
|
|||||||
|
|
||||||
import javax.xml.transform.TransformerException;
|
import javax.xml.transform.TransformerException;
|
||||||
|
|
||||||
|
import org.junit.FixMethodOrder;
|
||||||
|
import org.junit.runners.MethodSorters;
|
||||||
|
|
||||||
import junit.framework.Test;
|
import junit.framework.Test;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
import junit.framework.TestSuite;
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
|
||||||
import org.junit.FixMethodOrder;
|
|
||||||
import org.junit.runners.MethodSorters;
|
|
||||||
|
|
||||||
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
|
||||||
public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExportableTransaction
|
public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExportableTransaction
|
||||||
{
|
{
|
||||||
@@ -326,7 +325,7 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta
|
|||||||
|
|
||||||
public void setVATPercent(BigDecimal VATPercent)
|
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
|
public void testAImport() throws IOException
|
||||||
{
|
{
|
||||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||||
InputStream inputStream = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf");
|
try (InputStream inputStream = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf")) {
|
||||||
zi.extractLowLevel(inputStream);
|
zi.extractLowLevel(inputStream);
|
||||||
|
}
|
||||||
|
|
||||||
// Reading ZUGFeRD
|
// Reading ZUGFeRD
|
||||||
|
|
||||||
String amount = null;
|
String amount = null;
|
||||||
@@ -400,27 +401,19 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta
|
|||||||
*/
|
*/
|
||||||
public void testZExport()
|
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
|
// the writing part
|
||||||
try
|
// automatically add Zugferd to all outgoing invoices
|
||||||
{
|
try (ZUGFeRDExporter ze = new ZUGFeRDExporter()) {
|
||||||
// automatically add Zugferd to all outgoing invoices
|
try (final InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf")) {
|
||||||
ZUGFeRDExporter ze = new ZUGFeRDExporter();
|
ze.PDFmakeA3compliant(SOURCE_PDF, "My Application", System.getProperty("user.name"), true);
|
||||||
ze.PDFmakeA3compliant(SOURCE_PDF, "My Application", System.getProperty("user.name"), true);
|
}
|
||||||
ze.PDFattachZugferdFile(this);
|
ze.PDFattachZugferdFile(this);
|
||||||
ze.export(TARGET_PDF);
|
ze.export(TARGET_PDF);
|
||||||
}
|
}
|
||||||
catch (IOException e)
|
catch (Exception e)
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
catch (TransformerException e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user