You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ss...@apache.org on 2017/02/06 14:18:02 UTC
svn commit: r1781906 - in /xmlgraphics/fop-pdf-images/trunk:
src/java/org/apache/fop/render/pdf/pdfbox/
test/java/org/apache/fop/render/pdf/
Author: ssteiner
Date: Mon Feb 6 14:18:02 2017
New Revision: 1781906
URL: http://svn.apache.org/viewvc?rev=1781906&view=rev
Log:
FOP-2687: NPE for merge fonts in pdf with accessibility
Modified:
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FontContainer.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java?rev=1781906&r1=1781905&r2=1781906&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFMultiByteFont.java Mon Feb 6 14:18:02 2017
@@ -105,9 +105,9 @@ public class FOPPDFMultiByteFont extends
}
CMap c = font.getToUnicodeCMap();
Map<Integer, String> mapping = getMapping(font, c, glyphData.length);
- //if (glyphData.length > 0 && differentGlyphData(glyphData, mapping)) {
- // return null;
- //}
+ if (glyphData.length > 0) {
+ differentGlyphData(glyphData, mapping);
+ }
Map<Integer, String> gidToGlyph = new TreeMap<Integer, String>(mapping);
if (font.font instanceof PDTrueTypeFont) {
CmapSubtable cmap = ttf.getCmap().getCmaps()[0];
@@ -233,28 +233,31 @@ public class FOPPDFMultiByteFont extends
return "SID" + index;
}
-// private boolean differentGlyphData(GlyphData[] data, Map<Integer, String> mapping) throws IOException {
-// Map<String, Integer> tmpMap = new HashMap<String, Integer>();
-// for (Map.Entry<Integer, String> entry : mapping.entrySet()) {
-// if (!tmpMap.containsKey(entry.getValue())) {
-// tmpMap.put(entry.getValue(), entry.getKey());
-// }
-// }
-// mapping.clear();
-// for (Map.Entry<String, Integer> entry : tmpMap.entrySet()) {
-// mapping.put(entry.getValue(), entry.getKey());
-// }
-//
-// for (Map.Entry<Integer, String> n : mapping.entrySet()) {
+ private boolean differentGlyphData(GlyphData[] data, Map<Integer, String> mapping) throws IOException {
+ Map<String, Integer> tmpMap = new HashMap<String, Integer>();
+ for (Map.Entry<Integer, String> entry : mapping.entrySet()) {
+ if (!tmpMap.containsKey(entry.getValue())) {
+ tmpMap.put(entry.getValue(), entry.getKey());
+ }
+ }
+ mapping.clear();
+ for (Map.Entry<String, Integer> entry : tmpMap.entrySet()) {
+ mapping.put(entry.getValue(), entry.getKey());
+ }
+
+ for (Map.Entry<Integer, String> n : mapping.entrySet()) {
+ if (n.getKey() >= data.length) {
+ throw new IOException("Mapping not found in glyphData");
+ }
// if (data[n.getKey()] != null) {
// if (glyphs.containsKey(n.getValue()) && !glyphs.get(n.getValue()).equals(data[n.getKey()])) {
// return true;
// }
// glyphs.put(n.getValue(), data[n.getKey()]);
// }
-// }
-// return false;
-// }
+ }
+ return false;
+ }
private InputStream readFontFile(PDFont font) throws IOException {
PDFontDescriptor fd = font.getFontDescriptor();
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FontContainer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FontContainer.java?rev=1781906&r1=1781905&r2=1781906&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FontContainer.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FontContainer.java Mon Feb 6 14:18:02 2017
@@ -137,4 +137,8 @@ public class FontContainer {
BoundingBox bb = font.getBoundingBox();
return new float[] {bb.getLowerLeftX(), bb.getLowerLeftY(), bb.getUpperRightX(), bb.getUpperRightY()};
}
+
+ public PDFont getFont() {
+ return font;
+ }
}
Modified: xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java?rev=1781906&r1=1781905&r2=1781906&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/FOPPDFSingleMultiByteFontTestCase.java Mon Feb 6 14:18:02 2017
@@ -28,15 +28,20 @@ import org.junit.Test;
import org.apache.commons.io.IOUtils;
import org.apache.fontbox.cff.CFFFont;
import org.apache.fontbox.cff.CFFParser;
+import org.apache.fontbox.ttf.GlyphData;
+import org.apache.fontbox.ttf.GlyphTable;
import org.apache.fontbox.type1.Type1Font;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
+import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
+import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.fop.render.pdf.pdfbox.FOPPDFMultiByteFont;
import org.apache.fop.render.pdf.pdfbox.FOPPDFSingleByteFont;
+import org.apache.fop.render.pdf.pdfbox.FontContainer;
public class FOPPDFSingleMultiByteFontTestCase {
private COSDictionary getFont(PDDocument doc, String internalname) throws IOException {
@@ -160,4 +165,33 @@ public class FOPPDFSingleMultiByteFontTe
Assert.assertTrue(multiByteFont.hadMappingOperations());
pdf.close();
}
+
+ @Test
+ public void testMappingNotFound() throws IOException {
+ PDDocument pdf = PDDocument.load(new File(PDFBoxAdapterTestCase.TTCID1));
+ final COSDictionary fontDict = getFont(pdf, "C2_0");
+ MyFOPPDFMultiByteFont multiByteFont = new MyFOPPDFMultiByteFont(fontDict, null);
+ PDType0Font font = (PDType0Font) multiByteFont.getFontContainer().getFont();
+ GlyphTable glyphTable = ((PDCIDFontType2)font.getDescendantFont()).getTrueTypeFont().getGlyph();
+ glyphTable.setGlyphs(new GlyphData[glyphTable.getGlyphs().length - 1]);
+ String ex = "";
+ try {
+ multiByteFont.addFont(fontDict);
+ } catch (IOException e) {
+ ex = e.getMessage();
+ }
+ Assert.assertEquals(ex, "Mapping not found in glyphData");
+ pdf.close();
+ }
+
+ private static class MyFOPPDFMultiByteFont extends FOPPDFMultiByteFont {
+ COSDictionary fontData;
+ MyFOPPDFMultiByteFont(COSDictionary fontData, String name) throws IOException {
+ super(fontData, name);
+ this.fontData = fontData;
+ }
+ FontContainer getFontContainer() throws IOException {
+ return getFont(fontData);
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org