diff options
author | Simon Steiner <ssteiner@apache.org> | 2024-09-18 13:16:21 +0100 |
---|---|---|
committer | Simon Steiner <ssteiner@apache.org> | 2024-09-18 13:16:21 +0100 |
commit | 7fcf3ca57185dac5fbf30874a64e5a047340d402 (patch) | |
tree | 56ae0056cacaee7689175b5eb4b634327b1d1051 | |
parent | deb2c2cbc18790ed8ad17303f841a178441e1a6a (diff) | |
download | xmlgraphics-fop-7fcf3ca57185dac5fbf30874a64e5a047340d402.tar.gz xmlgraphics-fop-7fcf3ca57185dac5fbf30874a64e5a047340d402.zip |
FOP-3207: Add warning when different pdf languages are used
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"); + } +} |