aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/java/org/apache/fop/StandardTestSuite.java2
-rw-r--r--test/java/org/apache/fop/render/pdf/BasePDFTestCase.java26
-rw-r--r--test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java5
-rw-r--r--test/java/org/apache/fop/render/pdf/PDFEncodingTestCase.java119
-rw-r--r--test/xml/pdf-encoding/pdf-encoding-test.xconf45
-rw-r--r--test/xml/pdf-encoding/test-custom-font.fo38
-rw-r--r--test/xml/pdf-encoding/test-standard-font.fo38
7 files changed, 262 insertions, 11 deletions
diff --git a/test/java/org/apache/fop/StandardTestSuite.java b/test/java/org/apache/fop/StandardTestSuite.java
index 6518c7cfc..c50b90f1f 100644
--- a/test/java/org/apache/fop/StandardTestSuite.java
+++ b/test/java/org/apache/fop/StandardTestSuite.java
@@ -20,6 +20,7 @@
package org.apache.fop;
import org.apache.fop.render.pdf.PDFAConformanceTestCase;
+import org.apache.fop.render.pdf.PDFEncodingTestCase;
import org.apache.fop.render.rtf.RichTextFormatTestSuite;
import junit.framework.Test;
@@ -41,6 +42,7 @@ public class StandardTestSuite {
suite.addTest(BasicDriverTestSuite.suite());
suite.addTest(UtilityCodeTestSuite.suite());
suite.addTest(new TestSuite(PDFAConformanceTestCase.class));
+ suite.addTest(new TestSuite(PDFEncodingTestCase.class));
suite.addTest(RichTextFormatTestSuite.suite());
//$JUnit-END$
return suite;
diff --git a/test/java/org/apache/fop/render/pdf/BasePDFTestCase.java b/test/java/org/apache/fop/render/pdf/BasePDFTestCase.java
index cf7fe3eff..11ee3e75f 100644
--- a/test/java/org/apache/fop/render/pdf/BasePDFTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/BasePDFTestCase.java
@@ -44,27 +44,41 @@ public class BasePDFTestCase extends TestCase {
protected BasePDFTestCase(String name) {
super(name);
+
+ final File uc = getUserConfigFile();
+
+ try {
+ fopFactory.setUserConfig(uc);
+ } catch (Exception e) {
+ throw new RuntimeException("fopFactory.setUserConfig (" + uc.getAbsolutePath() + ") failed: " + e.getMessage());
+ }
}
/**
* Convert a test FO file to PDF
* @param foFile the FO file
* @param ua the preconfigured user agent
- * @param dumpPdfFile if true, dumps the generated PDF file to a file name (foFile).pdf and returns it as a File
+ * @param dumpPdfFile if true, dumps the generated PDF file to a file name (foFile).pdf
+ * @return the generated PDF data
* @throws Exception if the conversion fails
*/
- protected File convertFO(File foFile, FOUserAgent ua, boolean dumpPdfFile) throws Exception {
- File outFile = null;
+ protected byte[] convertFO(File foFile, FOUserAgent ua, boolean dumpPdfFile) throws Exception {
ByteArrayOutputStream baout = new ByteArrayOutputStream();
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, ua, baout);
Transformer transformer = tFactory.newTransformer();
Source src = new StreamSource(foFile);
SAXResult res = new SAXResult(fop.getDefaultHandler());
transformer.transform(src, res);
+ final byte[] result = baout.toByteArray();
if (dumpPdfFile) {
- outFile = new File(foFile.getParentFile(), foFile.getName() + ".pdf");
- FileUtils.writeByteArrayToFile(outFile, baout.toByteArray());
+ final File outFile = new File(foFile.getParentFile(), foFile.getName() + ".pdf");
+ FileUtils.writeByteArrayToFile(outFile, result);
}
- return outFile;
+ return result;
+ }
+
+ /** get FOP config File */
+ protected File getUserConfigFile() {
+ return new File("test/test.xconf");
}
}
diff --git a/test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java b/test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java
index c46b08179..eb613a989 100644
--- a/test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFAConformanceTestCase.java
@@ -38,11 +38,6 @@ public class PDFAConformanceTestCase extends BasePDFTestCase {
*/
public PDFAConformanceTestCase(String name) {
super(name);
- try {
- fopFactory.setUserConfig(new File("test/test.xconf"));
- } catch (Exception e) {
- throw new RuntimeException("Configuring the FopFactory failed: " + e.getMessage());
- }
}
/** create an FOUserAgent for our tests */
diff --git a/test/java/org/apache/fop/render/pdf/PDFEncodingTestCase.java b/test/java/org/apache/fop/render/pdf/PDFEncodingTestCase.java
new file mode 100644
index 000000000..6187cd3db
--- /dev/null
+++ b/test/java/org/apache/fop/render/pdf/PDFEncodingTestCase.java
@@ -0,0 +1,119 @@
+/*
+ * 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.
+ */
+
+package org.apache.fop.render.pdf;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.StringTokenizer;
+
+import org.apache.fop.apps.FOUserAgent;
+
+/** Test that characters are correctly encoded in a generated PDF file */
+public class PDFEncodingTestCase extends BasePDFTestCase {
+ private File foBaseDir = new File("test/xml/pdf-encoding");
+ private final boolean dumpPDF = Boolean.getBoolean("PDFEncodingTestCase.dumpPDF");
+
+ static final String INPUT_FILE = "test/xml/pdf-encoding/pdf-encoding-test.xconf";
+ static final String TEST_MARKER = "PDFE_TEST_MARK_";
+
+ public PDFEncodingTestCase(String name) {
+ super(name);
+ }
+
+ /** create an FOUserAgent for our tests */
+ protected FOUserAgent getUserAgent() {
+ final FOUserAgent a = fopFactory.newFOUserAgent();
+ return a;
+ }
+
+ /** use our specific config */
+ protected File getUserConfigFile() {
+ return new File(INPUT_FILE);
+ }
+
+
+ public void testPDFEncodingWithStandardFont() throws Exception {
+
+ /* If the PDF encoding is correct, a text dump of the generated PDF file contains this (excerpts)
+ * ...Tm [(PDFE_TEST_MARK_2:) ( ) (This) ( ) (is) ...(acute:) ( ) (XX_\351_XX) ] TJ
+ * ...Tm [(PDFE_TEST_MARK_3:) ( ) (This) ( ) (is) ...(letter:) ( ) (XX_\342\352\356\364\373_XX) ] TJ
+ * The following array is used to look for these patterns
+ */
+ final String testPatterns[] = {
+ TEST_MARKER + "1", "(Standard)",
+ TEST_MARKER + "2", "XX_\\351_XX",
+ TEST_MARKER + "3", "XX_\\342\\352\\356\\364\\373_XX"
+ };
+
+ runTest("test-standard-font.fo",testPatterns);
+ }
+
+ /* TODO test disabled for now, fails due (probably) do different PDF encoding when custom font is used */
+ public void DISABLED_testPDFEncodingWithCustomFont() throws Exception {
+
+ /* If the PDF encoding is correct, a text dump of the generated PDF file contains this (excerpts)
+ * ...Tm [(PDFE_TEST_MARK_2:) ( ) (This) ( ) (is) ...(acute:) ( ) (XX_\351_XX) ] TJ
+ * ...Tm [(PDFE_TEST_MARK_3:) ( ) (This) ( ) (is) ...(letter:) ( ) (XX_\342\352\356\364\373_XX) ] TJ
+ * The following array is used to look for these patterns
+ */
+ final String testPatterns[] = {
+ TEST_MARKER + "1", "(Gladiator)",
+ TEST_MARKER + "2", "XX_\\351_XX",
+ TEST_MARKER + "3", "XX_\\342\\352\\356\\364\\373_XX"
+ };
+
+ runTest("test-custom-font.fo",testPatterns);
+ }
+
+ /** Test encoding using specified input file and test patterns array */
+ private void runTest(String inputFile,String [] testPatterns) throws Exception {
+ File foFile = new File(foBaseDir, inputFile);
+ byte[] pdfData = convertFO(foFile, getUserAgent(), dumpPDF);
+ checkEncoding(pdfData,testPatterns);
+ }
+
+ /** Check character encodings in the generated PDF data, by reading text
+ * lines identified by markers and checking their content
+ * @throws IOException */
+ private void checkEncoding(byte[] pdf,String[] testPattern) throws IOException {
+
+ int markersFound = 0;
+ final String input = new String(pdf);
+ int pos = 0;
+ if((pos=input.indexOf(TEST_MARKER)) >= 0) {
+ final StringTokenizer tk = new StringTokenizer(input.substring(pos),"\n");
+
+ while(tk.hasMoreTokens()) {
+ final String line = tk.nextToken();
+ if(line.indexOf(TEST_MARKER) >=0) {
+ markersFound++;
+ for(int i=0; i < testPattern.length; i+=2) {
+ if(line.indexOf(testPattern[i]) >= 0) {
+ final String ref = testPattern[i+1];
+ final boolean patternFound = line.indexOf(ref) >= 0;
+ assertTrue("line containing '" + testPattern[i] + "' must contain '" + ref,patternFound);
+ }
+ }
+ }
+ }
+ }
+
+ final int nMarkers = testPattern.length / 2;
+ assertEquals(nMarkers + " " + TEST_MARKER + " markers must be found",nMarkers,markersFound);
+ }
+}
diff --git a/test/xml/pdf-encoding/pdf-encoding-test.xconf b/test/xml/pdf-encoding/pdf-encoding-test.xconf
new file mode 100644
index 000000000..6046fb45c
--- /dev/null
+++ b/test/xml/pdf-encoding/pdf-encoding-test.xconf
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+
+<!--
+ 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.
+-->
+
+<!--
+ FOP config for PDF encoding test: disable all output filters
+ and setup a custom font
+-->
+
+<fop version="1.0">
+ <renderers>
+ <renderer mime="application/pdf">
+ <!-- disable PDF text compression -->
+ <filterList>
+ <value>null</value>
+ </filterList>
+ <filterList type="image">
+ <value>flate</value>
+ <value>ascii-85</value>
+ </filterList>
+
+ <!-- use a custom font to show encoding problems -->
+ <fonts>
+ <font metrics-url="test/resources/fonts/glb12.ttf.xml" embed-url="test/resources/fonts/glb12.ttf">
+ <font-triplet name="Gladiator" style="normal" weight="normal"/>
+ </font>
+ </fonts>
+ </renderer>
+ </renderers>
+</fop>
diff --git a/test/xml/pdf-encoding/test-custom-font.fo b/test/xml/pdf-encoding/test-custom-font.fo
new file mode 100644
index 000000000..86689f343
--- /dev/null
+++ b/test/xml/pdf-encoding/test-custom-font.fo
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+-->
+
+<!--
+ Minimal FO document used to test PDF encoding
+-->
+
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" font-family="Gladiator">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="2cm">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="A4">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>Testing PDF text encoding using the user-specified Gladiator font</fo:block>
+ <fo:block>PDFE_TEST_MARK_1: Hello Gladiator World!</fo:block>
+ <fo:block>PDFE_TEST_MARK_2: This is an e acute: XX_é_XX</fo:block>
+ <fo:block>PDFE_TEST_MARK_3: This is aeiou with circumflex on each letter: XX_âêîôû_XX</fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>
diff --git a/test/xml/pdf-encoding/test-standard-font.fo b/test/xml/pdf-encoding/test-standard-font.fo
new file mode 100644
index 000000000..b629eadad
--- /dev/null
+++ b/test/xml/pdf-encoding/test-standard-font.fo
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ 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.
+-->
+
+<!--
+ Minimal FO document used to test PDF encoding
+-->
+
+<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
+ <fo:layout-master-set>
+ <fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm" margin="2cm">
+ <fo:region-body/>
+ </fo:simple-page-master>
+ </fo:layout-master-set>
+ <fo:page-sequence master-reference="A4">
+ <fo:flow flow-name="xsl-region-body">
+ <fo:block>Testing PDF text encoding using a standard FOP font</fo:block>
+ <fo:block>PDFE_TEST_MARK_1: Hello Standard World!</fo:block>
+ <fo:block>PDFE_TEST_MARK_2: This is an e acute: XX_é_XX</fo:block>
+ <fo:block>PDFE_TEST_MARK_3: This is aeiou with circumflex on each letter: XX_âêîôû_XX</fo:block>
+ </fo:flow>
+ </fo:page-sequence>
+</fo:root>