You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by jg...@apache.org on 2026/03/06 20:52:46 UTC

(xmlgraphics-fop) branch main updated: FOP-3290 Add conf to allow basic links to use URIs instead

This is an automated email from the ASF dual-hosted git repository.

jgoncalves pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/xmlgraphics-fop.git


The following commit(s) were added to refs/heads/main by this push:
     new 3d6e7c5d6 FOP-3290 Add conf to allow basic links to use URIs instead
3d6e7c5d6 is described below

commit 3d6e7c5d631117987cdc82b92c4544b114c77021
Author: Joao Goncalves <an...@gmail.com>
AuthorDate: Wed Mar 4 16:07:03 2026 -0600

    FOP-3290 Add conf to allow basic links to use URIs instead
---
 .../main/java/org/apache/fop/pdf/PDFDocument.java  | 10 +++++
 .../main/java/org/apache/fop/pdf/PDFFactory.java   |  2 +-
 .../apache/fop/render/pdf/PDFRendererConfig.java   |  2 +
 .../apache/fop/render/pdf/PDFRendererOption.java   |  6 +++
 .../fop/render/pdf/PDFRendererOptionsConfig.java   |  6 +++
 .../apache/fop/render/pdf/PDFRenderingUtil.java    |  1 +
 .../org/apache/fop/pdf/PDFFactoryTestCase.java     | 44 ++++++++++++++++++++--
 7 files changed, 67 insertions(+), 4 deletions(-)

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 fcdcbfd37..2fac86989 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
@@ -191,6 +191,8 @@ public class PDFDocument {
 
     private boolean objectStreamsEnabled;
 
+    private boolean forceUriBasicLink;
+
     /**
      * Creates an empty PDF document.
      *
@@ -1335,4 +1337,12 @@ public class PDFDocument {
     public int getObjectCount() {
         return objectcount;
     }
+
+    public boolean isForceUriBasicLink() {
+        return forceUriBasicLink;
+    }
+
+    public void setForceUriBasicLink(boolean forceUriBasicLink) {
+        this.forceUriBasicLink = forceUriBasicLink;
+    }
 }
diff --git a/fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java b/fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
index 1fbe066c9..13404bb7b 100644
--- a/fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
+++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
@@ -593,7 +593,7 @@ public class PDFFactory {
             if (filename == null) {
                 filename = uri.getSchemeSpecificPart();
             }
-            if (scheme == null && filename.toLowerCase().endsWith(".pdf")) {
+            if (scheme == null && filename.toLowerCase().endsWith(".pdf") && !document.isForceUriBasicLink()) {
                 scheme = "file";
             }
             if (scheme == null) {
diff --git a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java
index d27114fa3..12b1b3593 100644
--- a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java
+++ b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererConfig.java
@@ -58,6 +58,7 @@ import static org.apache.fop.render.pdf.PDFEncryptionOption.OWNER_PASSWORD;
 import static org.apache.fop.render.pdf.PDFEncryptionOption.USER_PASSWORD;
 import static org.apache.fop.render.pdf.PDFRendererOption.DISABLE_SRGB_COLORSPACE;
 import static org.apache.fop.render.pdf.PDFRendererOption.FILTER_LIST;
+import static org.apache.fop.render.pdf.PDFRendererOption.FORCE_URI_BASIC_LINK;
 import static org.apache.fop.render.pdf.PDFRendererOption.FORM_XOBJECT;
 import static org.apache.fop.render.pdf.PDFRendererOption.LINEARIZATION;
 import static org.apache.fop.render.pdf.PDFRendererOption.MERGE_FONTS;
@@ -157,6 +158,7 @@ public final class PDFRendererConfig implements RendererConfig {
                 parseAndPut(LINEARIZATION, cfg);
                 parseAndPut(FORM_XOBJECT, cfg);
                 parseAndPut(OBJECT_STREAMS, cfg);
+                parseAndPut(FORCE_URI_BASIC_LINK, cfg);
                 parseAndPut(VERSION, cfg);
                 configureSignParams(cfg);
             } catch (ConfigurationException e) {
diff --git a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOption.java b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOption.java
index 88fab954a..466ffcb88 100644
--- a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOption.java
+++ b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOption.java
@@ -127,6 +127,12 @@ public enum PDFRendererOption implements RendererConfigOption {
         Object deserialize(String value) {
             throw new UnsupportedOperationException();
         }
+    },
+    FORCE_URI_BASIC_LINK("force-uri-basic-link", false) {
+        @Override
+        Boolean deserialize(String value) {
+            return Boolean.valueOf(value);
+        }
     };
 
     private final String name;
diff --git a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java
index 95fd6d932..6c451c2f9 100644
--- a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java
+++ b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java
@@ -34,6 +34,7 @@ import org.apache.fop.pdf.PDFXMode;
 import org.apache.fop.pdf.Version;
 import static org.apache.fop.render.pdf.PDFRendererOption.DISABLE_SRGB_COLORSPACE;
 import static org.apache.fop.render.pdf.PDFRendererOption.FILTER_LIST;
+import static org.apache.fop.render.pdf.PDFRendererOption.FORCE_URI_BASIC_LINK;
 import static org.apache.fop.render.pdf.PDFRendererOption.FORM_XOBJECT;
 import static org.apache.fop.render.pdf.PDFRendererOption.LINEARIZATION;
 import static org.apache.fop.render.pdf.PDFRendererOption.MERGE_FONTS;
@@ -162,4 +163,9 @@ public final class PDFRendererOptionsConfig {
     public Boolean getObjectStreamsEnabled() {
         return (Boolean)properties.get(OBJECT_STREAMS);
     }
+
+    public Boolean getForceUriBasicLinkEnabled() {
+        return (Boolean)properties.get(FORCE_URI_BASIC_LINK);
+    }
+
 }
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 e212a7b3a..3f3e18870 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
@@ -636,6 +636,7 @@ class PDFRenderingUtil {
         pdfDoc.setLinearizationEnabled(rendererConfig.getLinearizationEnabled());
         pdfDoc.setFormXObjectEnabled(rendererConfig.getFormXObjectEnabled());
         pdfDoc.setObjectStreamsEnabled(rendererConfig.getObjectStreamsEnabled());
+        pdfDoc.setForceUriBasicLink(rendererConfig.getForceUriBasicLinkEnabled());
 
         return this.pdfDoc;
     }
diff --git a/fop-core/src/test/java/org/apache/fop/pdf/PDFFactoryTestCase.java b/fop-core/src/test/java/org/apache/fop/pdf/PDFFactoryTestCase.java
index baa39d830..14c9585b8 100644
--- a/fop-core/src/test/java/org/apache/fop/pdf/PDFFactoryTestCase.java
+++ b/fop-core/src/test/java/org/apache/fop/pdf/PDFFactoryTestCase.java
@@ -331,9 +331,7 @@ public class PDFFactoryTestCase {
         }
 
         PDFFactory pdfFactory = new PDFFactory(doc);
-        PDFAction action = pdfFactory.getExternalAction("a", false, originalAltText);
-        action.setObjectNumber(1);
-        action.setDocument(doc);
+        PDFAction action = createPDFAction(pdfFactory, doc, "a", originalAltText);
 
         PDFLink link = pdfFactory.makeLink(new Rectangle(), "a", 0, 0);
         link.setAction(action);
@@ -350,4 +348,44 @@ public class PDFFactoryTestCase {
             return originalAltText;
         }
     }
+
+    @Test
+    public void testExternalActionDefaultBehaviour() throws IOException {
+        ByteArrayOutputStream bos = getOutputFromPdfAction("a.pdf", false);
+        assertTrue("Must use GoToRemote when flag is false", bos.toString().contains("/S /GoToR"));
+    }
+
+    @Test
+    public void testExternalActionForceUriBasicLinkBehaviour() throws IOException {
+        ByteArrayOutputStream bos = getOutputFromPdfAction("a.pdf", true);
+        assertTrue("Must use URI when flag is true", bos.toString().contains("/URI (a.pdf)"));
+    }
+
+    @Test
+    public void testExternalActionNonPdf() throws IOException {
+        ByteArrayOutputStream legacyBos = getOutputFromPdfAction("a.png", true);
+        ByteArrayOutputStream defaultBos = getOutputFromPdfAction("a.png", false);
+
+        assertEquals("Both legacy and default behaviour should use URI for non-PDF files",
+                legacyBos.toString(), defaultBos.toString());
+    }
+
+    private ByteArrayOutputStream getOutputFromPdfAction(String fileName, boolean forceUriBasicLink)
+        throws IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        PDFDocument doc = new PDFDocument("");
+        doc.setForceUriBasicLink(forceUriBasicLink);
+
+        createPDFAction(new PDFFactory(doc), doc, fileName, "").output(bos);
+
+        return bos;
+    }
+
+    private PDFAction createPDFAction(PDFFactory pdfFactory, PDFDocument doc, String fileName, String originalAltText) {
+        PDFAction action = pdfFactory.getExternalAction(fileName, false, originalAltText);
+        action.setObjectNumber(1);
+        action.setDocument(doc);
+
+        return action;
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org