Skip to content

Commit

Permalink
FOP-3207: Add warning when different pdf languages are used
Browse files Browse the repository at this point in the history
  • Loading branch information
simonsteiner1984 committed Sep 18, 2024
1 parent deb2c2c commit 7fcf3ca
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 42 deletions.
4 changes: 4 additions & 0 deletions fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -1707,4 +1707,8 @@ public PDFDPartRoot makeDPartRoot() {
public void setEventBroadcaster(EventBroadcaster eventBroadcaster) {
this.eventBroadcaster = eventBroadcaster;
}

public EventBroadcaster getEventBroadcaster() {
return eventBroadcaster;
}
}
6 changes: 6 additions & 0 deletions fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -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);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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>
111 changes: 69 additions & 42 deletions fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java
Original file line number Diff line number Diff line change
@@ -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");
}
}

0 comments on commit 7fcf3ca

Please sign in to comment.