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