From 8ce79b36789b89c0b920b4b0cfd12f17a9a3c8f6 Mon Sep 17 00:00:00 2001 From: pgjacobs Date: Thu, 26 Feb 2026 12:26:21 +0100 Subject: [PATCH] Configurable PDF Attachment Compression --- .../org/mustangproject/ZUGFeRD/DXExporterFromA1.java | 1 + .../org/mustangproject/ZUGFeRD/DXExporterFromA3.java | 6 +++--- .../org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java | 1 + .../org/mustangproject/ZUGFeRD/OXExporterFromA3.java | 7 +++++-- .../ZUGFeRD/ZUGFeRDExporterFromA3.java | 12 +++++++++++- .../ZUGFeRD/ZUGFeRDExporterFromPDFA.java | 4 ++++ 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/DXExporterFromA1.java b/library/src/main/java/org/mustangproject/ZUGFeRD/DXExporterFromA1.java index f22d76c7..86462375 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/DXExporterFromA1.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/DXExporterFromA1.java @@ -136,6 +136,7 @@ public class DXExporterFromA1 extends DXExporterFromA3 { public DXExporterFromA1 setConformanceLevel(PDFAConformanceLevel newLevel) { return (DXExporterFromA1) super.setConformanceLevel(newLevel); } + @Override public DXExporterFromA1 setProducer(String producer){ return (DXExporterFromA1) super.setProducer(producer); diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/DXExporterFromA3.java b/library/src/main/java/org/mustangproject/ZUGFeRD/DXExporterFromA3.java index 3324e36c..bc0189e8 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/DXExporterFromA3.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/DXExporterFromA3.java @@ -71,6 +71,7 @@ import jakarta.activation.FileDataSource; public class DXExporterFromA3 extends ZUGFeRDExporterFromA3 { protected PDFAConformanceLevel conformanceLevel = PDFAConformanceLevel.UNICODE; + protected boolean compressionEnabled = false; protected ArrayList fileAttachments = new ArrayList<>(); /** @@ -296,8 +297,8 @@ public class DXExporterFromA3 extends ZUGFeRDExporterFromA3 { dict.setString("Desc", description); ByteArrayInputStream fakeFile = new ByteArrayInputStream(data); - PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile); -// ef.addCompression(); + COSName filter = compressionEnabled ? COSName.FLATE_DECODE : null; + PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile, filter); ef.setSubtype(subType); ef.setSize(data.length); ef.setCreationDate(new GregorianCalendar()); @@ -417,7 +418,6 @@ public class DXExporterFromA3 extends ZUGFeRDExporterFromA3 { return this; } - @Override public DXExporterFromA3 setCreator(String creator) { this.creator = creator; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java index fd4ffb4c..ca84cc26 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/IZUGFeRDExporter.java @@ -56,6 +56,7 @@ public interface IZUGFeRDExporter extends Closeable, IExporter { public IZUGFeRDExporter load(InputStream pdfSource) throws IOException; public IZUGFeRDExporter setCreator(String creator); public IZUGFeRDExporter setConformanceLevel(PDFAConformanceLevel newLevel); + public IZUGFeRDExporter setEnablePDFAttachmentCompression(boolean enablePDFAttachmentCompression); public IZUGFeRDExporter setProducer(String producer); public IZUGFeRDExporter setZUGFeRDVersion(int version); public boolean ensurePDFIsValid(final DataSource dataSource) throws IOException; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/OXExporterFromA3.java b/library/src/main/java/org/mustangproject/ZUGFeRD/OXExporterFromA3.java index 5db1a693..542b4249 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/OXExporterFromA3.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/OXExporterFromA3.java @@ -129,6 +129,9 @@ public class OXExporterFromA3 extends ZUGFeRDExporterFromA3 { private boolean attachZUGFeRDHeaders = true; + /** Defines whether attachments to the PDF should be using FLATE compression */ + private boolean compressionEnabled = false; + /** * 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) @@ -296,8 +299,8 @@ public class OXExporterFromA3 extends ZUGFeRDExporterFromA3 { dict.setString("Desc", description); ByteArrayInputStream fakeFile = new ByteArrayInputStream(data); - PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile); -// ef.addCompression(); + COSName filter = compressionEnabled ? COSName.FLATE_DECODE : null; + PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile, filter); ef.setSubtype(subType); ef.setSize(data.length); ef.setCreationDate(new GregorianCalendar()); diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3.java index efd1d94d..7b18ea79 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromA3.java @@ -101,6 +101,9 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte private Profile profile = null; protected boolean documentPrepared = false; + /** Defines whether attachments to the PDF should be using FLATE compression */ + private boolean compressionEnabled = false; + /** * Data (XML invoice) to be added to the ZUGFeRD PDF. It may be externally set, * in which case passing a IZUGFeRDExportableTransaction is not necessary. By @@ -392,7 +395,8 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte dict.setString("Desc", description); ByteArrayInputStream fakeFile = new ByteArrayInputStream(data); - PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile, COSName.FLATE_DECODE); + COSName filter = compressionEnabled ? COSName.FLATE_DECODE : null; + PDEmbeddedFile ef = new PDEmbeddedFile(doc, fakeFile, filter); // ef.addCompression(); ef.setSubtype(subType); ef.setSize(data.length); @@ -503,6 +507,12 @@ public class ZUGFeRDExporterFromA3 extends XRExporter implements IZUGFeRDExporte return this; } + @Override + public IZUGFeRDExporter setEnablePDFAttachmentCompression(boolean compressionEnabled) { + this.compressionEnabled = compressionEnabled; + return this; + } + public ZUGFeRDExporterFromA3 setCreator(String creator) { this.creator = creator; diff --git a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromPDFA.java b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromPDFA.java index 12653cdf..c9519fb5 100644 --- a/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromPDFA.java +++ b/library/src/main/java/org/mustangproject/ZUGFeRD/ZUGFeRDExporterFromPDFA.java @@ -188,6 +188,10 @@ public class ZUGFeRDExporterFromPDFA implements IZUGFeRDExporter { return getExporter().setConformanceLevel(newLevel); } + public IZUGFeRDExporter setEnablePDFAttachmentCompression(boolean compressionEnabled) { + return getExporter().setEnablePDFAttachmentCompression(compressionEnabled); + } + public IZUGFeRDExporter setProducer(String producer) { return getExporter().setProducer(producer);