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 40370f70518..12a6c3e09fe 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 PDFDPartRoot makeDPartRoot() {
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 b230ad87964..7b603846794 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.OutputStream;
import java.util.Locale;
+import org.apache.fop.render.pdf.PDFEventProducer;
import org.apache.fop.util.LanguageTags;
/**
@@ -287,6 +288,11 @@ public void setLanguage(Locale locale) {
}
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 24d0eb0cf6a..b78b472c50a 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 static PDFEventProducer get(EventBroadcaster broadcaster) {
* @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 bc0518275bf..d33d9913dbd 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 @@
Encryption length must be a multiple of 8 between 40 and 128. Setting encryption length to {correctedValue} instead of {originalValue}.
A piece of text or an image’s alternate text is missing language information [(See position {location})|(No context info available)]
A unicode char map was found to end with an unpaired surrogate.
+ Input has xml:lang {oldLang} and {newLang}, PDF will only use {newLang}
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 67703c1ff78..11470abd3fb 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 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");
+ }
+}