aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Steiner <ssteiner@apache.org>2024-09-18 13:16:21 +0100
committerSimon Steiner <ssteiner@apache.org>2024-09-18 13:16:21 +0100
commit7fcf3ca57185dac5fbf30874a64e5a047340d402 (patch)
tree56ae0056cacaee7689175b5eb4b634327b1d1051
parentdeb2c2cbc18790ed8ad17303f841a178441e1a6a (diff)
downloadxmlgraphics-fop-7fcf3ca57185dac5fbf30874a64e5a047340d402.tar.gz
xmlgraphics-fop-7fcf3ca57185dac5fbf30874a64e5a047340d402.zip
FOP-3207: Add warning when different pdf languages are used
-rw-r--r--fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java4
-rw-r--r--fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java6
-rw-r--r--fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java10
-rw-r--r--fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml1
-rw-r--r--fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java111
5 files changed, 90 insertions, 42 deletions
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 40370f705..12a6c3e09 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
@@ -1707,4 +1707,8 @@ public class PDFFactory {
public void setEventBroadcaster(EventBroadcaster eventBroadcaster) {
this.eventBroadcaster = eventBroadcaster;
}
+
+ public EventBroadcaster getEventBroadcaster() {
+ return eventBroadcaster;
+ }
}
diff --git a/fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java b/fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java
index b230ad879..7b6038467 100644
--- a/fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java
+++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.io.OutputStream;
import java.util.Locale;
+import org.apache.fop.render.pdf.PDFEventProducer;
import org.apache.fop.util.LanguageTags;
/**
@@ -287,6 +288,11 @@ public class PDFRoot extends PDFDictionary {
}
private void setLanguage(String lang) {
+ Object oldLang = get("Lang");
+ if (oldLang != null && !"x-unknown".equals(oldLang) && !lang.equals(oldLang)) {
+ PDFEventProducer eventProducer = PDFEventProducer.Provider.get(document.getFactory().getEventBroadcaster());
+ eventProducer.languageChanged(this, oldLang, lang);
+ }
put("Lang", lang);
}
diff --git a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java
index 24d0eb0cf..b78b472c5 100644
--- a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java
+++ b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java
@@ -90,4 +90,14 @@ public interface PDFEventProducer extends EventProducer {
* @event.severity ERROR
*/
void unpairedSurrogate(Object source);
+
+ /**
+ * The language was changed between pages
+ *
+ * @param source the event source
+ * @param oldLang current language
+ * @param newLang new language
+ * @event.severity WARN
+ */
+ void languageChanged(Object source, Object oldLang, String newLang);
}
diff --git a/fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml b/fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml
index bc0518275..d33d9913d 100644
--- a/fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml
+++ b/fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml
@@ -5,4 +5,5 @@
<message key="incorrectEncryptionLength">Encryption length must be a multiple of 8 between 40 and 128. Setting encryption length to {correctedValue} instead of {originalValue}.</message>
<message key="unknownLanguage">A piece of text or an image’s alternate text is missing language information [(See position {location})|(No context info available)]</message>
<message key="unpairedSurrogate">A unicode char map was found to end with an unpaired surrogate.</message>
+ <message key="languageChanged">Input has xml:lang {oldLang} and {newLang}, PDF will only use {newLang}</message>
</catalogue>
diff --git a/fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java b/fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java
index 67703c1ff..11470abd3 100644
--- a/fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java
+++ b/fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java
@@ -1,42 +1,69 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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
- *
- * 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.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/* $Id: PDFFactoryTestCase.java 1823552 2018-02-08 12:26:33Z ssteiner $ */
-
-package org.apache.fop.pdf;
-
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-
-public class PDFRootTestCase {
-
- @Test
- public void testAddAf() {
- String germanAe = "\u00E4";
- String unicodeFilename = "t" + germanAe + "st.pdf";
- PDFFileSpec fileSpec = new PDFFileSpec(unicodeFilename);
-
- String filename = fileSpec.getFilename();
-
- PDFDocument doc = new PDFDocument("");
- doc.getRoot().addAF(fileSpec);
-
- assertEquals(filename, fileSpec.getFilename());
- assertEquals(unicodeFilename, fileSpec.getUnicodeFilename());
- }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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
+ *
+ * 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.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+package org.apache.fop.pdf;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.junit.Assert;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.FopFactory;
+import org.apache.fop.events.Event;
+import org.apache.fop.events.EventListener;
+
+public class PDFRootTestCase {
+
+ @Test
+ public void testAddAf() {
+ String germanAe = "\u00E4";
+ String unicodeFilename = "t" + germanAe + "st.pdf";
+ PDFFileSpec fileSpec = new PDFFileSpec(unicodeFilename);
+
+ String filename = fileSpec.getFilename();
+
+ PDFDocument doc = new PDFDocument("");
+ doc.getRoot().addAF(fileSpec);
+
+ assertEquals(filename, fileSpec.getFilename());
+ assertEquals(unicodeFilename, fileSpec.getUnicodeFilename());
+ }
+
+ @Test
+ public void testLanguage() {
+ PDFDocument document = new PDFDocument("");
+ FOUserAgent ua = FopFactory.newInstance(new File(".").toURI()).newFOUserAgent();
+ final List<Event> events = new ArrayList<>();
+ ua.getEventBroadcaster().addEventListener(new EventListener() {
+ public void processEvent(Event event) {
+ events.add(event);
+ }
+ });
+ document.getFactory().setEventBroadcaster(ua.getEventBroadcaster());
+ PDFRoot root = new PDFRoot(document, new PDFPages(document));
+ root.setLanguage(Locale.US);
+ Assert.assertTrue(events.isEmpty());
+ root.setLanguage(Locale.UK);
+ assertEquals(events.get(0).getEventKey(), "languageChanged");
+ }
+}