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 2016/04/14 14:52:43 UTC
svn commit: r1739083 [1/2] - in /xmlgraphics/fop-pdf-images/trunk: lib/
src/java/org/apache/fop/render/pdf/pdfbox/
test/java/org/apache/fop/render/pdf/
Author: ssteiner
Date: Thu Apr 14 12:52:43 2016
New Revision: 1739083
URL: http://svn.apache.org/viewvc?rev=1739083&view=rev
Log:
FOP-2562: Update to PDFBox 2
Added:
xmlgraphics/fop-pdf-images/trunk/lib/fontbox-2.0.0.jar
- copied unchanged from r1739077, xmlgraphics/fop-pdf-images/branches/Temp_PDFBox2/lib/fontbox-2.0.0.jar
xmlgraphics/fop-pdf-images/trunk/lib/pdfbox-2.0.0.jar
- copied unchanged from r1739077, xmlgraphics/fop-pdf-images/branches/Temp_PDFBox2/lib/pdfbox-2.0.0.jar
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FontContainer.java
- copied unchanged from r1739077, xmlgraphics/fop-pdf-images/branches/Temp_PDFBox2/src/java/org/apache/fop/render/pdf/pdfbox/FontContainer.java
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MaximumProfileTable.java
- copied unchanged from r1739077, xmlgraphics/fop-pdf-images/branches/Temp_PDFBox2/src/java/org/apache/fop/render/pdf/pdfbox/MaximumProfileTable.java
Removed:
xmlgraphics/fop-pdf-images/trunk/lib/fontbox-2.0.0-SNAPSHOT.jar
xmlgraphics/fop-pdf-images/trunk/lib/jempbox-2.0.0-SNAPSHOT.jar
xmlgraphics/fop-pdf-images/trunk/lib/jempbox.LICENSE.txt
xmlgraphics/fop-pdf-images/trunk/lib/jempbox.NOTICE.txt
xmlgraphics/fop-pdf-images/trunk/lib/pdfbox-2.0.0-SNAPSHOT.jar
Modified:
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java
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/FOPPDFSingleByteFont.java
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java
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/MergeFonts.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/MergeTTFonts.java
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.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/PDFUtil.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/PSPDFGraphics2D.java
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PageParentTreeFinder.java
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PreloaderPDF.java
xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/StructureTreeMerger.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/DocumentRootModifierTestCase.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/PageParentTreeFinderTestCase.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/StructureTreeMergerTestCase.java
xmlgraphics/fop-pdf-images/trunk/test/java/org/apache/fop/render/pdf/TaggedPDFConductorTestCase.java
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java?rev=1739083&r1=1739082&r2=1739083&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/AbstractPDFBoxHandler.java Thu Apr 14 12:52:43 2016
@@ -93,7 +93,7 @@ public abstract class AbstractPDFBoxHand
Map<Object, Object> objectCache = getObjectCache(originalImageUri, userAgent);
- PDPage page = (PDPage) pddoc.getDocumentCatalog().getAllPages().get(selectedPage);
+ PDPage page = (PDPage) pddoc.getDocumentCatalog().getPages().get(selectedPage);
if (targetPage.getPDFResources().getParentResources() == null) {
PDFResources res = pdfDoc.getFactory().makeResources();
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=1739083&r1=1739082&r2=1739083&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 Thu Apr 14 12:52:43 2016
@@ -19,18 +19,19 @@ package org.apache.fop.render.pdf.pdfbox
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeMap;
import org.apache.commons.io.IOUtils;
+import org.apache.fontbox.cff.CFFCharset;
import org.apache.fontbox.cff.CFFFont;
+import org.apache.fontbox.cff.CFFStandardString;
import org.apache.fontbox.cmap.CMap;
-import org.apache.fontbox.ttf.CMAPEncodingEntry;
+
+import org.apache.fontbox.ttf.CmapSubtable;
import org.apache.fontbox.ttf.GlyphData;
-import org.apache.fontbox.ttf.MaximumProfileTable;
import org.apache.fontbox.ttf.TrueTypeFont;
import org.apache.pdfbox.cos.COSArray;
@@ -38,16 +39,15 @@ import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSObject;
-import org.apache.pdfbox.encoding.Encoding;
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.font.PDCIDFont;
-import org.apache.pdfbox.pdmodel.font.PDCIDFontType0Font;
-import org.apache.pdfbox.pdmodel.font.PDCIDFontType2Font;
+import org.apache.pdfbox.pdmodel.font.PDCIDFontType0;
+import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
import org.apache.pdfbox.pdmodel.font.PDFont;
-import org.apache.pdfbox.pdmodel.font.PDFontDescriptorDictionary;
-import org.apache.pdfbox.pdmodel.font.PDFontFactory;
+import org.apache.pdfbox.pdmodel.font.PDFontDescriptor;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
+import org.apache.pdfbox.pdmodel.font.encoding.GlyphList;
import org.apache.fop.fonts.CIDFontType;
import org.apache.fop.fonts.CustomFont;
@@ -63,7 +63,7 @@ public class FOPPDFMultiByteFont extends
private Map<String, Integer> charMapGlobal = new LinkedHashMap<String, Integer>();
private MergeFonts mergeFonts;
//private Map<String, GlyphData> glyphs = new HashMap<String, GlyphData>();
- private final Map<COSDictionary, PDFont> fontMap = new HashMap<COSDictionary, PDFont>();
+ private final Map<COSDictionary, FontContainer> fontMap = new HashMap<COSDictionary, FontContainer>();
public FOPPDFMultiByteFont(COSDictionary fontData, String name) throws IOException {
super(null, EmbeddingMode.SUBSET);
@@ -75,22 +75,23 @@ public class FOPPDFMultiByteFont extends
}
public String addFont(COSDictionary fontData) throws IOException {
- PDFont font = getFont(fontData);
- setProperties(this, font);
- PDFont mainFont = font;
+ FontContainer font = getFont(fontData);
+ setProperties(this, font.font);
+ PDCIDFont mainFont = null;
TrueTypeFont ttf = null;
- if (font instanceof PDType0Font) {
- PDCIDFont cidFont = (PDCIDFont) ((PDType0Font) font).getDescendantFont();
- setDefaultWidth((int) cidFont.getDefaultWidth());
+ if (font.font instanceof PDType0Font) {
+ PDCIDFont cidFont = ((PDType0Font) font.font).getDescendantFont();
+ int dw = cidFont.getCOSObject().getInt(COSName.DW);
+ setDefaultWidth(dw);
mainFont = cidFont;
- if (cidFont instanceof PDCIDFontType0Font) {
+ if (cidFont instanceof PDCIDFontType0) {
setCIDType(CIDFontType.CIDTYPE0);
setFontType(FontType.CIDTYPE0);
} else {
- ttf = ((PDCIDFontType2Font) cidFont).getTTFFont();
+ ttf = ((PDCIDFontType2) cidFont).getTrueTypeFont();
}
} else {
- ttf = ((PDTrueTypeFont) font).getTTFFont();
+ ttf = ((PDTrueTypeFont) font.font).getTrueTypeFont();
setDefaultWidth(1000);
}
GlyphData[] glyphData = new GlyphData[0];
@@ -101,26 +102,22 @@ public class FOPPDFMultiByteFont extends
if (charMapGlobal.isEmpty()) {
oldToNewGIMap.put(0, 0); // .notdef glyph
}
- CMap c = mainFont.getToUnicodeCMap();
- if (c == null) {
- c = font.getToUnicodeCMap();
- }
- Map<Integer, String> mapping = getMapping(mainFont, c, glyphData.length);
+ CMap c = font.getToUnicodeCMap();
+ Map<Integer, String> mapping = getMapping(font, c, glyphData.length);
//if (glyphData.length > 0 && differentGlyphData(glyphData, mapping)) {
// return null;
//}
Map<Integer, String> gidToGlyph = new TreeMap<Integer, String>(mapping);
- if (mainFont instanceof PDTrueTypeFont) {
- CMAPEncodingEntry cmap = ttf.getCMAP().getCmaps()[0];
+ if (font.font instanceof PDTrueTypeFont) {
+ CmapSubtable cmap = ttf.getCmap().getCmaps()[0];
gidToGlyph.clear();
- int[] gidToCode = cmap.getGlyphIdToCharacterCode();
- for (int i = 1; i < glyphData.length && i < gidToCode.length; i++) {
- String mappedChar = mapping.get(gidToCode[i]);
+ for (int i = 1; i < glyphData.length; i++) {
+ String mappedChar = mapping.get(cmap.getCharacterCode(i));
gidToGlyph.put(i, mappedChar);
}
}
readCharMap(font, gidToGlyph, glyphData, mainFont, oldToNewGIMap);
- InputStream ffr = readFontFile(mainFont);
+ InputStream ffr = readFontFile(font.font);
if (mergeFonts == null) {
if (ttf != null) {
mergeFonts = new MergeTTFonts(null);
@@ -141,8 +138,8 @@ public class FOPPDFMultiByteFont extends
return getFontName();
}
- private void readCharMap(PDFont font, Map<Integer, String> gidToGlyph, GlyphData[] glyphData,
- PDFont mainFont, Map<Integer, Integer> oldToNewGIMap) {
+ private void readCharMap(FontContainer font, Map<Integer, String> gidToGlyph, GlyphData[] glyphData,
+ PDCIDFont mainFont, Map<Integer, Integer> oldToNewGIMap) throws IOException {
int widthPos = font.getFirstChar() + 1;
for (Map.Entry<Integer, String> i : gidToGlyph.entrySet()) {
String mappedChar = i.getValue();
@@ -173,12 +170,12 @@ public class FOPPDFMultiByteFont extends
}
oldToNewGIMap.put(key, glyph);
if (!skipWidth) {
- if (!(mainFont instanceof PDTrueTypeFont)) {
+ if (!(font.font instanceof PDTrueTypeFont)) {
widthPos = key;
}
- float w = font.getFontWidth(widthPos);
+ float w = font.font.getWidth(widthPos);
if (w >= 0) {
- if (mainFont instanceof PDCIDFontType0Font) {
+ if (mainFont instanceof PDCIDFontType0) {
newWidth.put(key, (int)w);
} else {
newWidth.put(glyph, (int)w);
@@ -192,14 +189,12 @@ public class FOPPDFMultiByteFont extends
}
}
- private Map<Integer, String> getMapping(PDFont font, CMap c, int len) throws IOException {
+ private Map<Integer, String> getMapping(FontContainer font, CMap c, int len) throws IOException {
Map<Integer, String> mapping = new HashMap<Integer, String>();
- if (font instanceof PDCIDFontType0Font) {
- Collection<CFFFont.Mapping> mappings =
- ((PDCIDFontType0Font) font).getType1CFont().getCFFFont().getMappings();
- for (CFFFont.Mapping m : mappings) {
- String character = Encoding.getCharacterForName(m.getName());
- mapping.put(m.getSID(), character);
+ if (font.font instanceof PDType0Font) {
+ PDCIDFont cidFont = ((PDType0Font) font.font).getDescendantFont();
+ if (cidFont instanceof PDCIDFontType0) {
+ mapping = getStrings(((PDCIDFontType0) cidFont).getCFFFont());
}
}
if (c != null) {
@@ -207,12 +202,8 @@ public class FOPPDFMultiByteFont extends
if (last == -1) {
last = len;
}
- int size = 1;
- if (c.hasTwoByteMappings()) {
- size = 2;
- }
for (int i = font.getFirstChar(); i <= last; i++) {
- String l = c.lookup(i, size);
+ String l = c.toUnicode(i);
if (l != null) {
mapping.put(i, l);
}
@@ -221,6 +212,26 @@ public class FOPPDFMultiByteFont extends
return mapping;
}
+ private Map<Integer, String> getStrings(CFFFont ff) throws IOException {
+ CFFCharset cs = ff.getCharset();
+ Map<Integer, String> strings = new LinkedHashMap<Integer, String>();
+ for (int gid = 0; gid < 256; gid++) {
+ int sid = cs.getCIDForGID(gid);
+ if (sid != 0) {
+ strings.put(sid, GlyphList.getAdobeGlyphList().toUnicode(readString(sid)));
+ }
+ }
+ return strings;
+ }
+
+ private String readString(int index) throws IOException {
+ if (index >= 0 && index <= 390) {
+ return CFFStandardString.getName(index);
+ }
+ // technically this maps to .notdef, but we need a unique glyph name
+ 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()) {
@@ -245,7 +256,11 @@ public class FOPPDFMultiByteFont extends
// }
private InputStream readFontFile(PDFont font) throws IOException {
- PDFontDescriptorDictionary fd = (PDFontDescriptorDictionary) font.getFontDescriptor();
+ PDFontDescriptor fd = font.getFontDescriptor();
+ if (font instanceof PDType0Font) {
+ PDCIDFont cidFont = ((PDType0Font) font).getDescendantFont();
+ fd = cidFont.getFontDescriptor();
+ }
PDStream ff = fd.getFontFile3();
if (ff == null) {
ff = fd.getFontFile2();
@@ -254,7 +269,7 @@ public class FOPPDFMultiByteFont extends
}
}
if (ff == null) {
- throw new IOException(font.getBaseFont() + " no fontfile");
+ throw new IOException(font.getName() + " no fontfile");
}
InputStream is = ff.createInputStream();
return new ByteArrayInputStream(IOUtils.toByteArray(is));
@@ -313,12 +328,12 @@ public class FOPPDFMultiByteFont extends
return new ByteArrayInputStream(mergeFonts.getMergedFontSubset());
}
- protected PDFont getFont(COSDictionary fontData) throws IOException {
+ protected FontContainer getFont(COSDictionary fontData) throws IOException {
if (!fontMap.containsKey(fontData)) {
if (fontMap.size() > 10) {
fontMap.clear();
}
- fontMap.put(fontData, PDFontFactory.createFont(fontData));
+ fontMap.put(fontData, new FontContainer(fontData));
}
return fontMap.get(fontData);
}
@@ -333,8 +348,8 @@ public class FOPPDFMultiByteFont extends
}
}
- protected static void mergeMaxp(TrueTypeFont ttf, MaximumProfileTable outMaxp) {
- MaximumProfileTable mp = ttf.getMaximumProfile();
+ protected static void mergeMaxp(TrueTypeFont ttf, MaximumProfileTable outMaxp) throws IOException {
+ org.apache.fontbox.ttf.MaximumProfileTable mp = ttf.getMaximumProfile();
outMaxp.setVersion(mp.getVersion());
outMaxp.setNumGlyphs(outMaxp.getNumGlyphs() + mp.getNumGlyphs());
outMaxp.setMaxPoints(outMaxp.getMaxPoints() + mp.getMaxPoints());
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java?rev=1739083&r1=1739082&r2=1739083&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/FOPPDFSingleByteFont.java Thu Apr 14 12:52:43 2016
@@ -28,8 +28,10 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
+import org.apache.fontbox.cff.CFFType1Font;
import org.apache.fontbox.cmap.CMap;
-import org.apache.fontbox.ttf.CMAPEncodingEntry;
+
+import org.apache.fontbox.ttf.CmapSubtable;
import org.apache.fontbox.ttf.TrueTypeFont;
import org.apache.pdfbox.cos.COSArray;
@@ -37,13 +39,15 @@ import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSNumber;
-import org.apache.pdfbox.encoding.Encoding;
+
import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
-import org.apache.pdfbox.pdmodel.font.PDFontDescriptorDictionary;
-import org.apache.pdfbox.pdmodel.font.PDFontFactory;
+import org.apache.pdfbox.pdmodel.font.PDFontDescriptor;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
+import org.apache.pdfbox.pdmodel.font.PDType1CFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
+import org.apache.pdfbox.pdmodel.font.encoding.BuiltInEncoding;
+import org.apache.pdfbox.pdmodel.font.encoding.Encoding;
import org.apache.fop.fonts.EmbeddingMode;
import org.apache.fop.fonts.FontType;
@@ -53,7 +57,7 @@ import org.apache.fop.pdf.PDFDictionary;
public class FOPPDFSingleByteFont extends SingleByteFont implements FOPPDFFont {
private int fontCount;
- private PDFont font;
+ private FontContainer font;
protected PDFDictionary ref;
protected Map<String, Integer> charMapGlobal = new LinkedHashMap<String, Integer>();
private Map<Integer, Integer> newWidth = new HashMap<Integer, Integer>();
@@ -63,7 +67,7 @@ public class FOPPDFSingleByteFont extend
private int encodingSkip;
private MergeFonts mergeFonts;
private String shortFontName;
- private final Map<COSDictionary, PDFont> fontMap = new HashMap<COSDictionary, PDFont>();
+ private final Map<COSDictionary, FontContainer> fontMap = new HashMap<COSDictionary, FontContainer>();
public FOPPDFSingleByteFont(COSDictionary fontData, String name) throws IOException {
super(null, EmbeddingMode.FULL);
@@ -74,9 +78,9 @@ public class FOPPDFSingleByteFont extend
font = getFont(fontData);
setFirstChar(font.getFirstChar());
setLastChar(font.getLastChar());
- shortFontName = MergeFontsPDFWriter.getName(font.getBaseFont());
+ shortFontName = MergeFontsPDFWriter.getName(font.font.getName());
loadFontFile(font);
- float[] bBoxF = font.getFontBoundingBox().getCOSArray().toFloatArray();
+ float[] bBoxF = font.getBoundingBox();
int[] bBox = new int[bBoxF.length];
for (int i = 0; i < bBox.length; i++) {
bBox[i] = (int)bBoxF[i];
@@ -93,11 +97,11 @@ public class FOPPDFSingleByteFont extend
}
//mark font as used
notifyMapOperation();
- FOPPDFMultiByteFont.setProperties(this, font);
+ FOPPDFMultiByteFont.setProperties(this, font.font);
if (font.getWidths() != null) {
//if width contains 0 we cant rely on codeToNameMap
boolean usesZero = font.getWidths().contains(0);
- Set<Integer> codeToName = getCodeToName(font.getFontEncoding()).keySet();
+ Set<Integer> codeToName = getCodeToName(font.getEncoding()).keySet();
for (int i = getFirstChar();
i <= Math.min(getLastChar(), getFirstChar() + font.getWidths().size()); i++) {
if (usesZero || codeToName.contains(i)) {
@@ -113,10 +117,13 @@ public class FOPPDFSingleByteFont extend
addEncoding(font);
}
- private Map<Integer, String> getCodeToName(Encoding encoding) throws IOException {
+ private Map<Integer, String> getCodeToName(Encoding encoding) {
Map<Integer, String> codeToName = new HashMap<Integer, String>();
if (encoding != null) {
- COSBase cos = encoding.getCOSObject();
+ COSBase cos = null;
+ if (!(encoding instanceof BuiltInEncoding)) {
+ cos = encoding.getCOSObject();
+ }
if (cos instanceof COSDictionary) {
COSDictionary enc = (COSDictionary) cos;
COSName baseEncodingName = (COSName) enc.getDictionaryObject(COSName.BASE_ENCODING);
@@ -142,18 +149,18 @@ public class FOPPDFSingleByteFont extend
return codeToName;
}
- private Object getCmap(PDFont font) throws IOException {
- if (font.getFontEncoding() != null) {
- return font.getFontEncoding();
+ private Object getCmap(FontContainer font) throws IOException {
+ if (font.getEncoding() != null) {
+ return font.getEncoding();
}
if (font.getToUnicodeCMap() == null) {
- throw new IOException("No cmap found in " + font.getBaseFont());
+ throw new IOException("No cmap found in " + font.font.getName());
}
return font.getToUnicodeCMap();
}
private PDStream readFontFile(PDFont font) throws IOException {
- PDFontDescriptorDictionary fd = (PDFontDescriptorDictionary) font.getFontDescriptor();
+ PDFontDescriptor fd = font.getFontDescriptor();
setFlags(fd.getFlags());
PDStream ff = fd.getFontFile3();
if (ff == null) {
@@ -165,18 +172,18 @@ public class FOPPDFSingleByteFont extend
setFontType(FontType.TYPE1C);
}
if (ff == null) {
- throw new IOException(font.getBaseFont() + " no font file");
+ throw new IOException(font.getName() + " no font file");
}
return ff;
}
- private void loadFontFile(PDFont font) throws IOException {
- PDStream ff = readFontFile(font);
+ private void loadFontFile(FontContainer font) throws IOException {
+ PDStream ff = readFontFile(font.font);
mergeFontFile(ff.createInputStream(), font);
- if (font instanceof PDTrueTypeFont) {
- TrueTypeFont ttfont = ((PDTrueTypeFont) font).getTTFFont();
- CMAPEncodingEntry[] cmapList = ttfont.getCMAP().getCmaps();
- for (CMAPEncodingEntry c : cmapList) {
+ if (font.font instanceof PDTrueTypeFont) {
+ TrueTypeFont ttfont = ((PDTrueTypeFont) font.font).getTrueTypeFont();
+ CmapSubtable[] cmapList = ttfont.getCmap().getCmaps();
+ for (CmapSubtable c : cmapList) {
MergeTTFonts.Cmap tempCmap = getNewCmap(c.getPlatformId(), c.getPlatformEncodingId());
for (int i = 0; i < 256 * 256; i++) {
int gid = c.getGlyphId(i);
@@ -227,8 +234,8 @@ public class FOPPDFSingleByteFont extend
}
public String addFont(COSDictionary fontData) throws IOException {
- PDFont font = getFont(fontData);
- if (font instanceof PDType1Font && differentGlyphData((PDType1Font) font)) {
+ FontContainer font = getFont(fontData);
+ if ((font.font instanceof PDType1Font || font.font instanceof PDType1CFont) && differentGlyphData(font.font)) {
return null;
}
mergeWidths(font);
@@ -249,18 +256,25 @@ public class FOPPDFSingleByteFont extend
return fontCount;
}
- private Map<String, byte[]> getCharStringsDict(PDType1Font font) throws IOException {
- if (getFontType() == FontType.TYPE1) {
- return font.getType1Font().getCharStringsDict();
+ private Map<String, byte[]> getCharStringsDict(PDFont font) throws IOException {
+ if (font instanceof PDType1Font) {
+ return ((PDType1Font)font).getType1Font().getCharStringsDict();
}
- return font.getType1CFont().getCFFFont().getCharStringsDict();
+ CFFType1Font cffFont = ((PDType1CFont) font).getCFFType1Font();
+ List<byte[]> bytes = cffFont.getCharStringBytes();
+ Map<String, byte[]> map = new HashMap<String, byte[]>();
+ for (int i = 0; i < bytes.size(); i++) {
+ map.put(cffFont.getCharset().getNameForGID(i), bytes.get(i));
+ }
+ return map;
}
- private boolean differentGlyphData(PDType1Font otherFont) throws IOException {
+ private boolean differentGlyphData(PDFont otherFont) throws IOException {
if (charStringsDict == null) {
- charStringsDict = getCharStringsDict((PDType1Font) font);
+ charStringsDict = getCharStringsDict(font.font);
}
- for (Map.Entry<String, byte[]> s : getCharStringsDict(otherFont).entrySet()) {
+ Map<String, byte[]> otherFontMap = getCharStringsDict(otherFont);
+ for (Map.Entry<String, byte[]> s : otherFontMap.entrySet()) {
if (charStringsDict.containsKey(s.getKey())) {
int numberDiff = 0;
byte[] b1 = charStringsDict.get(s.getKey());
@@ -286,15 +300,15 @@ public class FOPPDFSingleByteFont extend
return false;
}
- private void mergeWidths(PDFont font) throws IOException {
+ private void mergeWidths(FontContainer font) throws IOException {
int w = 0;
int skipGlyphIndex = getLastChar() + 1;
Object cmap = getCmap(font);
- Set<Integer> codeToName = getCodeToName(font.getFontEncoding()).keySet();
+ Set<Integer> codeToName = getCodeToName(font.getEncoding()).keySet();
for (int i = font.getFirstChar(); i <= font.getLastChar(); i++) {
boolean addedWidth = false;
int glyphIndexPos = skipGlyphIndex;
- if (font instanceof PDTrueTypeFont) {
+ if (font.font instanceof PDTrueTypeFont) {
glyphIndexPos = i;
}
int neww = 0;
@@ -302,7 +316,7 @@ public class FOPPDFSingleByteFont extend
neww = font.getWidths().get(i - font.getFirstChar());
if (!newWidth.containsKey(i) || newWidth.get(i) == 0) {
if (getFontType() == FontType.TYPE1
- || font instanceof PDTrueTypeFont
+ || font.font instanceof PDTrueTypeFont
|| codeToName.contains(i)) {
newWidth.put(i, neww);
glyphIndexPos = i;
@@ -327,38 +341,19 @@ public class FOPPDFSingleByteFont extend
private String getChar(Object cmap, int i) throws IOException {
if (cmap instanceof CMap) {
CMap c = (CMap)cmap;
- int size = 1;
- if (c.hasTwoByteMappings()) {
- size = 2;
- }
- return c.lookup(i, size);
+ return c.toUnicode(i);
}
Encoding enc = (Encoding)cmap;
return enc.getName(i);
}
public String getEncodingName() {
- if (font.getFontEncoding() != null) {
- COSBase cosObject = font.getFontEncoding().getCOSObject();
- if (cosObject != null) {
- if (cosObject instanceof COSDictionary) {
- COSBase item = ((COSDictionary) cosObject).getItem(COSName.BASE_ENCODING);
- if (item != null) {
- return ((COSName)item).getName();
- }
- } else if (cosObject instanceof COSName) {
- return ((COSName) cosObject).getName();
- } else {
- throw new RuntimeException(cosObject.toString() + " not supported");
- }
- }
- }
- return null;
+ return font.getBaseEncodingName();
}
- private void addEncoding(PDFont fontForEnc) throws IOException {
+ private void addEncoding(FontContainer fontForEnc) {
List<String> added = new ArrayList<String>(encodingMap.values());
- Map<Integer, String> codeToName = getCodeToName(fontForEnc.getFontEncoding());
+ Map<Integer, String> codeToName = getCodeToName(fontForEnc.getEncoding());
for (int i = fontForEnc.getFirstChar(); i <= fontForEnc.getLastChar(); i++) {
if (codeToName.keySet().contains(i)) {
String s = codeToName.get(i);
@@ -395,7 +390,7 @@ public class FOPPDFSingleByteFont extend
public char[] getUnicodeCharMap() {
if (cmap) {
- if (MergeFontsPDFWriter.getToUnicode(font) == null) {
+ if (font.getToUnicode() == null) {
return new char[0];
}
List<String> cmapStrings = new ArrayList<String>();
@@ -453,7 +448,7 @@ public class FOPPDFSingleByteFont extend
return false;
}
- private void mergeFontFile(InputStream ff, PDFont pdFont) throws IOException {
+ private void mergeFontFile(InputStream ff, FontContainer pdFont) throws IOException {
if (mergeFonts == null) {
if (getFontType() == FontType.TRUETYPE) {
mergeFonts = new MergeTTFonts(newCmap);
@@ -473,12 +468,12 @@ public class FOPPDFSingleByteFont extend
return new ByteArrayInputStream(mergeFonts.getMergedFontSubset());
}
- protected PDFont getFont(COSDictionary fontData) throws IOException {
+ protected FontContainer getFont(COSDictionary fontData) throws IOException {
if (!fontMap.containsKey(fontData)) {
if (fontMap.size() > 10) {
fontMap.clear();
}
- fontMap.put(fontData, PDFontFactory.createFont(fontData));
+ fontMap.put(fontData, new FontContainer(fontData));
}
return fontMap.get(fontData);
}
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java?rev=1739083&r1=1739082&r2=1739083&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/ImageConverterPDF2G2D.java Thu Apr 14 12:52:43 2016
@@ -29,7 +29,7 @@ import java.util.Map;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.rendering.PageDrawer;
+import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageException;
@@ -57,10 +57,8 @@ public class ImageConverterPDF2G2D exten
src.getInfo().getOriginalURI());
PDDocument pddoc = imgPDF.getPDDocument();
- PDPage page = (PDPage)pddoc.getDocumentCatalog().getAllPages().get(selectedPage);
- Graphics2DImagePainter painter = new Graphics2DImagePainterPDF(
- page);
+ Graphics2DImagePainter painter = new Graphics2DImagePainterPDF(pddoc, selectedPage);
ImageGraphics2D g2dImage = new ImageGraphics2D(src.getInfo(), painter);
return g2dImage;
@@ -85,14 +83,18 @@ public class ImageConverterPDF2G2D exten
private static class Graphics2DImagePainterPDF implements GeneralGraphics2DImagePainter {
private final PDPage page;
+ private final PDDocument pdDocument;
+ private int selectedPage;
- public Graphics2DImagePainterPDF(PDPage page) {
- this.page = page;
+ public Graphics2DImagePainterPDF(PDDocument pddoc, int selectedPage) {
+ pdDocument = pddoc;
+ this.selectedPage = selectedPage;
+ page = pdDocument.getPage(selectedPage);
}
/** {@inheritDoc} */
public Dimension getImageSize() {
- PDRectangle mediaBox = page.findMediaBox();
+ PDRectangle mediaBox = page.getMediaBox();
int wmpt = (int)Math.ceil(mediaBox.getWidth() * 1000);
int hmpt = (int)Math.ceil(mediaBox.getHeight() * 1000);
return new Dimension(wmpt, hmpt);
@@ -101,41 +103,17 @@ public class ImageConverterPDF2G2D exten
/** {@inheritDoc} */
public void paint(Graphics2D g2d, Rectangle2D area) {
try {
- PDRectangle mediaBox = page.findCropBox();
- Dimension pageDimension = mediaBox.createDimension();
-
+ PDRectangle mediaBox = page.getCropBox();
AffineTransform at = new AffineTransform();
-
- Integer rotation = page.getRotation();
- if (rotation != null) {
- switch (rotation) {
- case 270:
- at.scale(area.getWidth() / area.getHeight(), area.getHeight() / area.getWidth());
- at.translate(0, area.getWidth());
- at.rotate(-Math.PI / 2.0);
- break;
- case 180:
- at.translate(area.getWidth(), area.getHeight());
- at.rotate(-Math.PI);
- break;
- case 90:
- at.scale(area.getWidth() / area.getHeight(), area.getHeight() / area.getWidth());
- at.translate(area.getHeight(), 0);
- at.rotate(-Math.PI * 1.5);
- break;
- default:
- //no additional transformations necessary
- break;
- }
+ int rotation = page.getRotation();
+ if (rotation == 90 || rotation == 270) {
+ at.scale(area.getWidth() / area.getHeight(), area.getHeight() / area.getWidth());
}
-
at.translate(area.getX(), area.getY());
- at.scale(area.getWidth() / pageDimension.width,
- area.getHeight() / pageDimension.height);
+ at.scale(area.getWidth() / mediaBox.getWidth(),
+ area.getHeight() / mediaBox.getHeight());
g2d.transform(at);
-
- PageDrawer drawer = new PageDrawer(null, page);
- drawer.drawPage(g2d, mediaBox);
+ new PDFRenderer(pdDocument).renderPageToGraphics(selectedPage, g2d);
} catch (IOException ioe) {
//TODO Better exception handling
throw new RuntimeException("I/O error while painting PDF page", ioe);
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=1739083&r1=1739082&r2=1739083&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 Thu Apr 14 12:52:43 2016
@@ -18,6 +18,9 @@ package org.apache.fop.render.pdf.pdfbox
import java.io.IOException;
import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -27,14 +30,15 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
+import org.apache.fontbox.cff.CFFCIDFont;
+import org.apache.fontbox.cff.CFFCharset;
+import org.apache.fontbox.cff.CFFEncoding;
import org.apache.fontbox.cff.CFFFont;
-import org.apache.fontbox.cff.CFFFontROS;
+import org.apache.fontbox.cff.CFFISOAdobeCharset;
import org.apache.fontbox.cff.CFFParser;
-import org.apache.fontbox.cff.charset.CFFCharset;
-import org.apache.fontbox.cff.charset.CFFISOAdobeCharset;
-import org.apache.fontbox.cff.encoding.CFFEncoding;
-import org.apache.fontbox.cff.encoding.CFFStandardEncoding;
-import org.apache.pdfbox.pdmodel.font.PDFont;
+import org.apache.fontbox.cff.CFFStandardEncoding;
+import org.apache.fontbox.cff.CFFStandardString;
+import org.apache.fontbox.cff.CFFType1Font;
import org.apache.fop.fonts.cff.CFFDataReader;
import org.apache.fop.fonts.truetype.FontFileReader;
@@ -50,14 +54,15 @@ public class MergeCFFFonts extends OTFSu
private List<String> added = new ArrayList<String>();
private Map<Integer, Integer> range = new LinkedHashMap<Integer, Integer>();
private int noOfFonts;
+ private CFFEncoding encoding = null;
public MergeCFFFonts() throws IOException {
gidToSID = new LinkedHashMap<Integer, Integer>();
subsetCharStringsIndex = new ArrayList<byte[]>();
}
- public void readFont(InputStream is, String name, PDFont pdFont, Map<Integer, Integer> subsetGlyphs, boolean cid)
- throws IOException {
+ public void readFont(InputStream is, String name, FontContainer fontContainer,
+ Map<Integer, Integer> subsetGlyphs, boolean cid) throws IOException {
this.embeddedName = name;
FontFileReader fontFile = new FontFileReader(is);
CFFParser p = new CFFParser();
@@ -73,7 +78,7 @@ public class MergeCFFFonts extends OTFSu
fileFont = ff;
}
LinkedHashMap<Integer, Integer> sg = new LinkedHashMap<Integer, Integer>();
- for (int i = 0; i < ff.getCharStringsDict().size() + 1; i++) {
+ for (int i = 0; i < ff.getNumCharStrings() + 1; i++) {
sg.put(i, i);
}
subsetGlyphsList.add(sg);
@@ -91,12 +96,13 @@ public class MergeCFFFonts extends OTFSu
}
}
- CFFEncoding encoding = ff.getEncoding();
- if (!(encoding instanceof CFFStandardEncoding)) {
- for (CFFEncoding.Entry e : encoding.getEntries()) {
- int c = e.getCode();
- if (!chars.contains(c) && c != 0) {
- chars.add(c);
+ if (ff instanceof CFFType1Font) {
+ encoding = ((CFFType1Font)ff).getEncoding();
+ if (!(encoding instanceof CFFStandardEncoding)) {
+ for (int c : encoding.getCodeToNameMap().keySet()) {
+ if (!chars.contains(c) && c != 0) {
+ chars.add(c);
+ }
}
}
}
@@ -144,16 +150,66 @@ public class MergeCFFFonts extends OTFSu
public static List<Integer> getSids(CFFCharset cSet) {
List<Integer> sids = new ArrayList<Integer>();
- for (CFFCharset.Entry x : cSet.getEntries()) {
- if (x.getSID() != 0) {
- sids.add(x.getSID());
+ try {
+ for (int gid = 0; gid < 1024; gid++) {
+ int sid = cSet.getCIDForGID(gid);
+ if (sid != 0) {
+ sids.add(sid);
+ }
+ }
+ } catch (IllegalStateException e) {
+ try {
+ final Method getSIDForGID = CFFCharset.class.getDeclaredMethod("getSIDForGID", int.class);
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ getSIDForGID.setAccessible(true);
+ return null;
+ }
+ });
+ for (int gid = 0; gid < 1024; gid++) {
+ int sid = (Integer)getSIDForGID.invoke(cSet, gid);
+ if (sid != 0) {
+ sids.add(sid);
+ }
+ }
+ } catch (ReflectiveOperationException e1) {
+ throw new RuntimeException(e1);
}
}
return sids;
}
public static Map<String, byte[]> getStrings(CFFFont ff) throws IOException {
- return ff.getCharStringsDict();
+ CFFCharset cs = ff.getCharset();
+ List<byte[]> csbytes = ff.getCharStringBytes();
+ Map<String, byte[]> strings = new LinkedHashMap<String, byte[]>();
+ int i = 0;
+ try {
+ for (int gid = 0; gid < 256; gid++) {
+ String name = cs.getNameForGID(gid);
+ if (name != null && i < csbytes.size()) {
+ strings.put(name, csbytes.get(i));
+ i++;
+ }
+ }
+ } catch (IllegalStateException e) {
+ strings.put(".notdef", csbytes.get(0));
+ for (int sid : getSids(ff.getCharset())) {
+ if (i < csbytes.size()) {
+ i++;
+ strings.put(readString(sid), csbytes.get(i));
+ }
+ }
+ }
+ return strings;
+ }
+
+ private static String readString(int index) throws IOException {
+ if (index >= 0 && index <= 390) {
+ return CFFStandardString.getName(index);
+ }
+ // technically this maps to .notdef, but we need a unique glyph name
+ return "SID" + index;
}
public byte[] getMergedFontSubset() throws IOException {
@@ -296,15 +352,15 @@ public class MergeCFFFonts extends OTFSu
stringIndexData.add(stringIndexData.remove(0));
}
} else {
- String notice = (String)fileFont.getProperty("Notice");
- if (notice != null && !(fileFont instanceof CFFFontROS)) {
+ String notice = (String)fileFont.getTopDict().get("Notice");
+ if (notice != null && !(fileFont instanceof CFFCIDFont)) {
stringIndexData.add(notice.getBytes("ISO-8859-1"));
}
}
stringIndexData.add(embeddedName.getBytes("UTF-8"));
writeIndex(stringIndexData);
} else {
- String notice = (String)fileFont.getProperty("Notice");
+ String notice = (String)fileFont.getTopDict().get("Notice");
if (notice != null) {
writeIndex(Arrays.<byte[]>asList(notice.getBytes("ISO-8859-1"), embeddedName.getBytes("UTF-8")));
} else {
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java?rev=1739083&r1=1739082&r2=1739083&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeFonts.java Thu Apr 14 12:52:43 2016
@@ -20,10 +20,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
-import org.apache.pdfbox.pdmodel.font.PDFont;
-
public interface MergeFonts {
- void readFont(InputStream is, String name, PDFont pdFont, Map<Integer, Integer> subsetGlyphs, boolean cid)
- throws IOException;
+ void readFont(InputStream is, String name, FontContainer fontContainer,
+ Map<Integer, Integer> subsetGlyphs, boolean cid) throws IOException;
byte[] getMergedFontSubset() throws IOException;
}
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=1739083&r1=1739082&r2=1739083&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 Thu Apr 14 12:52:43 2016
@@ -16,7 +16,9 @@
*/
package org.apache.fop.render.pdf.pdfbox;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
+import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
@@ -28,42 +30,44 @@ import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+
+import org.apache.fontbox.cff.CFFCIDFont;
+import org.apache.fontbox.cff.CFFCharset;
+import org.apache.fontbox.cff.CFFEncoding;
import org.apache.fontbox.cff.CFFFont;
-import org.apache.fontbox.cff.CFFFontROS;
-import org.apache.fontbox.cff.charset.CFFCharset;
-import org.apache.fontbox.cff.encoding.CFFEncoding;
-import org.apache.fontbox.ttf.CMAPEncodingEntry;
+import org.apache.fontbox.ttf.CmapSubtable;
import org.apache.fontbox.ttf.TrueTypeFont;
-
+import org.apache.pdfbox.contentstream.operator.Operator;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSString;
+
import org.apache.pdfbox.pdmodel.common.PDStream;
-import org.apache.pdfbox.pdmodel.font.PDCIDFontType0Font;
-import org.apache.pdfbox.pdmodel.font.PDCIDFontType2Font;
+import org.apache.pdfbox.pdmodel.font.PDCIDFontType0;
+import org.apache.pdfbox.pdmodel.font.PDCIDFontType2;
import org.apache.pdfbox.pdmodel.font.PDFont;
-import org.apache.pdfbox.pdmodel.font.PDFontDescriptorDictionary;
-import org.apache.pdfbox.pdmodel.font.PDFontFactory;
import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
+import org.apache.pdfbox.pdmodel.font.PDType1CFont;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
-import org.apache.pdfbox.util.operator.Operator;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.fonts.SingleByteFont;
import org.apache.fop.fonts.Typeface;
import org.apache.fop.fonts.truetype.OTFSubSetFile;
+
import org.apache.fop.pdf.PDFText;
+
public class MergeFontsPDFWriter extends PDFWriter {
protected static final Log log = LogFactory.getLog(MergeFontsPDFWriter.class);
private COSDictionary fonts;
private FontInfo fontInfo;
private Typeface font;
- private PDFont oldFont = null;
+ private FontContainer oldFont = null;
protected Map<COSName, String> fontsToRemove = new HashMap<COSName, String>();
- private final Map<COSDictionary, PDFont> fontMap = new HashMap<COSDictionary, PDFont>();
+ private final Map<COSDictionary, FontContainer> fontMap = new HashMap<COSDictionary, FontContainer>();
private static final Pattern SUBSET_PATTERN = Pattern.compile("[A-Z][A-Z][A-Z][A-Z][A-Z][A-Z]\\+.+");
private Collection<String> parentFonts;
@@ -83,7 +87,8 @@ public class MergeFontsPDFWriter extends
for (COSName cn : fontsToRemove.keySet()) {
fonts.removeItem(cn);
}
- parentFonts = fontsToRemove.values();
+ parentFonts.clear();
+ parentFonts.addAll(fontsToRemove.values());
return txt;
}
@@ -98,7 +103,7 @@ public class MergeFontsPDFWriter extends
}
if (fontData == null || internalName == null) {
s.append("/" + key.getName(cn));
- if (op.getOperation().equals("Tf")) {
+ if (op.getName().equals("Tf")) {
font = null;
oldFont = null;
}
@@ -154,66 +159,63 @@ public class MergeFontsPDFWriter extends
}
private String getUniqueFontName(COSDictionary fontData) throws IOException {
- PDFont font = getFont(fontData);
- String extra = "";
- String name = getName(font.getBaseFont()) + "_" + ((COSName)fontData.getItem(COSName.SUBTYPE)).getName();
- if (font instanceof PDType0Font
- && ((PDType0Font) font).getDescendantFont() instanceof PDCIDFontType0Font
- && ((PDCIDFontType0Font) ((PDType0Font) font).getDescendantFont()).getType1CFont() != null) {
- CFFFont cffFont =
- ((PDCIDFontType0Font) ((PDType0Font) font).getDescendantFont()).getType1CFont().getCFFFont();
- if (cffFont instanceof CFFFontROS
- && ((CFFFontROS)cffFont).getFdSelect().getClass().getName()
- .equals("org.apache.fontbox.cff.CFFParser$Format0FDSelect")) {
- extra += "format0";
- }
- return name + extra;
- } else if (font instanceof PDType0Font
- && getToUnicode(font) != null
- && ((PDType0Font) font).getDescendantFont() instanceof PDCIDFontType2Font) {
- if (!isSubsetFont(font.getBaseFont())) {
- extra = "f3";
- }
- return name + extra;
- } else if (font instanceof PDTrueTypeFont && isSubsetFont(font.getBaseFont())) {
- TrueTypeFont tt = ((PDTrueTypeFont) font).getTTFFont();
- for (CMAPEncodingEntry c : tt.getCMAP().getCmaps()) {
- if (c.getGlyphId(1) > 0) {
- extra = "cid";
+ FontContainer fontContainer = getFont(fontData);
+ PDFont font = fontContainer.font;
+ if (font.getName() != null) {
+ String extra = "";
+ String name = getName(font.getName()) + "_" + ((COSName)fontData.getItem(COSName.SUBTYPE)).getName();
+ if (font instanceof PDType0Font
+ && ((PDType0Font) font).getDescendantFont() instanceof PDCIDFontType0) {
+ CFFFont cffFont = ((PDCIDFontType0) ((PDType0Font) font).getDescendantFont()).getCFFFont();
+ if (cffFont instanceof CFFCIDFont
+ && ((CFFCIDFont)cffFont).getFdSelect().getClass().getName()
+ .equals("org.apache.fontbox.cff.CFFParser$Format0FDSelect")) {
+ extra += "format0";
}
+ return name + extra;
+ } else if (font instanceof PDType0Font
+ && fontContainer.getToUnicode() != null
+ && ((PDType0Font) font).getDescendantFont() instanceof PDCIDFontType2) {
+ if (!isSubsetFont(font.getName())) {
+ extra = "f3";
+ }
+ return name + extra;
+ } else if (font instanceof PDTrueTypeFont && isSubsetFont(font.getName())) {
+ TrueTypeFont tt = ((PDTrueTypeFont) font).getTrueTypeFont();
+ for (CmapSubtable c : tt.getCmap().getCmaps()) {
+ if (c.getGlyphId(1) > 0) {
+ extra = "cid";
+ }
+ }
+ return name + extra;
+ } else if (font instanceof PDType1CFont) {
+ return getNamePDType1Font(name, (PDType1CFont) font);
+ } else if (font instanceof PDType1Font) {
+ return name;
}
- return name + extra;
- } else if (font instanceof PDType1Font) {
- return getNamePDType1Font(name, (PDType1Font) font);
}
return null;
}
- private String getNamePDType1Font(String name, PDType1Font font) throws IOException {
+ private String getNamePDType1Font(String name, PDType1CFont font) throws IOException {
String extra = "";
- if (font.getType1CFont() == null
- || font.getType1CFont().getCFFFont() == null) {
- if (font.getFontDescriptor() instanceof PDFontDescriptorDictionary) {
- return name;
- }
- return null;
- }
- CFFEncoding encoding = font.getType1CFont().getCFFFont().getEncoding();
+ CFFEncoding encoding = font.getCFFType1Font().getEncoding();
String eClass = encoding.getClass().getName();
if (eClass.equals("org.apache.fontbox.cff.CFFParser$Format1Encoding")) {
extra = "f1enc";
} else if (eClass.equals("org.apache.fontbox.cff.CFFParser$Format0Encoding")) {
extra = "f0enc";
}
- CFFCharset cs = font.getType1CFont().getCFFFont().getCharset();
- if (cs.getEntries().get(0).getSID() < OTFSubSetFile.NUM_STANDARD_STRINGS) {
+ CFFCharset cs = font.getCFFType1Font().getCharset();
+ List<Integer> sids = MergeCFFFonts.getSids(cs);
+ if (!sids.isEmpty() && sids.get(0) < OTFSubSetFile.NUM_STANDARD_STRINGS) {
extra += "stdcs";
}
if (cs.getClass().getName().equals("org.apache.fontbox.cff.CFFParser$Format1Charset")) {
extra += "f1cs";
}
- if (font.getFontEncoding() != null) {
- String enc = font.getFontEncoding().getClass().getSimpleName();
+ if (font.getEncoding() != null) {
+ String enc = font.getEncoding().getClass().getSimpleName();
if (!"DictionaryEncoding".equals(enc)) {
extra += enc;
}
@@ -265,44 +267,36 @@ public class MergeFontsPDFWriter extends
}
private Integer getMapping(byte i) throws IOException {
- if (oldFont.getFontEncoding() != null && font instanceof FOPPDFSingleByteFont) {
- String name = oldFont.getFontEncoding().getName(i);
- if (name != null && ((FOPPDFSingleByteFont)font).charMapGlobal.containsKey(name)) {
+ if (oldFont.getEncoding() != null && font instanceof FOPPDFSingleByteFont) {
+ String name = oldFont.getEncoding().getName(i);
+ if (!name.equals(".notdef") && ((FOPPDFSingleByteFont)font).charMapGlobal.containsKey(name)) {
return ((FOPPDFSingleByteFont)font).charMapGlobal.get(name);
}
}
return null;
}
- private List<String> readCOSString(COSString s, PDFont oldFont) throws IOException {
+ private List<String> readCOSString(COSString s, FontContainer oldFont) throws IOException {
List<String> word = new ArrayList<String>();
byte[] string = s.getBytes();
- int codeLength;
-// String t1Str = new String(string, "UTF-8");
- for (int i = 0; i < string.length; i += codeLength) {
- codeLength = 1;
- String c = oldFont.encode(string, i, codeLength);
-// if (oldFont instanceof PDType1Font && i < t1Str.length()) {
-// c = ((PDType1Font)oldFont).encodetype1(string, i, codeLength);
-// }
- if (c == null && i + 1 < string.length) {
- codeLength++;
- c = oldFont.encode(string, i, codeLength);
- }
- if (c == null) {
+ InputStream in = new ByteArrayInputStream(string);
+ while (in.available() > 0) {
+ int code = oldFont.font.readCode(in);
+ String unicode = oldFont.font.toUnicode(code);
+ if (unicode == null) {
return null;
}
- word.add(c);
+ word.add(unicode);
}
return word;
}
- protected PDFont getFont(COSDictionary fontData) throws IOException {
+ protected FontContainer getFont(COSDictionary fontData) throws IOException {
if (!fontMap.containsKey(fontData)) {
if (fontMap.size() > 10) {
fontMap.clear();
}
- fontMap.put(fontData, PDFontFactory.createFont(fontData));
+ fontMap.put(fontData, new FontContainer(fontData));
}
return fontMap.get(fontData);
}
@@ -317,9 +311,4 @@ public class MergeFontsPDFWriter extends
}
return name.replace(" ", "");
}
-
- protected static COSBase getToUnicode(PDFont font) {
- COSDictionary dict = (COSDictionary) font.getCOSObject();
- return dict.getDictionaryObject(COSName.TO_UNICODE);
- }
}
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java?rev=1739083&r1=1739082&r2=1739083&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeTTFonts.java Thu Apr 14 12:52:43 2016
@@ -22,9 +22,6 @@ import java.util.List;
import java.util.Map;
import java.util.TreeMap;
-import org.apache.fontbox.ttf.MaximumProfileTable;
-import org.apache.pdfbox.pdmodel.font.PDFont;
-
import org.apache.fop.fonts.truetype.FontFileReader;
import org.apache.fop.fonts.truetype.GlyfTable;
import org.apache.fop.fonts.truetype.OFDirTabEntry;
@@ -209,14 +206,14 @@ public class MergeTTFonts extends TTFSub
*
* @param is font file
* @param name name
- * @param pdFont pdFont
+ * @param fontContainer fontContainer
* @param subsetGlyphs Map of glyphs (glyphs has old index as (Integer) key and
* new index as (Integer) value)
* @param cid is cid
* @throws IOException in case of an I/O problem
*/
- public void readFont(InputStream is, String name, PDFont pdFont, Map<Integer, Integer> subsetGlyphs, boolean cid)
- throws IOException {
+ public void readFont(InputStream is, String name, FontContainer fontContainer,
+ Map<Integer, Integer> subsetGlyphs, boolean cid) throws IOException {
this.cid = cid;
if (subsetGlyphs.isEmpty()) {
return;
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java?rev=1739083&r1=1739082&r2=1739083&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/MergeType1Fonts.java Thu Apr 14 12:52:43 2016
@@ -28,7 +28,7 @@ import java.util.List;
import java.util.Map;
import org.apache.fontbox.encoding.Encoding;
-import org.apache.pdfbox.pdmodel.font.PDFont;
+import org.apache.fontbox.type1.Type1Font;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.fop.fonts.type1.PFBData;
@@ -55,16 +55,15 @@ public class MergeType1Fonts extends Typ
subsetEncodingEntries.add("dup 0 /.notdef put");
}
- public void readFont(InputStream fontFile, String name, PDFont pdFont,
+ public void readFont(InputStream fontFile, String name, FontContainer font,
Map<Integer, Integer> subsetGlyphs, boolean cid) throws IOException {
PFBParser pfbParser = new PFBParser();
pfbData = pfbParser.parsePFB(fontFile);
PostscriptParser psParser = new PostscriptParser();
List<Integer> glyphs = new ArrayList<Integer>();
- assert pdFont instanceof PDType1Font;
- PDType1Font font = (PDType1Font) pdFont;
- Encoding enc = font.getType1Font().getEncoding();
+ Type1Font t1f = ((PDType1Font)font.font).getType1Font();
+ Encoding enc = t1f.getEncoding();
for (int i = font.getFirstChar(); i <= font.getLastChar(); i++) {
if (!enc.getName(i).equals(".notdef")) {
nameMap.put(i, enc.getName(i));
@@ -97,14 +96,14 @@ public class MergeType1Fonts extends Typ
subrsEndStream.write(decoded, subroutines.getEndPoint(),
charStrings.getStartPoint() - subroutines.getEndPoint());
}
- List<byte[]> subArray = font.getType1Font().getSubrsArray();
+ List<byte[]> subArray = t1f.getSubrsArray();
for (int i = 0; i < subArray.size(); i++) {
if (subByteMap.containsKey(i) && !Arrays.equals(subByteMap.get(i), subArray.get(i))) {
- throw new IOException("Can't merge font subroutines " + font.getBaseFont());
+ throw new IOException("Can't merge font subroutines " + font.font.getName());
}
subByteMap.put(i, subArray.get(i));
}
- Map<String, byte[]> cs = font.getType1Font().getCharStringsDict();
+ Map<String, byte[]> cs = t1f.getCharStringsDict();
int lenIV = 4;
PostscriptParser.PSElement element = getElement("/lenIV", mainSection);
if (element != null && element instanceof PostscriptParser.PSVariable) {
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=1739083&r1=1739082&r2=1739083&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 Thu Apr 14 12:52:43 2016
@@ -33,7 +33,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -58,10 +57,8 @@ import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.PDPageNode;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.COSObjectable;
-import org.apache.pdfbox.pdmodel.common.COSStreamArray;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.common.PDStream;
@@ -166,14 +163,14 @@ public class PDFBoxAdapter {
newArray.add(cloneForNewDocument(array.get(i), array.get(i), exclude));
}
return newArray;
- } else if (base instanceof COSStreamArray) {
- COSStreamArray array = (COSStreamArray)base;
- PDFArray newArray = new PDFArray();
- cacheClonedObject(keyBase, newArray);
- for (int i = 0, c = array.getStreamCount(); i < c; i++) {
- newArray.add(cloneForNewDocument(array.get(i)));
- }
- return newArray;
+// } else if (base instanceof COSStreamArray) {
+// COSStreamArray array = (COSStreamArray)base;
+// PDFArray newArray = new PDFArray();
+// cacheClonedObject(keyBase, newArray);
+// for (int i = 0, c = array.getStreamCount(); i < c; i++) {
+// newArray.add(cloneForNewDocument(array.get(i)));
+// }
+// return newArray;
} else if (base instanceof COSStream) {
return readCOSStream((COSStream) base, keyBase);
} else if (base instanceof COSDictionary) {
@@ -220,8 +217,8 @@ public class PDFBoxAdapter {
private Object readCOSObject(COSObject object, Collection exclude) throws IOException {
if (log.isTraceEnabled()) {
log.trace("Cloning indirect object: "
- + object.getObjectNumber().longValue()
- + " " + object.getGenerationNumber().longValue());
+ + object.getObjectNumber()
+ + " " + object.getGenerationNumber());
}
Object obj = cloneForNewDocument(object.getObject(), object, exclude);
if (obj instanceof PDFObject) {
@@ -235,8 +232,8 @@ public class PDFBoxAdapter {
+ pdfobj.getObjectNumber()
+ " " + pdfobj.getGeneration()
+ " for COSObject: "
- + object.getObjectNumber().longValue()
- + " " + object.getGenerationNumber().longValue());
+ + object.getObjectNumber()
+ + " " + object.getGenerationNumber());
}
}
return obj;
@@ -262,7 +259,8 @@ public class PDFBoxAdapter {
private Object readCOSStream(COSStream originalStream, Object keyBase) throws IOException {
InputStream in;
Set filter;
- if (pdfDoc.isEncryptionActive()) {
+ if (pdfDoc.isEncryptionActive()
+ || (originalStream.containsKey(COSName.DECODE_PARMS) && !originalStream.containsKey(COSName.FILTER))) {
in = originalStream.getUnfilteredStream();
filter = FILTER_FILTER;
} else {
@@ -301,7 +299,7 @@ public class PDFBoxAdapter {
private Object getBaseKey(Object base) {
if (base instanceof COSObject) {
COSObject obj = (COSObject)base;
- return obj.getObjectNumber().intValue() + " " + obj.getGenerationNumber().intValue();
+ return obj.getObjectNumber() + " " + obj.getGenerationNumber();
} else if (base instanceof COSDictionary) {
return base;
} else {
@@ -345,15 +343,12 @@ public class PDFBoxAdapter {
if (pageNumbers.containsKey(targetPage.getPageIndex())) {
pageNumbers.get(targetPage.getPageIndex()).set(0, targetPage.makeReference());
}
- PDResources sourcePageResources = page.findResources();
- PDFDictionary pageResources;
- PDStream pdStream = page.getContents();
- if (pdStream == null) {
- return "";
- }
- COSDictionary fonts = (COSDictionary)sourcePageResources.getCOSDictionary().getDictionaryObject(COSName.FONT);
+ PDResources sourcePageResources = page.getResources();
+ PDStream pdStream = getContents(page);
+
+ COSDictionary fonts = (COSDictionary)sourcePageResources.getCOSObject().getDictionaryObject(COSName.FONT);
COSDictionary fontsBackup = null;
- UniqueName uniqueName = new UniqueName(key, sourceDoc, sourcePageResources);
+ UniqueName uniqueName = new UniqueName(key, sourcePageResources);
String newStream = null;
if (fonts != null && pdfDoc.isMergeFontsEnabled()) {
fontsBackup = new COSDictionary(fonts);
@@ -375,8 +370,8 @@ public class PDFBoxAdapter {
}
pdStream = new PDStream(sourceDoc, new ByteArrayInputStream(newStream.getBytes("ISO-8859-1")));
- mergeXObj(sourcePageResources.getCOSDictionary(), fontinfo, uniqueName);
- pageResources = (PDFDictionary)cloneForNewDocument(sourcePageResources.getCOSDictionary());
+ mergeXObj(sourcePageResources.getCOSObject(), fontinfo, uniqueName);
+ PDFDictionary pageResources = (PDFDictionary)cloneForNewDocument(sourcePageResources.getCOSObject());
PDFDictionary fontDict = (PDFDictionary)pageResources.get("Font");
if (fontDict != null && pdfDoc.isMergeFontsEnabled()) {
@@ -392,9 +387,9 @@ public class PDFBoxAdapter {
}
}
}
- updateXObj(sourcePageResources.getCOSDictionary(), pageResources);
+ updateXObj(sourcePageResources.getCOSObject(), pageResources);
if (fontsBackup != null) {
- sourcePageResources.getCOSDictionary().setItem(COSName.FONT, fontsBackup);
+ sourcePageResources.getCOSObject().setItem(COSName.FONT, fontsBackup);
}
COSStream originalPageContents = (COSStream)pdStream.getCOSObject();
@@ -403,17 +398,17 @@ public class PDFBoxAdapter {
PDFStream pageStream;
Set filter;
- if (originalPageContents instanceof COSStreamArray) {
- COSStreamArray array = (COSStreamArray)originalPageContents;
- pageStream = new PDFStream();
- InputStream in = array.getUnfilteredStream();
- OutputStream out = pageStream.getBufferOutputStream();
- IOUtils.copyLarge(in, out);
- filter = FILTER_FILTER;
- } else {
+// if (originalPageContents instanceof COSStreamArray) {
+// COSStreamArray array = (COSStreamArray)originalPageContents;
+// pageStream = new PDFStream();
+// InputStream in = array.getUnfilteredStream();
+// OutputStream out = pageStream.getBufferOutputStream();
+// IOUtils.copyLarge(in, out);
+// filter = FILTER_FILTER;
+// } else {
pageStream = (PDFStream)cloneForNewDocument(originalPageContents);
filter = Collections.EMPTY_SET;
- }
+// }
if (pageStream == null) {
pageStream = new PDFStream();
}
@@ -423,8 +418,8 @@ public class PDFBoxAdapter {
transferPageDict(fonts, uniqueName, sourcePageResources);
- PDRectangle mediaBox = page.findMediaBox();
- PDRectangle cropBox = page.findCropBox();
+ PDRectangle mediaBox = page.getMediaBox();
+ PDRectangle cropBox = page.getCropBox();
PDRectangle viewBox = cropBox != null ? cropBox : mediaBox;
//Handle the /Rotation entry on the page dict
@@ -444,6 +439,19 @@ public class PDFBoxAdapter {
atdoc.scale(-1, 1);
atdoc.translate(-viewBox.getLowerLeftX(), -viewBox.getLowerLeftY());
+ rotate(rotation, viewBox, atdoc);
+
+ StringBuilder boxStr = new StringBuilder();
+ boxStr.append(PDFNumber.doubleOut(mediaBox.getLowerLeftX())).append(' ')
+ .append(PDFNumber.doubleOut(mediaBox.getLowerLeftY())).append(' ')
+ .append(PDFNumber.doubleOut(mediaBox.getWidth())).append(' ')
+ .append(PDFNumber.doubleOut(mediaBox.getHeight())).append(" re W n\n");
+ return boxStr.toString() + IOUtils.toString(pdStream.createInputStream(null), "ISO-8859-1");
+ }
+
+ private void rotate(int rotation, PDRectangle viewBox, AffineTransform atdoc) {
+ float x = viewBox.getWidth() + viewBox.getLowerLeftX();
+ float y = viewBox.getHeight() + viewBox.getLowerLeftY();
switch (rotation) {
case 90:
atdoc.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
@@ -452,23 +460,27 @@ public class PDFBoxAdapter {
atdoc.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
break;
case 180:
- atdoc.translate(viewBox.getWidth(), viewBox.getHeight());
+ atdoc.translate(x, y);
atdoc.rotate(-Math.PI);
+ atdoc.translate(-viewBox.getLowerLeftX(), -viewBox.getLowerLeftY());
break;
case 270:
- atdoc.translate(0, viewBox.getHeight());
+ atdoc.translate(viewBox.getLowerLeftX(), y);
atdoc.rotate(Math.toRadians(270 + 180));
- atdoc.translate(-viewBox.getWidth(), -viewBox.getHeight());
+ atdoc.translate(-x, -y);
break;
default:
//no additional transformations necessary
break;
}
- StringBuilder boxStr = new StringBuilder();
- boxStr.append(0).append(' ').append(0).append(' ');
- boxStr.append(PDFNumber.doubleOut(mediaBox.getWidth())).append(' ');
- boxStr.append(PDFNumber.doubleOut(mediaBox.getHeight())).append(" re W n\n");
- return boxStr.toString() + pdStream.getInputStreamAsString();
+ }
+
+ private PDStream getContents(PDPage page) throws IOException {
+ PDStream pdStream = new PDStream(new COSStream());
+ OutputStream os = pdStream.createOutputStream();
+ IOUtils.copy(page.getContents(), os);
+ os.close();
+ return pdStream;
}
private void mergeXObj(COSDictionary sourcePageResources, FontInfo fontinfo, UniqueName uniqueName)
@@ -493,7 +505,7 @@ public class PDFBoxAdapter {
}
}
PDFWriter writer = new MergeFontsPDFWriter(src, fontinfo, uniqueName, parentFonts, 0);
- String c = writer.writeText(PDStream.createFromCOS(stream));
+ String c = writer.writeText(new PDStream(stream));
if (c != null) {
stream.removeItem(COSName.FILTER);
newXObj.put(i.getKey(), c);
@@ -532,7 +544,7 @@ public class PDFBoxAdapter {
targetPage.getPDFResources().addFont(name, (PDFDictionary)cloneForNewDocument(f.getValue()));
}
}
- for (Map.Entry<COSName, COSBase> e : sourcePageResources.getCOSDictionary().entrySet()) {
+ for (Map.Entry<COSName, COSBase> e : sourcePageResources.getCOSObject().entrySet()) {
transferDict(e, uniqueName);
}
}
@@ -580,31 +592,26 @@ public class PDFBoxAdapter {
//Pseudo-cache the target page in place of the original source page.
//This essentially replaces the original page reference with the target page.
COSObject cosPage = null;
- if (page.getCOSObject() instanceof COSObject) {
- cosPage = (COSObject) page.getCOSObject();
- cacheClonedObject(cosPage, this.targetPage);
- } else {
- PDPageNode pageNode = page.getParent();
- COSArray kids = (COSArray) pageNode.getDictionary().getDictionaryObject(COSName.KIDS);
- for (int i = 0; i < kids.size(); i++) {
- //Hopefully safe to cast, as kids need to be indirect objects
- COSObject kid = (COSObject) kids.get(i);
- if (!pageNumbers.containsKey(i)) {
- PDFArray a = new PDFArray();
- a.add(null);
- pdfDoc.assignObjectNumber(a);
- pdfDoc.addTrailerObject(a);
- pageNumbers.put(i, a);
- }
- cacheClonedObject(kid, pageNumbers.get(i));
- if (kid.getObject() == page.getCOSObject()) {
- cosPage = kid;
- }
- }
- if (cosPage == null) {
- throw new IOException("Illegal PDF. Page not part of parent page node.");
+ COSDictionary parentDic = (COSDictionary) page.getCOSObject().getDictionaryObject(COSName.PARENT, COSName.P);
+ COSArray kids = (COSArray) parentDic.getDictionaryObject(COSName.KIDS);
+ for (int i = 0; i < kids.size(); i++) {
+ //Hopefully safe to cast, as kids need to be indirect objects
+ COSObject kid = (COSObject) kids.get(i);
+ if (!pageNumbers.containsKey(i)) {
+ PDFArray a = new PDFArray();
+ a.add(null);
+ pdfDoc.assignObjectNumber(a);
+ pdfDoc.addTrailerObject(a);
+ pageNumbers.put(i, a);
+ }
+ cacheClonedObject(kid, pageNumbers.get(i));
+ if (kid.getObject() == page.getCOSObject()) {
+ cosPage = kid;
}
}
+ if (cosPage == null) {
+ throw new IOException("Illegal PDF. Page not part of parent page node.");
+ }
Set<COSObject> fields = copyAnnotations(page);
@@ -661,7 +668,7 @@ public class PDFBoxAdapter {
}
private Set<COSObject> copyAnnotations(PDPage page) throws IOException {
- COSArray annots = (COSArray) page.getCOSDictionary().getDictionaryObject(COSName.ANNOTS);
+ COSArray annots = (COSArray) page.getCOSObject().getDictionaryObject(COSName.ANNOTS);
Set<COSObject> fields = Collections.emptySet();
if (annots != null) {
fields = new TreeSet<COSObject>(new CompareFields());
@@ -696,8 +703,8 @@ public class PDFBoxAdapter {
}
private void moveAnnotations(PDPage page, List pageAnnotations, AffineTransform at) {
- PDRectangle mediaBox = page.findMediaBox();
- PDRectangle cropBox = page.findCropBox();
+ PDRectangle mediaBox = page.getMediaBox();
+ PDRectangle cropBox = page.getCropBox();
PDRectangle viewBox = cropBox != null ? cropBox : mediaBox;
for (Object obj : pageAnnotations) {
PDAnnotation annot = (PDAnnotation)obj;
@@ -705,19 +712,22 @@ public class PDFBoxAdapter {
float translateX = (float) (at.getTranslateX() - viewBox.getLowerLeftX());
float translateY = (float) (at.getTranslateY() - viewBox.getLowerLeftY());
if (rect != null) {
- rect.move(translateX, translateY);
+ rect.setUpperRightX(rect.getUpperRightX() + translateX);
+ rect.setLowerLeftX(rect.getLowerLeftX() + translateX);
+ rect.setUpperRightY(rect.getUpperRightY() + translateY);
+ rect.setLowerLeftY(rect.getLowerLeftY() + translateY);
annot.setRectangle(rect);
}
- COSArray vertices = (COSArray) annot.getDictionary().getDictionaryObject("Vertices");
- if (vertices != null) {
- Iterator iter = vertices.iterator();
- while (iter.hasNext()) {
- COSFloat x = (COSFloat) iter.next();
- COSFloat y = (COSFloat) iter.next();
- x.setValue(x.floatValue() + translateX);
- y.setValue(y.floatValue() + translateY);
- }
- }
+// COSArray vertices = (COSArray) annot.getCOSObject().getDictionaryObject("Vertices");
+// if (vertices != null) {
+// Iterator iter = vertices.iterator();
+// while (iter.hasNext()) {
+// COSFloat x = (COSFloat) iter.next();
+// COSFloat y = (COSFloat) iter.next();
+// x.setValue(x.floatValue() + translateX);
+// y.setValue(y.floatValue() + translateY);
+// }
+// }
}
}
@@ -725,7 +735,7 @@ public class PDFBoxAdapter {
private static final long serialVersionUID = -6081505461660440801L;
public int compare(COSObject o1, COSObject o2) {
- return o1.getObjectNumber().intValue() - o2.getObjectNumber().intValue();
+ return (int) (o1.getObjectNumber() - o2.getObjectNumber());
}
}
}
Modified: xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFUtil.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFUtil.java?rev=1739083&r1=1739082&r2=1739083&view=diff
==============================================================================
--- xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFUtil.java (original)
+++ xmlgraphics/fop-pdf-images/trunk/src/java/org/apache/fop/render/pdf/pdfbox/PDFUtil.java Thu Apr 14 12:52:43 2016
@@ -36,7 +36,7 @@ public final class PDFUtil {
*/
public static int getNormalizedRotation(PDPage page) {
//Handle the /Rotation entry on the page dict
- int rotation = page.findRotation();
+ int rotation = page.getRotation();
rotation %= 360;
if (rotation < 0) {
rotation += 360;
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=1739083&r1=1739082&r2=1739083&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 Thu Apr 14 12:52:43 2016
@@ -21,11 +21,11 @@ import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
+import org.apache.pdfbox.contentstream.operator.Operator;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSBase;
import org.apache.pdfbox.cos.COSBoolean;
@@ -36,7 +36,7 @@ import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.cos.COSString;
import org.apache.pdfbox.pdfparser.PDFStreamParser;
import org.apache.pdfbox.pdmodel.common.PDStream;
-import org.apache.pdfbox.util.operator.Operator;
+
public class PDFWriter {
protected StringBuilder s = new StringBuilder();
@@ -49,14 +49,15 @@ public class PDFWriter {
}
public String writeText(PDStream pdStream) throws IOException {
- Iterator<Object> it = new PDFStreamParser(pdStream).getTokenIterator();
+ PDFStreamParser pdfStreamParser = new PDFStreamParser(pdStream);
+ pdfStreamParser.parse();
+ List<Object> it = pdfStreamParser.getTokens();
List<COSBase> arguments = new ArrayList<COSBase>();
- while (it.hasNext()) {
- Object o = it.next();
+ for (Object o : it) {
if (o instanceof Operator) {
Operator op = (Operator)o;
readPDFArguments(op, arguments);
- s.append(op.getOperation() + "\n");
+ s.append(op.getName() + "\n");
arguments.clear();
if (op.getImageParameters() != null) {
for (Map.Entry<COSName, COSBase> cn : op.getImageParameters().entrySet()) {
@@ -94,14 +95,14 @@ public class PDFWriter {
s.append("/" + key.getName(cn));
s.append(" ");
} else if (c instanceof COSString) {
- s.append("<" + ((COSString) c).getHexString() + ">");
+ s.append("<" + ((COSString) c).toHexString() + ">");
} else if (c instanceof COSArray) {
s.append("[");
readPDFArguments(op, (Collection<COSBase>) ((COSArray) c).toList());
s.append("] ");
} else if (c instanceof COSDictionary) {
Collection<COSBase> dictArgs = new ArrayList<COSBase>();
- if (currentMCID != 0 && op.getOperation().equals("BDC")) {
+ if (currentMCID != 0 && op.getName().equals("BDC")) {
for (Map.Entry<COSName, COSBase> cn : ((COSDictionary)c).entrySet()) {
if (cn.getKey().getName().equals("MCID")) {
updateMCID(cn, dictArgs);
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org