Author: ssteiner
Date: Tue Jun 30 12:41:37 2020
New Revision: 1879364

URL: http://svn.apache.org/viewvc?rev=1879364&view=rev
Log:
FOP-2951: Add uniquename to xobj form

Modified:
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
    
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
    
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java?rev=1879364&r1=1879363&r2=1879364&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeCFFFonts.java
 Tue Jun 30 12:41:37 2020
@@ -44,6 +44,7 @@ import org.apache.fontbox.cff.CFFType1Fo
 
 import org.apache.fop.fonts.cff.CFFDataReader;
 import org.apache.fop.fonts.truetype.FontFileReader;
+import org.apache.fop.pdf.PDFDocument;
 
 public class MergeCFFFonts extends OTFSubSetFile implements MergeFonts {
     protected List<Map<Integer, Integer>> subsetGlyphsList = new 
ArrayList<Map<Integer, Integer>>();
@@ -338,7 +339,7 @@ public class MergeCFFFonts extends OTFSu
             } else {
                 String notice = (String)fileFont.getTopDict().get("Notice");
                 if (notice != null && !(fileFont instanceof CFFCIDFont)) {
-                    stringIndexData.add(notice.getBytes("ISO-8859-1"));
+                    stringIndexData.add(notice.getBytes(PDFDocument.ENCODING));
                 }
             }
             stringIndexData.add(embeddedName.getBytes("UTF-8"));
