FOP-2974: Handle space in COSName

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1882340 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java b/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
index 4024431..3e2e0ae 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
@@ -101,7 +101,7 @@
                     internalName = getNewFont(fontData, fontInfo, fontsToRemove.values());
                 }
                 if (fontData == null || internalName == null) {
-                    s.append("/" + key.getName(cn));
+                    key.writeName(s, cn);
                     if (op.getName().equals("Tf")) {
                         font = null;
                         oldFont = null;
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
index 50502fd..567d34e 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
@@ -104,9 +104,9 @@
             }
         } else if (c instanceof COSName) {
             COSName cn = (COSName)c;
-            String name = key.getName(cn);
-            s.append("/" + name);
+            key.writeName(s, cn);
             s.append(" ");
+            String name = key.getName(cn);
             if (!name.equals(cn.getName())) {
                 keyUsed = true;
             }
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java b/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
index 2201c9c..89acfc7 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.java
@@ -240,7 +240,7 @@
         if (baseKid instanceof COSInteger) {
             COSInteger number = (COSInteger) baseKid;
             createKids(number, parentDict, parent, originatedFromTableRow);
-        } else {
+        } else if (baseKid instanceof COSDictionary) {
             COSDictionary unwrappedDict = (COSDictionary)baseKid;
             if (unwrappedDict.getDictionaryObject(COSName.S) == null) {
                 COSDictionary mcrDict = (COSDictionary)baseKid;
@@ -417,13 +417,15 @@
         } else if (kid instanceof COSObject) {
             COSObject kidObject = (COSObject)kid;
             COSBase base = kidObject.getObject();
-            COSDictionary temp = (COSDictionary)base;
-            if (temp.getDictionaryObject(COSName.S) != null && temp.getItem(COSName.K) != null) {
+            if (base instanceof COSDictionary) {
+                COSDictionary temp = (COSDictionary) base;
+                if (temp.getDictionaryObject(COSName.S) != null && temp.getItem(COSName.K) != null) {
 
-                COSBase tempKids = temp.getItem(COSName.K);
-                findLeafKids(tempKids, kidObject);
-            } else {
-                findLeafKids(temp, parent);
+                    COSBase tempKids = temp.getItem(COSName.K);
+                    findLeafKids(tempKids, kidObject);
+                } else {
+                    findLeafKids(temp, parent);
+                }
             }
         } else if (kid instanceof COSDictionary) {
             COSDictionary kidDictionary = (COSDictionary)kid;
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java b/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
index c55b716..f5a8369 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
@@ -18,6 +18,8 @@
 /* $Id$ */
 package org.apache.fop.render.pdf.pdfbox;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -27,6 +29,8 @@
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSObject;
 
+import org.apache.fop.pdf.PDFDocument;
+
 public class UniqueName {
     private String key;
     private List<COSName> resourceNames;
@@ -48,6 +52,16 @@
         return cn.getName();
     }
 
+    protected void writeName(StringBuilder sb, COSName cn) throws IOException {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        cn.writePDF(bos);
+        String name = bos.toString(PDFDocument.ENCODING);
+        sb.append(name);
+        if (resourceNames.contains(cn)) {
+            sb.append(key);
+        }
+    }
+
     private List<COSName> getResourceNames(COSDictionary sourcePageResources) {
         List<COSName> resourceNames = new ArrayList<COSName>();
         for (COSBase e : sourcePageResources.getValues()) {
diff --git a/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java
index cfab6cb..03dbc05 100644
--- a/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFWriterTestCase.java
@@ -27,6 +27,7 @@
 import org.apache.pdfbox.pdmodel.common.PDStream;
 
 import org.apache.fop.render.pdf.pdfbox.PDFWriter;
+import org.apache.fop.render.pdf.pdfbox.UniqueName;
 
 public class PDFWriterTestCase {
     @Test
@@ -79,4 +80,13 @@
         String out = pdfWriter.writeText(pdStream);
         Assert.assertEquals(out, text);
     }
+
+    @Test
+    public void testSpaceInName() throws IOException {
+        String text = "/a#20a a\n";
+        PDStream pdStream = new PDStream(new PDDocument(), new ByteArrayInputStream(text.getBytes("UTF-8")));
+        PDFWriter pdfWriter = new PDFWriter(new UniqueName("", null, true), 0);
+        String out = pdfWriter.writeText(pdStream);
+        Assert.assertEquals(out, text);
+    }
 }