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);
+ }
}