From 7fcf3ca57185dac5fbf30874a64e5a047340d402 Mon Sep 17 00:00:00 2001 From: Simon Steiner Date: Wed, 18 Sep 2024 13:16:21 +0100 Subject: [PATCH] FOP-3207: Add warning when different pdf languages are used --- .../java/org/apache/fop/pdf/PDFFactory.java | 4 + .../main/java/org/apache/fop/pdf/PDFRoot.java | 6 + .../fop/render/pdf/PDFEventProducer.java | 10 ++ .../fop/render/pdf/PDFEventProducer.xml | 1 + .../org/apache/fop/pdf/PDFRootTestCase.java | 111 +++++++++++------- 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 @@ 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 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 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"); + } +} -- 2.39.5