2025-04-17 18:08:09 +02:00
|
|
|
--- a/fop-core/src/main/java/org/apache/fop/pdf/FileIDGenerator.java
|
|
|
|
+++ b/fop-core/src/main/java/org/apache/fop/pdf/FileIDGenerator.java
|
|
|
|
@@ -86,7 +86,9 @@ abstract class FileIDGenerator {
|
|
|
|
|
|
|
|
private void generateFileID() {
|
|
|
|
DateFormat df = new SimpleDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS");
|
|
|
|
- digest.update(PDFDocument.encode(df.format(new Date())));
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ Date d = (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde));
|
|
|
|
+ digest.update(PDFDocument.encode(df.format(d)));
|
|
|
|
// Ignoring the filename here for simplicity even though it's recommended
|
|
|
|
// by the PDF spec
|
|
|
|
digest.update(PDFDocument.encode(String.valueOf(document.getCurrentFileSize())));
|
|
|
|
--- a/fop-core/src/main/java/org/apache/fop/pdf/PDFEmbeddedFile.java
|
|
|
|
+++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFEmbeddedFile.java
|
|
|
|
@@ -35,8 +35,10 @@ public class PDFEmbeddedFile extends PDFStream {
|
|
|
|
put("Type", new PDFName("EmbeddedFile"));
|
|
|
|
put("Subtype", new PDFName("application/octet-stream"));
|
|
|
|
PDFDictionary params = new PDFDictionary();
|
|
|
|
- params.put("CreationDate", PDFInfo.formatDateTime(new Date()));
|
|
|
|
- params.put("ModDate", PDFInfo.formatDateTime(new Date()));
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ Date d = (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde));
|
|
|
|
+ params.put("CreationDate", PDFInfo.formatDateTime(d));
|
|
|
|
+ params.put("ModDate", PDFInfo.formatDateTime(d));
|
|
|
|
put("Params", params);
|
|
|
|
}
|
|
|
|
|
|
|
|
--- a/fop-core/src/main/java/org/apache/fop/pdf/PDFInfo.java
|
|
|
|
+++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFInfo.java
|
|
|
|
@@ -251,7 +251,8 @@ public class PDFInfo extends PDFObject {
|
|
|
|
|
|
|
|
// creation date in form (D:YYYYMMDDHHmmSSOHH'mm')
|
|
|
|
if (creationDate == null) {
|
|
|
|
- creationDate = new Date();
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ creationDate = (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde));
|
|
|
|
}
|
|
|
|
bout.write(encode("/CreationDate "));
|
|
|
|
bout.write(encodeString(formatDateTime(creationDate)));
|
2024-05-04 02:10:43 +02:00
|
|
|
--- a/fop-core/src/main/java/org/apache/fop/pdf/PDFMetadata.java
|
|
|
|
+++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFMetadata.java
|
2025-04-17 18:08:09 +02:00
|
|
|
@@ -135,7 +135,8 @@ public class PDFMetadata extends PDFStream {
|
2024-05-04 02:10:43 +02:00
|
|
|
|
|
|
|
//Set creation date if not available, yet
|
|
|
|
if (info.getCreationDate() == null) {
|
|
|
|
- Date d = new Date();
|
2025-04-17 18:08:09 +02:00
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ Date d = (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde));
|
2024-05-04 02:10:43 +02:00
|
|
|
info.setCreationDate(d);
|
|
|
|
}
|
|
|
|
|
2025-04-17 18:08:09 +02:00
|
|
|
--- a/fop-core/src/main/java/org/apache/fop/pdf/PDFSignature.java
|
|
|
|
+++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFSignature.java
|
|
|
|
@@ -106,7 +106,9 @@ public class PDFSignature {
|
|
|
|
if (signParams.getReason() != null) {
|
|
|
|
put("Reason", signParams.getReason());
|
|
|
|
}
|
|
|
|
- put("M", PDFInfo.formatDateTime(new Date()));
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ Date d = (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde));
|
|
|
|
+ put("M", PDFInfo.formatDateTime(d));
|
|
|
|
PDFArray array = new PDFArray();
|
|
|
|
array.add(new SigRef());
|
|
|
|
put("Reference", array);
|
|
|
|
--- 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,9 @@ public class IFRenderer extends AbstractPathOrientedRenderer {
|
|
|
|
} else {
|
|
|
|
xmpBasic.setCreatorTool(Version.getVersion());
|
|
|
|
}
|
|
|
|
- xmpBasic.setMetadataDate(new java.util.Date());
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ java.util.Date d = (sde == null) ? new java.util.Date() : new java.util.Date(1000 * Long.parseLong(sde));
|
|
|
|
+ xmpBasic.setMetadataDate(d);
|
|
|
|
if (getUserAgent().getCreationDate() != null) {
|
|
|
|
xmpBasic.setCreateDate(getUserAgent().getCreationDate());
|
|
|
|
} else {
|
|
|
|
--- 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,9 @@ class PDFRenderingUtil {
|
|
|
|
fopXMP.mergeInto(docXMP, exclude);
|
|
|
|
XMPBasicAdapter xmpBasic = XMPBasicSchema.getAdapter(docXMP);
|
|
|
|
//Metadata was changed so update metadata date
|
|
|
|
- xmpBasic.setMetadataDate(new java.util.Date());
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ java.util.Date d = (sde == null) ? new java.util.Date() : new java.util.Date(1000 * Long.parseLong(sde));
|
|
|
|
+ xmpBasic.setMetadataDate(d);
|
|
|
|
PDFMetadata.updateInfoFromMetadata(docXMP, pdfDoc.getInfo());
|
|
|
|
|
|
|
|
PDFMetadata pdfMetadata = pdfDoc.getFactory().makeMetadata(
|
|
|
|
@@ -481,7 +483,9 @@ class PDFRenderingUtil {
|
|
|
|
augmentDictionary((PDFDictionary)currentPage.get("DPart"), extension);
|
|
|
|
}
|
|
|
|
} else if (type == PDFDictionaryType.PagePiece) {
|
|
|
|
- String date = DateFormatUtil.formatPDFDate(new Date(), TimeZone.getDefault());
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ Date dd = (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde));
|
|
|
|
+ String date = DateFormatUtil.formatPDFDate(dd, TimeZone.getDefault());
|
|
|
|
if (currentPage.get("PieceInfo") == null) {
|
|
|
|
currentPage.put("PieceInfo", new PDFDictionary());
|
|
|
|
currentPage.put("LastModified", date);
|
|
|
|
--- a/fop-core/src/main/java/org/apache/fop/render/ps/PSDocumentHandler.java
|
|
|
|
+++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSDocumentHandler.java
|
|
|
|
@@ -211,7 +211,9 @@ public class PSDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
|
|
|
|
//PostScript Header
|
|
|
|
gen.writeln(DSCConstants.PS_ADOBE_30);
|
|
|
|
gen.writeDSCComment(DSCConstants.CREATOR, new String[] {getUserAgent().getProducer()});
|
|
|
|
- gen.writeDSCComment(DSCConstants.CREATION_DATE, new Object[] {new java.util.Date()});
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ java.util.Date d = (sde == null) ? new java.util.Date() : new java.util.Date(1000 * Long.parseLong(sde));
|
|
|
|
+ gen.writeDSCComment(DSCConstants.CREATION_DATE, new Object[] {d});
|
|
|
|
gen.writeDSCComment(DSCConstants.LANGUAGE_LEVEL, gen.getPSLevel());
|
|
|
|
gen.writeDSCComment(DSCConstants.PAGES, new Object[] {DSCConstants.ATEND});
|
|
|
|
gen.writeDSCComment(DSCConstants.BBOX, DSCConstants.ATEND);
|
|
|
|
--- a/fop-core/src/main/java/org/apache/fop/tools/anttasks/FileCompare.java
|
|
|
|
+++ b/fop-core/src/main/java/org/apache/fop/tools/anttasks/FileCompare.java
|
|
|
|
@@ -149,8 +149,10 @@ public class FileCompare {
|
|
|
|
}
|
|
|
|
|
|
|
|
private void writeHeader(PrintWriter results) {
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ Date d = (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde));
|
|
|
|
String dateTime = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
|
|
|
|
- DateFormat.MEDIUM).format(new Date());
|
|
|
|
+ DateFormat.MEDIUM).format(d);
|
|
|
|
results.println("<html><head><title>Test Results</title></head><body>\n");
|
|
|
|
results.println("<h2>Compare Results<br>");
|
|
|
|
results.println("<font size='1'>created " + dateTime
|
|
|
|
--- a/fop-core/src/test/java/org/apache/fop/render/rtf/rtflib/testdocs/TestDocument.java
|
|
|
|
+++ b/fop-core/src/test/java/org/apache/fop/render/rtf/rtflib/testdocs/TestDocument.java
|
|
|
|
@@ -82,7 +82,8 @@ abstract class TestDocument {
|
|
|
|
para.newLineBreak();
|
|
|
|
para.newText("generated by class " + getClass().getName());
|
|
|
|
para.newLineBreak();
|
|
|
|
- para.newText("generated on " + new Date());
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ para.newText("generated on " + (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde)));
|
|
|
|
para.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
--- a/fop/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java
|
|
|
|
+++ b/fop/examples/plan/src/org/apache/fop/plan/SimplePlanDrawer.java
|
|
|
|
@@ -129,7 +129,8 @@ public class SimplePlanDrawer implements PlanDrawer {
|
|
|
|
}
|
|
|
|
|
|
|
|
protected void addPlan(Document doc, Element svgRoot, EventList data) {
|
|
|
|
- Date currentDate = new Date();
|
|
|
|
+ String sde = System.getenv("SOURCE_DATE_EPOCH");
|
|
|
|
+ Date currentDate = (sde == null) ? new Date() : new Date(1000 * Long.parseLong(sde));
|
|
|
|
|
|
|
|
Date lastWeek = startDate;
|
|
|
|
Date future = endDate;
|