Skip to content

Commit

Permalink
Merge pull request #344 from 5now/#341_make-input-pdf-a-version-trans…
Browse files Browse the repository at this point in the history
…parent

#341 make input pdf a version transparent
  • Loading branch information
jstaerk authored Nov 22, 2023
2 parents 866ef8d + 43241ea commit 860d934
Show file tree
Hide file tree
Showing 5 changed files with 197 additions and 17 deletions.
22 changes: 8 additions & 14 deletions Mustang-CLI/src/main/java/org/mustangproject/commandline/Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,27 +21,19 @@
import org.apache.commons.cli.*;
import org.mustangproject.CII.CIIToUBL;
import org.mustangproject.EStandard;
import org.mustangproject.FileAttachment;
import org.mustangproject.ZUGFeRD.*;
import org.mustangproject.validator.Validator;
import org.mustangproject.validator.ZUGFeRDValidator;
import org.mustangproject.FileAttachment;
import org.slf4j.LoggerFactory;

import javax.xml.transform.TransformerException;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;

/*
* This is the command line interface to mustangproject
*
*/

import org.slf4j.LoggerFactory;

import javax.xml.transform.TransformerException;

public class Main {
private static org.slf4j.Logger LOGGER; // log output
private static void printUsage() {
Expand Down Expand Up @@ -716,8 +708,10 @@ private static void performCombine(String pdfName, String xmlName, String outNam
}

} else {
ze = new ZUGFeRDExporterFromA1().setProducer("Mustang-cli")
.setZUGFeRDVersion(standard, zfIntVersion)
ze = new ZUGFeRDExporterFromPDFA().load(pdfName);

ze.setProducer("Mustang-cli")
.setZUGFeRDVersion(zfIntVersion)
.setCreator(System.getProperty("user.name")).setProfile(zfConformanceLevelProfile);
if (ignoreInputErrors) {
((ZUGFeRDExporterFromA1) ze).ignorePDFAErrors();
Expand All @@ -727,7 +721,7 @@ private static void performCombine(String pdfName, String xmlName, String outNam
((ZUGFeRDExporterFromA3) ze).attachFile(attachment.getFilename(), attachment.getData(), attachment.getMimetype(), attachment.getRelation());
}

ze = ze.load(pdfName);
// ze = ze.load(pdfName);

if (format.equals("zf")) {
ze.disableFacturX();
Expand Down
Binary file added Mustang-CLI/src/test/resources/EmptyPDFA1.pdf
Binary file not shown.
4 changes: 2 additions & 2 deletions library/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,8 @@
<!-- http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven
mvn clean compile assembly:single -->
<!-- or whatever version you use -->
<source>8</source>
<target>8</target>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public interface IZUGFeRDExporter extends Closeable, IExporter {
public boolean ensurePDFIsValid(final DataSource dataSource) throws IOException;
public IZUGFeRDExporter setXML(byte[] zugferdData) throws IOException;
public IZUGFeRDExporter disableFacturX();
// public IZUGFeRDExporter setProfile(Profile zugferdConformanceLevel);
public IZUGFeRDExporter setProfile(Profile zugferdConformanceLevel);
public String getNamespaceForVersion(int ver);
public String getPrefixForVersion(int ver) ;
public IZUGFeRDExporter disableAutoClose(boolean disableAutoClose);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
/**
* *********************************************************************
* <p>
* Copyright 2018 Jochen Staerk
* <p>
* Use is subject to license terms.
* <p>
* 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.
* <p>
* 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.
* <p>
* See the License for the specific language governing permissions and
* limitations under the License.
* <p>
* **********************************************************************
*/
package org.mustangproject.ZUGFeRD;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.common.PDMetadata;
import org.apache.xmpbox.XMPMetadata;
import org.apache.xmpbox.schema.PDFAIdentificationSchema;
import org.apache.xmpbox.xml.DomXmpParser;
import org.apache.xmpbox.xml.XmpParsingException;

import javax.activation.DataSource;
import java.io.*;

public class ZUGFeRDExporterFromPDFA implements IZUGFeRDExporter {
protected IZUGFeRDExporter theExporter;

public IZUGFeRDExporter load(String pdfFilename) throws IOException {
if (getPDFAVersion(fileToByteArrayInputStream(pdfFilename)) < 2) {
theExporter = new ZUGFeRDExporterFromA1();
} else if (getPDFAVersion(fileToByteArrayInputStream(pdfFilename)) >= 3) {
theExporter = new ZUGFeRDExporterFromA3();
}
return theExporter.load(pdfFilename);
}

private byte[] fileToByteArrayInputStream(String pdfFilename) throws IOException {
FileInputStream fileInputStream = new FileInputStream(pdfFilename);
return fileInputStream.readAllBytes();
}

private int getPDFAVersion(byte[] byteArrayInputStream) throws IOException {
// PDFBOX to be here...
PDDocument document = PDDocument.load(byteArrayInputStream);
PDDocumentCatalog catalog = document.getDocumentCatalog();
PDMetadata metadata = catalog.getMetadata();

if (metadata != null) {
try {
DomXmpParser xmpParser = new DomXmpParser();
XMPMetadata xmp = xmpParser.parse(metadata.createInputStream());

PDFAIdentificationSchema pdfaSchema = xmp.getPDFIdentificationSchema();
if (pdfaSchema != null) {
return pdfaSchema.getPart();
}
} catch (XmpParsingException e) {
e.printStackTrace();
} finally {
document.close();
}
}
return 0;
}

/**
* 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 pdfBinary binary of a PDF/A1 compliant document
* @return the generated exporter
* @throws IOException (should not happen at all)
*/
public IZUGFeRDExporter load(byte[] pdfBinary) throws IOException {
if (getPDFAVersion(pdfBinary) >= 3) {
theExporter = new ZUGFeRDExporterFromA3();
} else if (getPDFAVersion(pdfBinary) < 2) {
theExporter = new ZUGFeRDExporterFromA1();
}
return theExporter.load(pdfBinary);
}


/**
* 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 pdfSource source to read a PDF/A1 compliant document from
* @return the generated ZUGFeRDExporter
* @throws IOException if anything is wrong with inputstream
*/
public IZUGFeRDExporter load(InputStream pdfSource) throws IOException {
if (getPDFAVersion(pdfSource.readAllBytes()) >= 3) {
theExporter = new ZUGFeRDExporterFromA3();
} else if (getPDFAVersion(pdfSource.readAllBytes()) < 2) {
theExporter = new ZUGFeRDExporterFromA1();
}
return theExporter.load(pdfSource);
}

public IZUGFeRDExporter setCreator(String creator) {
return theExporter.setCreator(creator);
}

public ZUGFeRDExporterFromPDFA setProfile(Profile p) {
return (ZUGFeRDExporterFromPDFA) theExporter.setProfile(p);
}

public ZUGFeRDExporterFromPDFA setProfile(String profileName) {
Profile p = Profiles.getByName(profileName);
return (ZUGFeRDExporterFromPDFA) theExporter.setProfile(p);
}

public IZUGFeRDExporter setConformanceLevel(PDFAConformanceLevel newLevel) {
return theExporter.setConformanceLevel(newLevel);
}

public IZUGFeRDExporter setProducer(String producer) {
return theExporter.setProducer(producer);
}

public IZUGFeRDExporter setZUGFeRDVersion(int version) {

return theExporter.setZUGFeRDVersion(version);

}

public boolean ensurePDFIsValid(final DataSource dataSource) throws IOException {
return theExporter.ensurePDFIsValid(dataSource);
}

public IZUGFeRDExporter setXML(byte[] zugferdData) throws IOException {
return theExporter.setXML(zugferdData);
}

public IZUGFeRDExporter disableFacturX() {
return theExporter.disableFacturX();
}

// public IZUGFeRDExporter setProfile(Profile zugferdConformanceLevel);
public String getNamespaceForVersion(int ver) {
return theExporter.getNamespaceForVersion(ver);
}

public String getPrefixForVersion(int ver) {
return theExporter.getPrefixForVersion(ver);
}

public IZUGFeRDExporter disableAutoClose(boolean disableAutoClose) {
return theExporter.disableAutoClose(disableAutoClose);
}

public IXMLProvider getProvider() {
return theExporter.getProvider();
}

@Override
public void close() throws IOException {
theExporter.close();
}

@Override
public IExporter setTransaction(IExportableTransaction trans) throws IOException {
return theExporter.setTransaction(trans);
}

@Override
public void export(String ZUGFeRDfilename) throws IOException {
theExporter.export(ZUGFeRDfilename);
}

@Override
public void export(OutputStream output) throws IOException {
theExporter.export(output);
}
}

0 comments on commit 860d934

Please sign in to comment.