]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
FOP-3207: Add warning when different pdf languages are used
authorSimon Steiner <ssteiner@apache.org>
Wed, 18 Sep 2024 12:16:21 +0000 (13:16 +0100)
committerSimon Steiner <ssteiner@apache.org>
Wed, 18 Sep 2024 12:16:21 +0000 (13:16 +0100)
fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java
fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java
fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml
fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java

index 40370f70518d23c1c53a83ed3ea80c9ca45d6497..12a6c3e09fe93a2240985ab61c81e8d4183247db 100644 (file)
@@ -1707,4 +1707,8 @@ public class PDFFactory {
     public void setEventBroadcaster(EventBroadcaster eventBroadcaster) {
         this.eventBroadcaster = eventBroadcaster;
     }
+
+    public EventBroadcaster getEventBroadcaster() {
+        return eventBroadcaster;
+    }
 }
index b230ad879647dc14f65c11026ae100e232b1a79d..7b6038467948cdd0f44fdc9f5838c555a414b393 100644 (file)
@@ -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);
     }
 
index 24d0eb0cf6a736d81af959bef88b801346ce3a22..b78b472c50a48049ec27ffab9e63aef3f9f0ec1d 100644 (file)
@@ -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);
 }
index bc0518275bf0f088d6cad90eb541eddb9aff340e..d33d9913dbde52d6e0dc520f179e6327a06446ca 100644 (file)
@@ -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>
index 67703c1ff78f25af24fa3ad46279ac930c1b29b5..11470abd3fbee3c11de89b3fa64c6d655b93d7b8 100644 (file)
@@ -1,42 +1,69 @@
-/*\r
- * Licensed to the Apache Software Foundation (ASF) under one or more\r
- * contributor license agreements.  See the NOTICE file distributed with\r
- * this work for additional information regarding copyright ownership.\r
- * The ASF licenses this file to You under the Apache License, Version 2.0\r
- * (the "License"); you may not use this file except in compliance with\r
- * the License.  You may obtain a copy of the License at\r
- *\r
- *      http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-/* $Id: PDFFactoryTestCase.java 1823552 2018-02-08 12:26:33Z ssteiner $ */\r
-\r
-package org.apache.fop.pdf;\r
-\r
-import org.junit.Test;\r
-\r
-import static org.junit.Assert.assertEquals;\r
-\r
-public class PDFRootTestCase {\r
-\r
-    @Test\r
-    public void testAddAf() {\r
-        String germanAe = "\u00E4";\r
-        String unicodeFilename = "t" + germanAe + "st.pdf";\r
-        PDFFileSpec fileSpec = new PDFFileSpec(unicodeFilename);\r
-\r
-        String filename = fileSpec.getFilename();\r
-\r
-        PDFDocument doc = new PDFDocument("");\r
-        doc.getRoot().addAF(fileSpec);\r
-\r
-        assertEquals(filename, fileSpec.getFilename());\r
-        assertEquals(unicodeFilename, fileSpec.getUnicodeFilename());\r
-    }\r
-}\r
+/*
+ * 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");
+    }
+}