From 22aed670d5e3ac360f327ca1dbfd1bb7cbf240ec Mon Sep 17 00:00:00 2001 From: "Bernhard M. Wiedemann" Date: Wed, 23 Dec 2020 13:53:56 +0100 Subject: [PATCH 1/3] FOP-2854: Allow to override CreationDate Allow to override build date with SOURCE_DATE_EPOCH in order to make builds reproducible. See https://reproducible-builds.org/ for why this is good and https://reproducible-builds.org/specs/source-date-epoch/ for the definition of this variable. This patch was done while working on reproducible builds for openSUSE. --- fop-core/src/main/java/org/apache/fop/pdf/PDFMetadata.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fop-core/src/main/java/org/apache/fop/pdf/PDFMetadata.java b/fop-core/src/main/java/org/apache/fop/pdf/PDFMetadata.java index ce8cfdf2d8c..6eb38975abf 100644 --- a/fop-core/src/main/java/org/apache/fop/pdf/PDFMetadata.java +++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFMetadata.java @@ -135,7 +135,9 @@ public static Metadata createXMPFromPDFDocument(PDFDocument pdfDoc) { //Set creation date if not available, yet if (info.getCreationDate() == null) { - Date d = new Date(); + Date d = System.getenv("SOURCE_DATE_EPOCH") == null ? + new Date() : + new Date(1000 * Long.parseLong(System.getenv("SOURCE_DATE_EPOCH"))); info.setCreationDate(d); } From 15eb59eb26fca03900332c9404aaf2062b894a29 Mon Sep 17 00:00:00 2001 From: "Bernhard M. Wiedemann" Date: Fri, 2 Aug 2024 09:59:25 +0200 Subject: [PATCH 2/3] Override 2 more dates --- .../java/org/apache/fop/render/intermediate/IFRenderer.java | 5 ++++- .../java/org/apache/fop/render/pdf/PDFRenderingUtil.java | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/fop-core/src/main/java/org/apache/fop/render/intermediate/IFRenderer.java b/fop-core/src/main/java/org/apache/fop/render/intermediate/IFRenderer.java index 84e4e3a2c49..022a7a7a687 100644 --- a/fop-core/src/main/java/org/apache/fop/render/intermediate/IFRenderer.java +++ b/fop-core/src/main/java/org/apache/fop/render/intermediate/IFRenderer.java @@ -544,7 +544,10 @@ private Metadata createDefaultDocumentMetadata() { } else { xmpBasic.setCreatorTool(Version.getVersion()); } - xmpBasic.setMetadataDate(new java.util.Date()); + java.util.Date d = System.getenv("SOURCE_DATE_EPOCH") == null ? + new java.util.Date() : + new java.util.Date(1000 * Long.parseLong(System.getenv("SOURCE_DATE_EPOCH"))); + xmpBasic.setMetadataDate(d); if (getUserAgent().getCreationDate() != null) { xmpBasic.setCreateDate(getUserAgent().getCreationDate()); } else { diff --git a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRenderingUtil.java b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRenderingUtil.java index 8a6ebe5be70..b6a60341cb9 100644 --- a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRenderingUtil.java +++ b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRenderingUtil.java @@ -262,7 +262,10 @@ public void renderXMPMetadata(XMPMetadata metadata) { fopXMP.mergeInto(docXMP, exclude); XMPBasicAdapter xmpBasic = XMPBasicSchema.getAdapter(docXMP); //Metadata was changed so update metadata date - xmpBasic.setMetadataDate(new java.util.Date()); + java.util.Date d = System.getenv("SOURCE_DATE_EPOCH") == null ? + new java.util.Date() : + new java.util.Date(1000 * Long.parseLong(System.getenv("SOURCE_DATE_EPOCH"))); + xmpBasic.setMetadataDate(d); PDFMetadata.updateInfoFromMetadata(docXMP, pdfDoc.getInfo()); PDFMetadata pdfMetadata = pdfDoc.getFactory().makeMetadata( From d11c480cb8c06295f6567610157503038f1e6c17 Mon Sep 17 00:00:00 2001 From: "Bernhard M. Wiedemann" Date: Fri, 2 Aug 2024 10:51:53 +0200 Subject: [PATCH 3/3] [WIP] override fileIDs --- fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java b/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java index 34421858ae2..460290faef0 100644 --- a/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java +++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java @@ -1182,7 +1182,7 @@ private TrailerDictionary createTrailerDictionary(boolean addRoot) { if (addRoot) { trailerDictionary.setRoot(root).setInfo(info); } - trailerDictionary.setFileID(gen.getOriginalFileID(), gen.getUpdatedFileID()); + trailerDictionary.setFileID("279B5BE7BC0E1B4FE4D4A16B1C28B990".getBytes(), "3D096A7D6223E7A468C7AB8CAD3F6602".getBytes()); if (isEncryptionActive()) { trailerDictionary.setEncryption(encryption); }