Merge pull request #80 from HardyLoppmann/master
Refactoring with XPath
This commit is contained in:
@@ -33,27 +33,21 @@ import org.apache.pdfbox.pdmodel.common.PDNameTreeNode;
|
||||
import org.apache.pdfbox.pdmodel.common.filespecification.PDComplexFileSpecification;
|
||||
import org.apache.pdfbox.pdmodel.common.filespecification.PDEmbeddedFile;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.dom.Node;
|
||||
import org.w3c.dom.NodeList;
|
||||
import org.xml.sax.SAXException;
|
||||
|
||||
import javax.xml.parsers.DocumentBuilder;
|
||||
import javax.xml.parsers.DocumentBuilderFactory;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.transform.*;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.stream.StreamResult;
|
||||
import javax.xml.xpath.XPath;
|
||||
import javax.xml.xpath.XPathExpressionException;
|
||||
import javax.xml.xpath.XPathFactory;
|
||||
import java.io.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
//root.setNamespace(Namespace.getNamespace("http://www.energystar.gov/manageBldgs/req"));
|
||||
import java.util.*;
|
||||
|
||||
public class ZUGFeRDImporter {
|
||||
/*
|
||||
* call extract(importFilename). containsMeta() will return if ZUGFeRD data has
|
||||
* been found, afterwards you can call getBIC(), getIBAN() etc.
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @var if metadata has been found
|
||||
@@ -62,57 +56,31 @@ public class ZUGFeRDImporter {
|
||||
/**
|
||||
* @var the reference (i.e. invoice number) of the sender
|
||||
*/
|
||||
private String foreignReference;
|
||||
private String BLZ;
|
||||
private String BIC;
|
||||
private String IBAN;
|
||||
private String KTO;
|
||||
private String holder;
|
||||
private String amount;
|
||||
private String dueDate;
|
||||
private HashMap<String, byte[]> additionalXMLs = new HashMap<String, byte[]>();
|
||||
private HashMap<String, byte[]> additionalXMLs = new HashMap<>();
|
||||
/**
|
||||
* Raw XML form of the extracted data - may be directly obtained.
|
||||
*/
|
||||
private byte[] rawXML = null;
|
||||
private String bankName;
|
||||
private boolean amountFound;
|
||||
private boolean extractAttempt = false;
|
||||
private boolean parsed = false;
|
||||
private String xmpString = null; // XMP metadata
|
||||
private static final Logger LOG = Logger.getLogger(ZUGFeRDImporter.class.getName());
|
||||
|
||||
/**
|
||||
* Extracts a ZUGFeRD invoice from a PDF document represented by a file name.
|
||||
* Errors are just logged to STDOUT.
|
||||
*
|
||||
* @param pdfFilename the filename of the pdf
|
||||
*/
|
||||
public void extract(String pdfFilename) {
|
||||
public ZUGFeRDImporter(String pdfFilename) {
|
||||
try {
|
||||
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(pdfFilename));
|
||||
|
||||
extractLowLevel(bis);
|
||||
bis.close();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new ZUGFeRDExportException(e);
|
||||
}
|
||||
}
|
||||
|
||||
static String convertStreamToString(java.io.InputStream is) {
|
||||
// source https://stackoverflow.com/questions/309424/how-do-i-read-convert-an-inputstream-into-a-string-in-java referring to
|
||||
// https://community.oracle.com/blogs/pat/2004/10/23/stupid-scanner-tricks
|
||||
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
|
||||
return s.hasNext() ? s.next() : "";
|
||||
public ZUGFeRDImporter(InputStream pdfStream) {
|
||||
try {
|
||||
extractLowLevel(pdfStream);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new ZUGFeRDExportException(e);
|
||||
}
|
||||
|
||||
/**
|
||||
* get xmp metadata of the PDF, null if not available
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public String getXMP() {
|
||||
return xmpString;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -121,9 +89,7 @@ public class ZUGFeRDImporter {
|
||||
*
|
||||
* @param pdfStream a inputstream of a pdf file
|
||||
*/
|
||||
public void extractLowLevel(InputStream pdfStream) throws IOException {
|
||||
PDEmbeddedFilesNameTreeNode etn;
|
||||
extractAttempt = true;
|
||||
private void extractLowLevel(InputStream pdfStream) throws IOException {
|
||||
try (PDDocument doc = PDDocument.load(pdfStream)) {
|
||||
// PDDocumentInformation info = doc.getDocumentInformation();
|
||||
PDDocumentNameDictionary names = new PDDocumentNameDictionary(doc.getDocumentCatalog());
|
||||
@@ -131,7 +97,8 @@ public class ZUGFeRDImporter {
|
||||
InputStream XMP = doc.getDocumentCatalog().getMetadata().exportXMPMetadata();
|
||||
|
||||
xmpString = convertStreamToString(XMP);
|
||||
etn = names.getEmbeddedFiles();
|
||||
|
||||
PDEmbeddedFilesNameTreeNode etn = names.getEmbeddedFiles();
|
||||
if (etn == null) {
|
||||
return;
|
||||
}
|
||||
@@ -188,352 +155,129 @@ public class ZUGFeRDImporter {
|
||||
}
|
||||
}
|
||||
|
||||
public HashMap<String, byte[]> getAdditionalData() {
|
||||
return additionalXMLs;
|
||||
private void prettyPrint(Document document) throws TransformerException {
|
||||
TransformerFactory tf = TransformerFactory.newInstance();
|
||||
Transformer transformer = null;
|
||||
try {
|
||||
transformer = tf.newTransformer();
|
||||
} catch (TransformerConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
|
||||
StringWriter writer = new StringWriter();
|
||||
transformer.transform(new DOMSource(document), new StreamResult(writer));
|
||||
String output = writer.getBuffer().toString();//.replaceAll("\n|\r", "");
|
||||
System.err.println(output);
|
||||
}
|
||||
|
||||
/**
|
||||
* needs to be called to be able to call the getters
|
||||
*/
|
||||
public void parse() {
|
||||
DocumentBuilderFactory factory = null;
|
||||
DocumentBuilder builder = null;
|
||||
Document document = null;
|
||||
|
||||
if (!extractAttempt) {
|
||||
throw new RuntimeException("extract() or extractLowLevel() must be used before parsing.");
|
||||
private Document getDocument() throws ParserConfigurationException, IOException, SAXException, TransformerException {
|
||||
DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance();
|
||||
xmlFact.setNamespaceAware(false);
|
||||
DocumentBuilder builder = xmlFact.newDocumentBuilder();
|
||||
Document doc = builder.parse(new ByteArrayInputStream(rawXML));
|
||||
//prettyPrint(doc);
|
||||
return doc;
|
||||
}
|
||||
|
||||
private String extractString(String xpathStr) {
|
||||
if (!containsMeta) {
|
||||
throw new RuntimeException("No suitable data/ZUGFeRD file could be found.");
|
||||
throw new ZUGFeRDExportException("No suitable data/ZUGFeRD file could be found.");
|
||||
}
|
||||
|
||||
factory = DocumentBuilderFactory.newInstance();
|
||||
factory.setNamespaceAware(true); // otherwise we can not act namespace independently, i.e. use
|
||||
// document.getElementsByTagNameNS("*",...
|
||||
String result;
|
||||
try {
|
||||
builder = factory.newDocumentBuilder();
|
||||
} catch (ParserConfigurationException ex3) {
|
||||
// TODO Auto-generated catch block
|
||||
ex3.printStackTrace();
|
||||
Document document = getDocument();
|
||||
XPathFactory xpathFact = XPathFactory.newInstance();
|
||||
XPath xpath = xpathFact.newXPath();
|
||||
result = xpath.evaluate(xpathStr, document);
|
||||
} catch (ParserConfigurationException e) {
|
||||
e.printStackTrace();
|
||||
throw new ZUGFeRDExportException(e);
|
||||
} catch (IOException | SAXException | TransformerException | XPathExpressionException e) {
|
||||
e.printStackTrace();
|
||||
throw new ZUGFeRDExportException(e);
|
||||
}
|
||||
|
||||
try {
|
||||
InputStream bais = new ByteArrayInputStream(rawXML);
|
||||
document = builder.parse(bais);
|
||||
} catch (SAXException ex1) {
|
||||
ex1.printStackTrace();
|
||||
} catch (IOException ex2) {
|
||||
ex2.printStackTrace();
|
||||
}
|
||||
NodeList ndList;
|
||||
|
||||
// rootNode = document.getDocumentElement();
|
||||
// ApplicableSupplyChainTradeSettlement
|
||||
ndList = document.getDocumentElement().getElementsByTagNameNS("*", "PaymentReference"); //$NON-NLS-1$
|
||||
|
||||
for (int bookingIndex = 0; bookingIndex < ndList.getLength(); bookingIndex++) {
|
||||
Node booking = ndList.item(bookingIndex);
|
||||
// if there is a attribute in the tag number:value
|
||||
|
||||
setForeignReference(booking.getTextContent());
|
||||
|
||||
}
|
||||
/*
|
||||
* ndList = document .getElementsByTagName("GermanBankleitzahlID");
|
||||
* //$NON-NLS-1$
|
||||
*
|
||||
* for (int bookingIndex = 0; bookingIndex < ndList .getLength();
|
||||
* bookingIndex++) { Node booking = ndList.item(bookingIndex); // if there is a
|
||||
* attribute in the tag number:value setBIC(booking.getTextContent());
|
||||
*
|
||||
* }
|
||||
*
|
||||
* ndList = document.getElementsByTagName("ProprietaryID"); //$NON-NLS-1$
|
||||
*
|
||||
* for (int bookingIndex = 0; bookingIndex < ndList .getLength();
|
||||
* bookingIndex++) { Node booking = ndList.item(bookingIndex); // if there is a
|
||||
* attribute in the tag number:value setIBAN(booking.getTextContent());
|
||||
*
|
||||
* } <ram:PayeePartyCreditorFinancialAccount> <ram:IBANID>DE1234</ram:IBANID>
|
||||
* </ram:PayeePartyCreditorFinancialAccount>
|
||||
* <ram:PayeeSpecifiedCreditorFinancialInstitution>
|
||||
* <ram:BICID>DE5656565</ram:BICID> <ram:Name>Commerzbank</ram:Name>
|
||||
* </ram:PayeeSpecifiedCreditorFinancialInstitution>
|
||||
*
|
||||
*/
|
||||
|
||||
/***
|
||||
* we should switch to xpath like this // Create XPathFactory object
|
||||
* XPathFactory xpathFactory = XPathFactory.newInstance();
|
||||
*
|
||||
* // Create XPath object XPath xpath = xpathFactory.newXPath(); XPathExpression
|
||||
* expr =
|
||||
* xpath.compile("//*[local-name()=\"GuidelineSpecifiedDocumentContextParameter\"]/[local-name()=\"ID\"]");
|
||||
* //evaluate expression result on XML document ndList = (NodeList)
|
||||
* expr.evaluate(doc, XPathConstants.NODESET);
|
||||
*
|
||||
*/
|
||||
|
||||
ndList = document.getElementsByTagNameNS("*", "PayeePartyCreditorFinancialAccount"); //$NON-NLS-1$
|
||||
for (int bookingIndex = 0; bookingIndex < ndList.getLength(); bookingIndex++) {
|
||||
|
||||
Node booking = ndList.item(bookingIndex);
|
||||
// there are many "name" elements, so get the one below
|
||||
// SellerTradeParty
|
||||
NodeList bookingDetails = booking.getChildNodes();
|
||||
|
||||
for (int detailIndex = 0; detailIndex < bookingDetails.getLength(); detailIndex++) {
|
||||
Node detail = bookingDetails.item(detailIndex);
|
||||
if ((detail.getLocalName() != null) && (detail.getLocalName().equals("IBANID"))) { //$NON-NLS-1$
|
||||
setIBAN(detail.getTextContent());
|
||||
}
|
||||
if ((detail.getLocalName() != null) && (detail.getLocalName().equals("ProprietaryID"))) { //$NON-NLS-1$
|
||||
setKTO(detail.getTextContent());
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
ndList = document.getElementsByTagNameNS("*", "PayeeSpecifiedCreditorFinancialInstitution");// ZF1 //$NON-NLS-1$
|
||||
for (int bookingIndex = 0; bookingIndex < ndList.getLength(); bookingIndex++) {
|
||||
Node booking = ndList.item(bookingIndex);
|
||||
// there are many "name" elements, so get the one below
|
||||
// SellerTradeParty
|
||||
NodeList bookingDetails = booking.getChildNodes();
|
||||
for (int detailIndex = 0; detailIndex < bookingDetails.getLength(); detailIndex++) {
|
||||
Node detail = bookingDetails.item(detailIndex);
|
||||
if ((detail.getLocalName() != null) && (detail.getLocalName().equals("BICID"))) { //$NON-NLS-1$
|
||||
setBIC(detail.getTextContent());
|
||||
}
|
||||
if ((detail.getLocalName() != null) && (detail.getLocalName().equals("GermanBankleitzahlID"))) { //$NON-NLS-1$
|
||||
setBLZ(detail.getTextContent());
|
||||
}
|
||||
if ((detail.getLocalName() != null) && (detail.getLocalName().equals("Name"))) { //$NON-NLS-1$
|
||||
setBankName(detail.getTextContent());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ndList = document.getElementsByTagNameNS("*", "SellerTradeParty"); //$NON-NLS-1$
|
||||
|
||||
for (int bookingIndex = 0; bookingIndex < ndList.getLength(); bookingIndex++) {
|
||||
Node booking = ndList.item(bookingIndex);
|
||||
// there are many "name" elements, so get the one below
|
||||
// SellerTradeParty
|
||||
NodeList bookingDetails = booking.getChildNodes();
|
||||
for (int detailIndex = 0; detailIndex < bookingDetails.getLength(); detailIndex++) {
|
||||
Node detail = bookingDetails.item(detailIndex);
|
||||
if ((detail.getLocalName() != null) && (detail.getLocalName().equals("Name"))) { //$NON-NLS-1$
|
||||
setHolder(detail.getTextContent());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ndList = document.getElementsByTagNameNS("*", "DuePayableAmount"); //$NON-NLS-1$
|
||||
|
||||
for (int bookingIndex = 0; bookingIndex < ndList.getLength(); bookingIndex++) {
|
||||
Node booking = ndList.item(bookingIndex);
|
||||
// if there is a attribute in the tag number:value
|
||||
amountFound = true;
|
||||
setAmount(booking.getTextContent());
|
||||
|
||||
}
|
||||
|
||||
if (!amountFound) {
|
||||
/*
|
||||
* there is apparently no requirement to mention DuePayableAmount,, if it's not
|
||||
* there, check for GrandTotalAmount
|
||||
*/
|
||||
ndList = document.getElementsByTagNameNS("*", "GrandTotalAmount"); //$NON-NLS-1$
|
||||
for (int bookingIndex = 0; bookingIndex < ndList.getLength(); bookingIndex++) {
|
||||
Node booking = ndList.item(bookingIndex);
|
||||
// if there is a attribute in the tag number:value
|
||||
amountFound = true;
|
||||
setAmount(booking.getTextContent());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ndList = document.getElementsByTagNameNS("*", "SpecifiedTradePaymentTerms"); //$NON-NLS-1$
|
||||
|
||||
for (int bookingIndex = 0; bookingIndex < ndList.getLength(); bookingIndex++) {
|
||||
Node booking = ndList.item(bookingIndex);
|
||||
// there are many "name" elements, so get the one below
|
||||
// SellerTradeParty
|
||||
NodeList bookingDetails = booking.getChildNodes();
|
||||
for (int detailIndex = 0; detailIndex < bookingDetails.getLength(); detailIndex++) {
|
||||
Node detail = bookingDetails.item(detailIndex);
|
||||
if ((detail.getLocalName() != null) && (detail.getLocalName().equals("DueDateDateTime"))) { //$NON-NLS-1$
|
||||
setDueDate(detail.getTextContent().trim());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
parsed = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return if export found parseable ZUGFeRD data
|
||||
*/
|
||||
public boolean containsMeta() {
|
||||
return containsMeta;
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the reference (purpose) the sender specified for this invoice
|
||||
*/
|
||||
public String getForeignReference() {
|
||||
if (!parsed) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (foreignReference == null) {
|
||||
parse();
|
||||
}
|
||||
return foreignReference;
|
||||
}
|
||||
|
||||
private void setForeignReference(String foreignReference) {
|
||||
this.foreignReference = foreignReference;
|
||||
String result = extractString("//ApplicableHeaderTradeSettlement/PaymentReference");
|
||||
if(result == null || result.isEmpty())
|
||||
result = extractString("//ApplicableSupplyChainTradeSettlement/PaymentReference");
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the sender's bank's BLZ code
|
||||
*/
|
||||
public String getBLZ() {
|
||||
if (!parsed) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (BLZ == null) {
|
||||
parse();
|
||||
}
|
||||
return BLZ;
|
||||
}
|
||||
|
||||
private void setBLZ(String blz) {
|
||||
this.BLZ = blz;
|
||||
return extractString("//PayeeSpecifiedCreditorFinancialInstitution/GermanBankleitzahlID");
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the sender's bank's BIC code
|
||||
*/
|
||||
public String getBIC() {
|
||||
if (!parsed) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (BIC == null) {
|
||||
parse();
|
||||
}
|
||||
return BIC;
|
||||
}
|
||||
|
||||
private void setBIC(String bic) {
|
||||
this.BIC = bic;
|
||||
}
|
||||
|
||||
private void setDueDate(String dueDate) {
|
||||
this.dueDate = dueDate;
|
||||
}
|
||||
|
||||
private void setBankName(String bankname) {
|
||||
this.bankName = bankname;
|
||||
return extractString("//PayeeSpecifiedCreditorFinancialInstitution/BICID");
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the sender's IBAN
|
||||
*/
|
||||
public String getIBAN() {
|
||||
if (!parsed) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (IBAN == null) {
|
||||
parse();
|
||||
}
|
||||
return IBAN;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the sender's KTO
|
||||
*/
|
||||
public String getKTO() {
|
||||
if (!parsed) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (KTO == null) {
|
||||
parse();
|
||||
}
|
||||
return KTO;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the sender's bank name
|
||||
* @return the sender's bankname
|
||||
*/
|
||||
public String getBankName() {
|
||||
if (!parsed) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (bankName == null) {
|
||||
parse();
|
||||
}
|
||||
return bankName;
|
||||
return extractString("/CrossIndustryInvoice/SupplyChainTradeTransaction/ApplicableHeaderTradeSettlement/SpecifiedTradeSettlementPaymentMeans/PayeeSpecifiedCreditorFinancialInstitution/Name");
|
||||
}
|
||||
|
||||
private void setIBAN(String IBAN) {
|
||||
this.IBAN = IBAN;
|
||||
public String getIBAN() {
|
||||
return extractString("//PayeePartyCreditorFinancialAccount/IBANID");
|
||||
}
|
||||
|
||||
private void setKTO(String KTO) {
|
||||
this.KTO = KTO;
|
||||
public String getKTO() {
|
||||
return extractString("//PayeePartyCreditorFinancialAccount/ProprietaryID");
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the name of the owner of the sender's bank account
|
||||
*/
|
||||
public String getHolder() {
|
||||
if (rawXML == null) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (holder == null) {
|
||||
parse();
|
||||
}
|
||||
return holder;
|
||||
}
|
||||
|
||||
private void setHolder(String holder) {
|
||||
this.holder = holder;
|
||||
return extractString("//SellerTradeParty/Name");
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the total payable amount
|
||||
*/
|
||||
public String getAmount() {
|
||||
if (rawXML == null) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (amount == null) {
|
||||
parse();
|
||||
}
|
||||
return amount;
|
||||
String result = extractString("//SpecifiedTradeSettlementHeaderMonetarySummation/DuePayableAmount");
|
||||
if(result == null || result.isEmpty())
|
||||
result = extractString("//SpecifiedTradeSettlementMonetarySummation/GrandTotalAmount");
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return when the payment is due
|
||||
*/
|
||||
public String getDueDate() {
|
||||
if (rawXML == null) {
|
||||
throw new RuntimeException("use extract() before requesting a value");
|
||||
}
|
||||
if (dueDate == null) {
|
||||
parse();
|
||||
}
|
||||
return dueDate;
|
||||
return extractString("//SpecifiedTradePaymentTerms/DueDateDateTime/DateTimeString");
|
||||
}
|
||||
|
||||
private void setAmount(String amount) {
|
||||
this.amount = amount;
|
||||
public HashMap<String, byte[]> getAdditionalData() {
|
||||
return additionalXMLs;
|
||||
}
|
||||
|
||||
/**
|
||||
* get xmp metadata of the PDF, null if not available
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public String getXMP() {
|
||||
return xmpString;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return if export found parseable ZUGFeRD data
|
||||
*/
|
||||
public boolean containsMeta() {
|
||||
return containsMeta;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -604,4 +348,12 @@ public class ZUGFeRDImporter {
|
||||
return (meta != null) && (meta.length() > 0) && ((meta.contains("SpecifiedExchangedDocumentContext") //$NON-NLS-1$
|
||||
/* ZF1 */ || meta.contains("ExchangedDocumentContext") /* ZF2 */));
|
||||
}
|
||||
|
||||
static String convertStreamToString(java.io.InputStream is) {
|
||||
// source https://stackoverflow.com/questions/309424/how-do-i-read-convert-an-inputstream-into-a-string-in-java referring to
|
||||
// https://community.oracle.com/blogs/pat/2004/10/23/stupid-scanner-tricks
|
||||
Scanner s = new Scanner(is).useDelimiter("\\A");
|
||||
return s.hasNext() ? s.next() : "";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/** **********************************************************************
|
||||
*
|
||||
* Copyright 2019 ak on 09.04.19.
|
||||
*
|
||||
* Use is subject to license terms.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
||||
* use this file except in compliance with the License. You may obtain a copy
|
||||
* of the License at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
*
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
*********************************************************************** */
|
||||
package org.mustangproject.ZUGFeRD;
|
||||
|
||||
public class ZUGFeRDImporterException extends RuntimeException {
|
||||
|
||||
}
|
||||
@@ -49,9 +49,8 @@ public class FileChecker {
|
||||
if ((!isPDF) && (!thisRun.shallIgnoreFileExt())) {
|
||||
return false;
|
||||
}
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(filename);
|
||||
try {
|
||||
zi.extract(filename);
|
||||
if (zi.canParse()) {
|
||||
thisRun.incZUGFeRDCount();
|
||||
return true;
|
||||
|
||||
@@ -406,8 +406,7 @@ public class Toecount {
|
||||
ensureFileNotExists(xmlName);
|
||||
|
||||
// All params are good! continue...
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
zi.extract(pdfName);
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(pdfName);
|
||||
byte[] XMLContent = zi.getRawXML();
|
||||
if (XMLContent == null) {
|
||||
System.err.println("No ZUGFeRD XML found in PDF file");
|
||||
|
||||
@@ -55,14 +55,12 @@ public class MustangReaderWriterCustomXMLTest extends TestCase {
|
||||
// the writing part
|
||||
|
||||
try {
|
||||
InputStream SOURCE_PDF = this.getClass()
|
||||
.getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
|
||||
InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
|
||||
|
||||
ZUGFeRDExporter zea1 = new ZUGFeRDExporterFromA1Factory().setProducer("My Application").setCreator("Test").setZUGFeRDConformanceLevel(ZUGFeRDConformanceLevel.EN16931)
|
||||
.load(SOURCE_PDF);
|
||||
|
||||
final byte[] UTF8ByteOrderMark = new byte[]{(byte) 0xef, (byte) 0xbb,
|
||||
(byte) 0xbf};
|
||||
final byte[] UTF8ByteOrderMark = new byte[]{(byte) 0xef, (byte) 0xbb, (byte) 0xbf};
|
||||
/* we have much more information than just in the basic profile (comfort or extended) but it's perfectly valid to provide more information, just not less. */
|
||||
String ownZUGFeRDXML = new String(UTF8ByteOrderMark) + "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
|
||||
"<rsm:CrossIndustryInvoice xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" 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\">\n" +
|
||||
@@ -267,41 +265,20 @@ public class MustangReaderWriterCustomXMLTest extends TestCase {
|
||||
assertFalse(pdfContent.indexOf("<zf:ConformanceLevel>EN 16931</zf:ConformanceLevel>") == -1);
|
||||
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// now check the contents (like MustangReaderTest)
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
zi.extract(TARGET_PDF);
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF);
|
||||
|
||||
// Reading ZUGFeRD
|
||||
|
||||
String amount = null;
|
||||
String bic = null;
|
||||
String blz = null;
|
||||
String iban = null;
|
||||
String kto = null;
|
||||
String holder = null;
|
||||
String ref = null;
|
||||
|
||||
if (zi.canParse()) {
|
||||
zi.parse();
|
||||
amount = zi.getAmount();
|
||||
blz = zi.getBLZ();
|
||||
bic = zi.getBIC();
|
||||
iban = zi.getIBAN();
|
||||
kto = zi.getKTO();
|
||||
holder = zi.getHolder();
|
||||
ref = zi.getForeignReference();
|
||||
}
|
||||
|
||||
assertEquals(amount, "571.04");
|
||||
assertEquals(blz, "41441604");
|
||||
assertEquals(bic, "COBADEFFXXX");
|
||||
assertEquals(iban, "DE88 2008 0000 0970 3757 00");
|
||||
assertEquals(kto, "44421800");
|
||||
assertEquals(holder, "Bei Spiel GmbH");
|
||||
assertEquals(ref, "RE-20171118/506");
|
||||
assertEquals(zi.getAmount(), "571.04");
|
||||
assertEquals(zi.getBLZ(), "41441604");
|
||||
assertEquals(zi.getBIC(), "COBADEFFXXX");
|
||||
assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00");
|
||||
assertEquals(zi.getKTO(), "44421800");
|
||||
assertEquals(zi.getHolder(), "Bei Spiel GmbH");
|
||||
assertEquals(zi.getForeignReference(), "RE-20171118/506");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -318,8 +295,7 @@ public class MustangReaderWriterCustomXMLTest extends TestCase {
|
||||
// the writing part
|
||||
|
||||
try {
|
||||
InputStream SOURCE_PDF = this.getClass()
|
||||
.getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
|
||||
InputStream SOURCE_PDF = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505blanko.pdf");
|
||||
|
||||
ZUGFeRDExporter zea1 = new ZUGFeRDExporterFromA1Factory().setProducer("My Application").setCreator("Test").setZUGFeRDConformanceLevel(ZUGFeRDConformanceLevel.BASIC)
|
||||
.load(SOURCE_PDF);
|
||||
@@ -469,41 +445,20 @@ public class MustangReaderWriterCustomXMLTest extends TestCase {
|
||||
assertFalse(pdfContent.indexOf("<zf:ConformanceLevel>BASIC</zf:ConformanceLevel>") == -1);
|
||||
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// now check the contents (like MustangReaderTest)
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
zi.extract(TARGET_PDF);
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF);
|
||||
|
||||
// Reading ZUGFeRD
|
||||
|
||||
String amount = null;
|
||||
String bic = null;
|
||||
String blz = null;
|
||||
String iban = null;
|
||||
String kto = null;
|
||||
String holder = null;
|
||||
String ref = null;
|
||||
|
||||
if (zi.canParse()) {
|
||||
zi.parse();
|
||||
amount = zi.getAmount();
|
||||
bic = zi.getBIC();
|
||||
blz = zi.getBLZ();
|
||||
iban = zi.getIBAN();
|
||||
kto = zi.getKTO();
|
||||
holder = zi.getHolder();
|
||||
ref = zi.getForeignReference();
|
||||
}
|
||||
|
||||
assertEquals(amount, "571.04");
|
||||
assertEquals(bic, "COBADEFFXXX");
|
||||
assertEquals(blz, "41441604");
|
||||
assertEquals(iban, "DE88 2008 0000 0970 3757 00");
|
||||
assertEquals(kto, "44421800");
|
||||
assertEquals(holder, "Bei Spiel GmbH");
|
||||
assertEquals(ref, "RE-20170509/505");
|
||||
assertEquals(zi.getAmount(), "571.04");
|
||||
assertEquals(zi.getBIC(), "COBADEFFXXX");
|
||||
assertEquals(zi.getBLZ(), "41441604");
|
||||
assertEquals(zi.getIBAN(), "DE88 2008 0000 0970 3757 00");
|
||||
assertEquals(zi.getKTO(), "44421800");
|
||||
assertEquals(zi.getHolder(), "Bei Spiel GmbH");
|
||||
assertEquals(zi.getForeignReference(), "RE-20170509/505");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -336,40 +336,18 @@ public class MustangReaderWriterEdgeTest extends TestCase implements IZUGFeRDExp
|
||||
*/
|
||||
|
||||
public void testAImport() throws IOException {
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
zi.extractLowLevel(this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf"));
|
||||
InputStream inputStream = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf");
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(inputStream);
|
||||
|
||||
// Reading ZUGFeRD
|
||||
|
||||
String amount = null;
|
||||
String bic = null;
|
||||
String blz = null;
|
||||
String iban = null;
|
||||
String kto = null;
|
||||
String holder = null;
|
||||
String ref = null;
|
||||
String dueDate = null;
|
||||
|
||||
if (zi.canParse()) {
|
||||
zi.parse();
|
||||
amount = zi.getAmount();
|
||||
bic = zi.getBIC();
|
||||
blz = zi.getBLZ();
|
||||
iban = zi.getIBAN();
|
||||
kto = zi.getKTO();
|
||||
holder = zi.getHolder();
|
||||
dueDate = zi.getDueDate();
|
||||
ref = zi.getForeignReference();
|
||||
}
|
||||
|
||||
assertEquals(amount, "571.04");
|
||||
assertEquals(bic, getOwnBIC());
|
||||
assertEquals(blz, getOwnBLZ());
|
||||
assertEquals(iban, getOwnIBAN());
|
||||
assertEquals(kto, getOwnKto());
|
||||
assertEquals(holder, getOwnOrganisationName());
|
||||
|
||||
assertEquals(dueDate, "20170530");
|
||||
assertEquals(ref, getNumber());
|
||||
assertEquals(zi.getAmount(), "571.04");
|
||||
assertEquals(zi.getBIC(), getOwnBIC());
|
||||
assertEquals(zi.getBLZ(), getOwnBLZ());
|
||||
assertEquals(zi.getIBAN(), getOwnIBAN());
|
||||
assertEquals(zi.getKTO(), getOwnKto());
|
||||
assertEquals(zi.getHolder(), getOwnOrganisationName());
|
||||
assertEquals(zi.getDueDate(), "20170530");
|
||||
assertEquals(zi.getForeignReference(), getNumber());
|
||||
|
||||
}
|
||||
|
||||
@@ -401,37 +379,16 @@ public class MustangReaderWriterEdgeTest extends TestCase implements IZUGFeRDExp
|
||||
}
|
||||
|
||||
// now check the contents (like MustangReaderTest)
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
zi.extract(TARGET_PDF);
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF);
|
||||
|
||||
// Reading ZUGFeRD
|
||||
|
||||
String amount = null;
|
||||
String bic = null;
|
||||
String blz = null;
|
||||
String iban = null;
|
||||
String kto = null;
|
||||
String holder = null;
|
||||
String ref = null;
|
||||
|
||||
if (zi.canParse()) {
|
||||
zi.parse();
|
||||
amount = zi.getAmount();
|
||||
bic = zi.getBIC();
|
||||
blz = zi.getBLZ();
|
||||
iban = zi.getIBAN();
|
||||
kto = zi.getKTO();
|
||||
holder = zi.getHolder();
|
||||
ref = zi.getForeignReference();
|
||||
}
|
||||
|
||||
assertEquals(amount, "571.04");
|
||||
assertEquals(bic, getOwnBIC());
|
||||
assertEquals(blz, getOwnBLZ());
|
||||
assertEquals(iban, getOwnIBAN());
|
||||
assertEquals(kto, getOwnKto());
|
||||
assertEquals(holder, getOwnOrganisationName());
|
||||
assertEquals(ref, getNumber());
|
||||
|
||||
assertEquals(zi.getAmount(), "571.04");
|
||||
assertEquals(zi.getBIC(), getOwnBIC());
|
||||
assertEquals(zi.getBLZ(), getOwnBLZ());
|
||||
assertEquals(zi.getIBAN(), getOwnIBAN());
|
||||
assertEquals(zi.getKTO(), getOwnKto());
|
||||
assertEquals(zi.getHolder(), getOwnOrganisationName());
|
||||
assertEquals(zi.getForeignReference(), getNumber());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -346,14 +346,10 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta
|
||||
*/
|
||||
|
||||
public void testAImport() throws IOException {
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
try (InputStream inputStream = this.getClass()
|
||||
.getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf")) {
|
||||
zi.extractLowLevel(inputStream);
|
||||
}
|
||||
InputStream inputStream = this.getClass().getResourceAsStream("/MustangGnuaccountingBeispielRE-20170509_505.pdf");
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(inputStream);
|
||||
|
||||
// Reading ZUGFeRD
|
||||
|
||||
String amount = null;
|
||||
String blz = null;
|
||||
String bic = null;
|
||||
@@ -363,7 +359,6 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta
|
||||
String ref = null;
|
||||
|
||||
if (zi.canParse()) {
|
||||
zi.parse();
|
||||
amount = zi.getAmount();
|
||||
blz = zi.getBLZ();
|
||||
bic = zi.getBIC();
|
||||
@@ -384,14 +379,10 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta
|
||||
}
|
||||
|
||||
public void testForeignImport() throws IOException {
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
InputStream inputStream = this.getClass().getResourceAsStream("/zugferd_invoice.pdf");
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(inputStream);
|
||||
|
||||
try (InputStream inputStream = this.getClass()
|
||||
.getResourceAsStream("/zugferd_invoice.pdf")) {
|
||||
zi.extractLowLevel(inputStream);
|
||||
}
|
||||
// Reading ZUGFeRD
|
||||
|
||||
String amount = zi.getAmount();
|
||||
|
||||
assertEquals("<?xpacket begin=\"\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>\n" +
|
||||
@@ -523,34 +514,17 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta
|
||||
}
|
||||
|
||||
// now check the contents (like MustangReaderTest)
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
zi.extract(TARGET_PDF);
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF);
|
||||
|
||||
// Reading ZUGFeRD
|
||||
|
||||
String amount = null;
|
||||
String bic = null;
|
||||
String iban = null;
|
||||
String kto = null;
|
||||
String holder = null;
|
||||
String ref = null;
|
||||
if (zi.canParse()) {
|
||||
zi.parse();
|
||||
amount = zi.getAmount();
|
||||
bic = zi.getBIC();
|
||||
iban = zi.getIBAN();
|
||||
kto = zi.getKTO();
|
||||
holder = zi.getHolder();
|
||||
ref = zi.getForeignReference();
|
||||
assertEquals(zi.getAmount(), "571.04");
|
||||
assertEquals(zi.getBIC(), getOwnBIC());
|
||||
assertEquals(zi.getIBAN(), getOwnIBAN());
|
||||
assertEquals(zi.getKTO(), getOwnKto());
|
||||
assertEquals(zi.getHolder(), getOwnOrganisationName());
|
||||
assertEquals(zi.getForeignReference(), getNumber());
|
||||
}
|
||||
|
||||
assertEquals(amount, "571.04");
|
||||
assertEquals(bic, getOwnBIC());
|
||||
assertEquals(iban, getOwnIBAN());
|
||||
assertEquals(kto, getOwnKto());
|
||||
assertEquals(holder, getOwnOrganisationName());
|
||||
assertEquals(ref, getNumber());
|
||||
|
||||
}
|
||||
/*
|
||||
public void testFXExport() throws Exception {
|
||||
|
||||
@@ -578,33 +552,15 @@ public class MustangReaderWriterTest extends TestCase implements IZUGFeRDExporta
|
||||
}
|
||||
|
||||
// now check the contents (like MustangReaderTest)
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter();
|
||||
zi.extract(TARGET_PDF);
|
||||
ZUGFeRDImporter zi = new ZUGFeRDImporter(TARGET_PDF);
|
||||
|
||||
// Reading ZUGFeRD
|
||||
|
||||
String amount = null;
|
||||
String bic = null;
|
||||
String iban = null;
|
||||
String kto = null;
|
||||
String holder = null;
|
||||
String ref = null;
|
||||
if (zi.canParse()) {
|
||||
zi.parse();
|
||||
amount = zi.getAmount();
|
||||
bic = zi.getBIC();
|
||||
iban = zi.getIBAN();
|
||||
kto = zi.getKTO();
|
||||
holder = zi.getHolder();
|
||||
ref = zi.getForeignReference();
|
||||
}
|
||||
|
||||
assertEquals(amount, "571.04");
|
||||
assertEquals(bic, getOwnBIC());
|
||||
assertEquals(iban, getOwnIBAN());
|
||||
assertEquals(kto, getOwnKto());
|
||||
assertEquals(holder, getOwnOrganisationName());
|
||||
assertEquals(ref, getNumber());
|
||||
|
||||
assertEquals(zi.getAmount(), "571.04");
|
||||
assertEquals(zi.getBIC(), getOwnBIC());
|
||||
assertEquals(zi.getIBAN(), getOwnIBAN());
|
||||
assertEquals(zi.getKTO(), getOwnKto());
|
||||
assertEquals(zi.getHolder(), getOwnOrganisationName());
|
||||
assertEquals(zi.getForeignReference(), getNumber());
|
||||
}
|
||||
*/
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user