@@ -346,7 +347,8 @@ public class MergeCFFFonts extends OTFSu
         } else {
             String notice = (String)fileFont.getTopDict().get("Notice");
             if (notice != null) {
-                
writeIndex(Arrays.<byte[]>asList(notice.getBytes("ISO-8859-1"), 
embeddedName.getBytes("UTF-8")));
+                
writeIndex(Arrays.<byte[]>asList(notice.getBytes(PDFDocument.ENCODING),
+                        embeddedName.getBytes("UTF-8")));
             } else {
                 List<byte[]> sindex = new ArrayList<byte[]>();
                 sindex.add(cffReader.getStringIndex().getData());

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java?rev=1879364&r1=1879363&r2=1879364&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFontsPDFWriter.java
 Tue Jun 30 12:41:37 2020
@@ -56,9 +56,9 @@ import org.apache.fop.fonts.FontInfo;
 import org.apache.fop.fonts.Typeface;
 import org.apache.fop.fonts.truetype.OTFSubSetFile;
 
+import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFText;
 
-
 public class MergeFontsPDFWriter extends PDFWriter {
     protected static final Log log = 
LogFactory.getLog(MergeFontsPDFWriter.class);
     private COSDictionary fonts;
@@ -223,7 +223,7 @@ public class MergeFontsPDFWriter extends
     }
 
     private String getString(COSString s) throws UnsupportedEncodingException {
-        String encoding = "ISO-8859-1";
+        String encoding = PDFDocument.ENCODING;
         byte[] data = s.getBytes();
         int start = 0;
         if (data.length > 2) {

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java?rev=1879364&r1=1879363&r2=1879364&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapter.java
 Tue Jun 30 12:41:37 2020
@@ -92,7 +92,8 @@ public class PDFBoxAdapter {
     private Map<Integer, PDFArray> pageNumbers;
     private Collection<String> parentFonts = new ArrayList<String>();
 
-    private int currentMCID;
+    protected int currentMCID;
+    protected UniqueName uniqueName;
 
     /**
      * Creates a new PDFBoxAdapter.
@@ -179,16 +180,16 @@ public class PDFBoxAdapter {
     public Object createStreamFromPDFBoxPage(PDDocument sourceDoc, PDPage 
page, String key,
                                                      AffineTransform atdoc, 
FontInfo fontinfo, Rectangle pos)
         throws IOException {
+        COSDictionary sourcePageResources = getResources(page);
+        uniqueName = new UniqueName(key, sourcePageResources, 
pdfDoc.isFormXObjectEnabled());
         handleAnnotations(sourceDoc, page, atdoc);
         if (pageNumbers.containsKey(targetPage.getPageIndex())) {
             pageNumbers.get(targetPage.getPageIndex()).set(0, 
targetPage.makeReference());
         }
-        COSDictionary sourcePageResources = getResources(page);
         PDStream pdStream = getContents(page);
 
         COSDictionary fonts = 
(COSDictionary)sourcePageResources.getDictionaryObject(COSName.FONT);
         COSDictionary fontsBackup = null;
-        UniqueName uniqueName = new UniqueName(key, sourcePageResources);
         String newStream = null;
         if (fonts != null && pdfDoc.isMergeFontsEnabled()) {
             fontsBackup = new COSDictionary(fonts);
@@ -298,6 +299,23 @@ public class PDFBoxAdapter {
         return pdStream;
     }
 
+    private void updateMergeFontInfo(PDFDictionary pageResources, FontInfo 
fontinfo) {
+        PDFDictionary fontDict = (PDFDictionary)pageResources.get("Font");
+        if (fontDict != null && pdfDoc.isMergeFontsEnabled()) {
+            for (Map.Entry<String, Typeface> fontEntry : 
fontinfo.getUsedFonts().entrySet()) {
+                Typeface font = fontEntry.getValue();
+                if (font instanceof FOPPDFFont) {
+                    FOPPDFFont pdfFont = (FOPPDFFont)font;
+                    if (pdfFont.getRef() == null) {
+                        pdfFont.setRef(new PDFDictionary());
+                        pdfDoc.assignObjectNumber(pdfFont.getRef());
+                    }
+                    fontDict.put(fontEntry.getKey(), pdfFont.getRef());
+                }
+            }
+        }
+    }
+
     private PDFFormXObject getFormXObject(PDFDictionary pageResources, 
PDFStream pageStream, String key, PDPage page)
         throws IOException {
         if (pdfDoc.isMergeFontsEnabled()) {
@@ -401,8 +419,8 @@ public class PDFBoxAdapter {
             PDFDictionary target = (PDFDictionary) 
pageResources.get("XObject");
             for (COSName entry : xobj.keySet()) {
                 if (newXObj.containsKey(entry)) {
-                    PDFStream s = (PDFStream) target.get(entry.getName());
-                    s.setData(newXObj.get(entry).getBytes("ISO-8859-1"));
+                    PDFStream s = (PDFStream) 
target.get(uniqueName.getName(entry));
+                    
s.setData(newXObj.get(entry).getBytes(PDFDocument.ENCODING));
                     PDFDictionary xobjr = (PDFDictionary) s.get("Resources");
                     xobjr.put("Font", pageResources.get("Font"));
                 }

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java?rev=1879364&r1=1879363&r2=1879364&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFCloner.java
 Tue Jun 30 12:41:37 2020
@@ -40,9 +40,11 @@ import org.apache.pdfbox.cos.COSObject;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.cos.COSString;
 import org.apache.pdfbox.pdmodel.common.COSObjectable;
+import org.apache.pdfbox.pdmodel.common.PDStream;
 
 import org.apache.fop.pdf.PDFArray;
 import org.apache.fop.pdf.PDFDictionary;
+import org.apache.fop.pdf.PDFDocument;
 import org.apache.fop.pdf.PDFName;
 import org.apache.fop.pdf.PDFNumber;
 import org.apache.fop.pdf.PDFObject;
@@ -142,7 +144,11 @@ public class PDFCloner {
         cacheClonedObject(keyBase, newDict);
         for (Map.Entry<COSName, COSBase> e : dic.entrySet()) {
             if (!exclude.contains(e.getKey())) {
-                newDict.put(e.getKey().getName(), 
cloneForNewDocument(e.getValue(), e.getValue(), exclude));
+                String name = e.getKey().getName();
+                if (adapter.uniqueName != null) {
+                    name = adapter.uniqueName.getName(e.getKey());
+                }
+                newDict.put(name, cloneForNewDocument(e.getValue(), 
e.getValue(), exclude));
             }
         }
         return newDict;
@@ -179,7 +185,23 @@ public class PDFCloner {
         }
         PDFStream stream = new PDFStream();
         OutputStream out = stream.getBufferOutputStream();
-        IOUtils.copyLarge(in, out);
+        if (originalStream.getItem(COSName.SUBTYPE) == COSName.FORM && 
adapter.uniqueName != null) {
+            PDFWriter writer = new PDFWriter(adapter.uniqueName, 
adapter.currentMCID);
+            try {
+                String newStream = writer.writeText(new 
PDStream(originalStream));
+                if (writer.keyUsed) {
+                    filter = adapter.FILTER_FILTER;
+                    out.write(newStream.getBytes(PDFDocument.ENCODING));
+                    out.close();
+                    in = null;
+                }
+            } catch (IOException e) {
+                //ignore
+            }
+        }
+        if (in != null) {
+            IOUtils.copyLarge(in, out);
+        }
         adapter.transferDict(originalStream, stream, filter);
         return cacheClonedObject(keyBase, stream);
     }

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java?rev=1879364&r1=1879363&r2=1879364&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFString.java
 Tue Jun 30 12:41:37 2020
@@ -59,7 +59,7 @@ public class PDFString extends PDFObject
      */
     public String getString() {
         if (this.text == null) {
-            String encoding = "ISO-8859-1";
+            String encoding = PDFDocument.ENCODING;
             int start = 0;
             if (this.binary.length > 2) {
                 if (this.binary[0] == (byte)0xFF && this.binary[1] == 
(byte)0xFE) {
@@ -103,7 +103,7 @@ public class PDFString extends PDFObject
                     binary[1] = (byte)0xFF;
                     System.arraycopy(data, 0, binary, 2, data.length);
                 } else {
-                    byte[] data = this.text.getBytes("ISO-8859-1");
+                    byte[] data = this.text.getBytes(PDFDocument.ENCODING);
                     binary = new byte[data.length];
                     System.arraycopy(data, 0, binary, 0, data.length);
                 }

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java?rev=1879364&r1=1879363&r2=1879364&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFWriter.java
 Tue Jun 30 12:41:37 2020
@@ -39,6 +39,7 @@ import org.apache.pdfbox.cos.COSString;
 import org.apache.pdfbox.pdfparser.PDFStreamParser;
 import org.apache.pdfbox.pdmodel.common.PDStream;
 
+import org.apache.fop.pdf.PDFDocument;
 
 public class PDFWriter {
     private DecimalFormat df = new DecimalFormat("#.####", new 
DecimalFormatSymbols(Locale.US));
@@ -46,6 +47,7 @@ public class PDFWriter {
     protected StringBuilder s = new StringBuilder();
     protected UniqueName key;
     private int currentMCID;
+    protected boolean keyUsed;
 
     public PDFWriter(UniqueName key, int currentMCID) {
         this.key = key;
@@ -69,7 +71,7 @@ public class PDFWriter {
                         arguments.add(cn.getValue());
                     }
                     readPDFArguments(op, arguments);
-                    s.append("ID " + new String(op.getImageData(), 
"ISO-8859-1"));
+                    s.append("ID " + new String(op.getImageData(), 
PDFDocument.ENCODING));
                     arguments.clear();
                     s.append("EI\n");
                 }
@@ -102,8 +104,12 @@ public class PDFWriter {
             }
         } else if (c instanceof COSName) {
             COSName cn = (COSName)c;
-            s.append("/" + key.getName(cn));
+            String name = key.getName(cn);
+            s.append("/" + name);
             s.append(" ");
+            if (!name.equals(cn.getName())) {
+                keyUsed = true;
+            }
         } else if (c instanceof COSString) {
             s.append("<" + ((COSString) c).toHexString() + ">");
         } else if (c instanceof COSArray) {

Modified: 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java?rev=1879364&r1=1879363&r2=1879364&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/UniqueName.java
 Tue Jun 30 12:41:37 2020
@@ -19,6 +19,7 @@
 package org.apache.fop.render.pdf.pdfbox;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.apache.pdfbox.cos.COSBase;
@@ -30,9 +31,14 @@ public class UniqueName {
     private String key;
     private List<COSName> resourceNames;
 
-    public UniqueName(String key, COSDictionary sourcePageResources) {
-        this.key = Integer.toString(key.hashCode());
-        resourceNames = getResourceNames(sourcePageResources);
+    public UniqueName(String key, COSDictionary sourcePageResources, boolean 
disable) {
+        if (disable) {
+            resourceNames = Collections.emptyList();
+        } else {
+            key = key.split("#")[0];
+            this.key = Integer.toString(key.hashCode());
+            resourceNames = getResourceNames(sourcePageResources);
+        }
     }
 
     protected String getName(COSName cn) {

Modified: 
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java?rev=1879364&r1=1879363&r2=1879364&view=diff
==============================================================================
--- 
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
 (original)
+++ 
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
 Tue Jun 30 12:41:37 2020
@@ -28,10 +28,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.URI;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.junit.Assert;
@@ -657,4 +659,27 @@ public class PDFBoxAdapterTestCase {
         formXObject.output(bos);
         Assert.assertTrue(bos.toString("UTF-8").contains("/Type /XObject"));
     }
+
+    @Test
+    public void testRewriteOfForms() throws Exception {
+        PDFDocument pdfdoc = new PDFDocument("");
+        PDFPage pdfpage = getPDFPage(pdfdoc);
+        pdfpage.setDocument(pdfdoc);
+        pdfpage.setObjectNumber(1);
+        PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new 
HashMap<Integer, PDFArray>());
+        PDDocument doc = PDDocument.load(new File(ACCESSIBLERADIOBUTTONS));
+        PDPage page = doc.getPage(0);
+        AffineTransform at = new AffineTransform();
+        Rectangle r = new Rectangle(0, 1650, 842000, 595000);
+        adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        Map<String, List<String>> filterMap = new HashMap<String, 
List<String>>();
+        List<String> filterList = new ArrayList<String>();
+        filterList.add("null");
+        filterMap.put("default", filterList);
+        pdfdoc.setFilterMap(filterMap);
+        pdfdoc.output(os);
+        Assert.assertTrue(os.toString("UTF-8").contains("/F15106079 12 Tf"));
+        doc.close();
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscr...@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-h...@xmlgraphics.apache.org

Reply via email to