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 vh...@apache.org on 2012/04/05 18:20:17 UTC
svn commit: r1309921 [33/42] - in
/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript: ./ examples/embedding/
examples/embedding/java/embedding/ examples/embedding/java/embedding/atxml/
examples/embedding/java/embedding/tools/ examples/plan/src/org/apa...
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererConfigurator.java Thu Apr 5 16:19:19 2012
@@ -19,7 +19,6 @@
package org.apache.fop.render.pcl;
-import java.awt.Graphics2D;
import java.util.List;
import org.apache.avalon.framework.configuration.Configuration;
@@ -108,11 +107,10 @@ public class PCLRendererConfigurator ext
throws FOPException {
FontManager fontManager = userAgent.getFactory().getFontManager();
- Graphics2D graphics2D = Java2DFontMetrics.createFontMetricsGraphics2D();
-
- List fontCollections = new java.util.ArrayList();
- fontCollections.add(new Base14FontCollection(graphics2D));
- fontCollections.add(new InstalledFontCollection(graphics2D));
+ final Java2DFontMetrics java2DFontMetrics = new Java2DFontMetrics();
+ final List fontCollections = new java.util.ArrayList();
+ fontCollections.add(new Base14FontCollection(java2DFontMetrics));
+ fontCollections.add(new InstalledFontCollection(java2DFontMetrics));
Configuration cfg = super.getRendererConfig(documentHandler.getMimeType());
if (cfg != null) {
@@ -120,7 +118,8 @@ public class PCLRendererConfigurator ext
FontEventListener listener = new FontEventAdapter(
userAgent.getEventBroadcaster());
List fontList = buildFontList(cfg, fontResolver, listener);
- fontCollections.add(new ConfiguredFontCollection(fontResolver, fontList));
+ fontCollections.add(new ConfiguredFontCollection(fontResolver, fontList,
+ userAgent.isComplexScriptFeaturesEnabled()));
}
fontManager.setup(fontInfo,
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererContext.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererContext.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererContext.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRendererContext.java Thu Apr 5 16:19:19 2012
@@ -83,4 +83,4 @@ public class PCLRendererContext extends
PCLConstants.COLOR_CANVAS)));
}
-}
\ No newline at end of file
+}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingMode.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingMode.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingMode.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingMode.java Thu Apr 5 16:19:19 2012
@@ -30,23 +30,26 @@ public final class PCLRenderingMode impl
private static final long serialVersionUID = 6359884255324755026L;
/** "Quality" rendering (mixed native and bitmap for improved quality) */
- public static final PCLRenderingMode QUALITY = new PCLRenderingMode("quality");
+ public static final PCLRenderingMode QUALITY = new PCLRenderingMode("quality", 1.0f);
/** "Speed" rendering (maximum speed with native rendering, reduced visual quality) */
- public static final PCLRenderingMode SPEED = new PCLRenderingMode("speed");
+ public static final PCLRenderingMode SPEED = new PCLRenderingMode("speed", 0.25f);
/**
* "Bitmap" rendering (pages are painted entirely as bitmaps, maximum quality,
* reduced performance)
*/
- public static final PCLRenderingMode BITMAP = new PCLRenderingMode("bitmap");
+ public static final PCLRenderingMode BITMAP = new PCLRenderingMode("bitmap", 1.0f);
private String name;
+ private float defaultDitheringQuality;
/**
* Constructor to add a new named item.
* @param name Name of the item.
+ * @param defaultDitheringQuality the default dithering quality (0.0f..1.0f)
*/
- private PCLRenderingMode(String name) {
+ private PCLRenderingMode(String name, float defaultDitheringQuality) {
this.name = name;
+ this.defaultDitheringQuality = defaultDitheringQuality;
}
/** @return the name of the enum */
@@ -55,6 +58,14 @@ public final class PCLRenderingMode impl
}
/**
+ * Returns the default dithering quality for this rendering mode.
+ * @return the default dithering quality (0.0f..1.0f)
+ */
+ public float getDefaultDitheringQuality() {
+ return this.defaultDitheringQuality;
+ }
+
+ /**
* Returns the enumeration/singleton object based on its name.
* @param name the name of the enumeration value
* @return the enumeration object
@@ -76,6 +87,7 @@ public final class PCLRenderingMode impl
}
/** {@inheritDoc} */
+ @Override
public String toString() {
return "PCLRenderingMode:" + name;
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingUtil.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingUtil.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingUtil.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/PCLRenderingUtil.java Thu Apr 5 16:19:19 2012
@@ -47,6 +47,9 @@ public class PCLRenderingUtil {
*/
private PCLRenderingMode renderingMode = PCLRenderingMode.SPEED;
+ /** Controls the dithering quality when rendering gray or color images. */
+ private float ditheringQuality = 0.5f;
+
/**
* Controls whether all text should be painted as text. This is a fallback setting in case
* the mixture of native and bitmapped text does not provide the necessary quality.
@@ -88,6 +91,7 @@ public class PCLRenderingUtil {
*/
public void setRenderingMode(PCLRenderingMode mode) {
this.renderingMode = mode;
+ this.ditheringQuality = mode.getDefaultDitheringQuality();
}
/**
@@ -99,6 +103,14 @@ public class PCLRenderingUtil {
}
/**
+ * Returns the dithering quality to be used when encoding gray or color images.
+ * @return the quality (0.0f..1.0f)
+ */
+ public float getDitheringQuality() {
+ return this.ditheringQuality;
+ }
+
+ /**
* Controls whether PJL commands shall be generated by the PCL renderer.
* @param disable true to disable PJL commands
*/
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pcl/extensions/PCLElementMapping.java Thu Apr 5 16:19:19 2012
@@ -57,7 +57,7 @@ public class PCLElementMapping extends E
protected void initialize() {
if (foObjs == null) {
- foObjs = new HashMap();
+ foObjs = new HashMap<String, Maker>();
//No extension elements, yet, only attributes
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/AbstractImageAdapter.java Thu Apr 5 16:19:19 2012
@@ -25,6 +25,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.java2d.color.profile.ColorProfileUtil;
import org.apache.fop.pdf.PDFColor;
import org.apache.fop.pdf.PDFConformanceException;
@@ -34,8 +35,8 @@ import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFICCBasedColorSpace;
import org.apache.fop.pdf.PDFICCStream;
import org.apache.fop.pdf.PDFImage;
+import org.apache.fop.pdf.PDFName;
import org.apache.fop.pdf.PDFReference;
-import org.apache.fop.util.ColorProfileUtil;
/**
* Abstract PDFImage implementation for the PDF renderer.
@@ -126,9 +127,15 @@ public abstract class AbstractImageAdapt
pdfICCStream = cs.getICCStream();
}
} else {
- if (cs == null && desc.startsWith("sRGB")) {
+ if (cs == null) {
+ if (desc == null || !desc.startsWith("sRGB")) {
+ log.warn("The default sRGB profile was indicated,"
+ + " but the profile description does not match what was expected: "
+ + desc);
+ }
//It's the default sRGB profile which we mapped to DefaultRGB in PDFRenderer
- cs = doc.getResources().getColorSpace("DefaultRGB");
+ cs = (PDFICCBasedColorSpace)doc.getResources().getColorSpace(
+ new PDFName("DefaultRGB"));
}
if (cs == null) {
// sRGB hasn't been set up for the PDF document
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/FOToPDFRoleMap.java Thu Apr 5 16:19:19 2012
@@ -22,8 +22,6 @@ package org.apache.fop.render.pdf;
import java.util.HashMap;
import java.util.Map;
-import org.w3c.dom.Node;
-
import org.apache.fop.events.EventBroadcaster;
import org.apache.fop.pdf.PDFName;
import org.apache.fop.pdf.PDFObject;
@@ -37,9 +35,11 @@ final class FOToPDFRoleMap {
/**
* Standard structure types defined by the PDF Reference, Fourth Edition (PDF 1.5).
*/
- private static final Map STANDARD_STRUCTURE_TYPES = new HashMap();
+ private static final Map<String, PDFName> STANDARD_STRUCTURE_TYPES
+ = new HashMap<String, PDFName>();
- private static final Map DEFAULT_MAPPINGS = new java.util.HashMap();
+ private static final Map<String, Mapper> DEFAULT_MAPPINGS
+ = new java.util.HashMap<String, Mapper>();
private static final PDFName THEAD;
private static final PDFName NON_STRUCT;
@@ -172,7 +172,7 @@ final class FOToPDFRoleMap {
* @return the structure type or null if no match could be found
*/
public static PDFName mapFormattingObject(String fo, PDFObject parent) {
- Mapper mapper = (Mapper)DEFAULT_MAPPINGS.get(fo);
+ Mapper mapper = (Mapper) DEFAULT_MAPPINGS.get(fo);
if (mapper != null) {
return mapper.getStructureType(parent);
} else {
@@ -180,27 +180,32 @@ final class FOToPDFRoleMap {
}
}
- public static PDFName mapFormattingObject(Node fo, PDFObject parent,
- EventBroadcaster eventBroadcaster) {
+ /**
+ * Maps a Formatting Object to a PDFName representing the associated structure type.
+ * @param fo the formatting object's local name
+ * @param role the value of the formatting object's role property
+ * @param parent the parent of the structure element to be mapped
+ * @param eventBroadcaster the event broadcaster
+ * @return the structure type or null if no match could be found
+ */
+ public static PDFName mapFormattingObject(String fo, String role,
+ PDFObject parent, EventBroadcaster eventBroadcaster) {
PDFName type = null;
- Node role = fo.getAttributes().getNamedItemNS(null, "role");
if (role == null) {
- type = mapFormattingObject(fo.getLocalName(), parent);
+ type = mapFormattingObject(fo, parent);
} else {
- String customType = role.getNodeValue();
- type = (PDFName) STANDARD_STRUCTURE_TYPES.get(customType);
+ type = (PDFName) STANDARD_STRUCTURE_TYPES.get(role);
if (type == null) {
- String foName = fo.getLocalName();
- type = mapFormattingObject(foName, parent);
+ type = mapFormattingObject(fo, parent);
PDFEventProducer.Provider.get(eventBroadcaster).nonStandardStructureType(fo,
- foName, customType, type.toString().substring(1));
+ fo, role, type.toString().substring(1));
}
}
assert type != null;
return type;
}
- private static interface Mapper {
+ private interface Mapper {
PDFName getStructureType(PDFObject parent);
}
@@ -222,7 +227,7 @@ final class FOToPDFRoleMap {
public PDFName getStructureType(PDFObject parent) {
PDFStructElem grandParent = (PDFStructElem)
- ((PDFStructElem)parent).getParentStructElem();
+ ((PDFStructElem) parent).getParentStructElem();
//TODO What to do with cells from table-footer? Currently they are mapped on TD.
PDFName type;
if (THEAD.equals(grandParent.getStructureType())) {
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java Thu Apr 5 16:19:19 2012
@@ -27,6 +27,7 @@ import java.awt.image.RenderedImage;
import java.io.IOException;
import java.io.OutputStream;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -78,12 +79,14 @@ public class ImageRenderedAdapter extend
}
/** {@inheritDoc} */
+ @Override
public int getWidth() {
RenderedImage ri = getImage().getRenderedImage();
return ri.getWidth();
}
/** {@inheritDoc} */
+ @Override
public int getHeight() {
RenderedImage ri = getImage().getRenderedImage();
return ri.getHeight();
@@ -94,11 +97,13 @@ public class ImageRenderedAdapter extend
}
/** {@inheritDoc} */
+ @Override
protected ColorSpace getImageColorSpace() {
return getEffectiveColorModel().getColorSpace();
}
/** {@inheritDoc} */
+ @Override
protected ICC_Profile getEffectiveICCProfile() {
ColorSpace cs = getImageColorSpace();
if (cs instanceof ICC_ColorSpace) {
@@ -110,6 +115,7 @@ public class ImageRenderedAdapter extend
}
/** {@inheritDoc} */
+ @Override
public void setup(PDFDocument doc) {
RenderedImage ri = getImage().getRenderedImage();
@@ -145,6 +151,7 @@ public class ImageRenderedAdapter extend
}
/** {@inheritDoc} */
+ @Override
public boolean isTransparent() {
ColorModel cm = getEffectiveColorModel();
if (cm instanceof IndexColorModel) {
@@ -172,7 +179,7 @@ public class ImageRenderedAdapter extend
i < ((IndexColorModel) cm).getMapSize();
i++) {
if ((alphas[i] & 0xFF) == 0) {
- return new Integer(i);
+ return Integer.valueOf(i);
}
}
}
@@ -180,6 +187,7 @@ public class ImageRenderedAdapter extend
}
/** {@inheritDoc} */
+ @Override
public PDFColor getTransparentColor() {
ColorModel cm = getEffectiveColorModel();
if (cm instanceof IndexColorModel) {
@@ -196,11 +204,13 @@ public class ImageRenderedAdapter extend
}
/** {@inheritDoc} */
+ @Override
public String getMask() {
return maskRef;
}
/** {@inheritDoc} */
+ @Override
public PDFReference getSoftMaskReference() {
return softMask;
}
@@ -212,12 +222,18 @@ public class ImageRenderedAdapter extend
/** {@inheritDoc} */
public void outputContents(OutputStream out) throws IOException {
+ long start = System.currentTimeMillis();
encodingHelper.encode(out);
+ long duration = System.currentTimeMillis() - start;
+ if (log.isDebugEnabled()) {
+ log.debug("Image encoding took " + duration + "ms");
+ }
}
private static final int MAX_HIVAL = 255;
/** {@inheritDoc} */
+ @Override
public void populateXObjectDictionary(PDFDictionary dict) {
ColorModel cm = getEffectiveColorModel();
if (cm instanceof IndexColorModel) {
@@ -237,7 +253,7 @@ public class ImageRenderedAdapter extend
if (hival > MAX_HIVAL) {
throw new UnsupportedOperationException("hival must not go beyond " + MAX_HIVAL);
}
- indexed.add(new Integer(hival));
+ indexed.add(Integer.valueOf(hival));
int[] palette = new int[c];
icm.getRGBs(palette);
ByteArrayOutputStream baout = new ByteArrayOutputStream();
@@ -250,6 +266,7 @@ public class ImageRenderedAdapter extend
baout.write(entry & 0xFF);
}
indexed.add(baout.toByteArray());
+ IOUtils.closeQuietly(baout);
dict.put("ColorSpace", indexed);
dict.put("BitsPerComponent", icm.getPixelSize());
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFConfigurationConstants.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFConfigurationConstants.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFConfigurationConstants.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFConfigurationConstants.java Thu Apr 5 16:19:19 2012
@@ -38,12 +38,44 @@ public interface PDFConfigurationConstan
String NO_EDIT_CONTENT = "noedit";
/** PDF encryption parameter: Forbids annotations, datatype: Boolean or "true"/"false" */
String NO_ANNOTATIONS = "noannotations";
+
+ /**
+ * PDF encryption parameter: Forbids filling in existing interactive forms, datatype:
+ * Boolean or "true"/"false"
+ */
+ String NO_FILLINFORMS = "nofillinforms";
+
+ /**
+ * PDF encryption parameter: Forbids extracting text and graphics, datatype: Boolean
+ * or "true"/"false"
+ */
+ String NO_ACCESSCONTENT = "noaccesscontent";
+
+ /**
+ * PDF encryption parameter: Forbids assembling document, datatype: Boolean or
+ * "true"/"false"
+ */
+ String NO_ASSEMBLEDOC = "noassembledoc";
+
+ /**
+ * PDF encryption parameter: Forbids printing to high quality, datatype: Boolean or
+ * "true"/"false"
+ */
+ String NO_PRINTHQ = "noprinthq";
+
+ /**
+ * PDF encryption length parameter: must be a multiple of 8 between 40 and 128,
+ * default value 40, datatype: int.
+ */
+ String ENCRYPTION_LENGTH = "encryption-length";
/** Rendering Options key for the PDF/A mode. */
String PDF_A_MODE = "pdf-a-mode";
/** Rendering Options key for the PDF/X mode. */
String PDF_X_MODE = "pdf-x-mode";
/** Rendering Options key for the ICC profile for the output intent. */
String KEY_OUTPUT_PROFILE = "output-profile";
+ /** PDF version entry: specify the version of the PDF document created, datatype: String */
+ String PDF_VERSION = "version";
/**
* Rendering Options key for disabling the sRGB color space (only possible if no PDF/A or
* PDF/X profile is active).
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFContentGenerator.java Thu Apr 5 16:19:19 2012
@@ -25,7 +25,7 @@ import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.io.OutputStream;
-import org.apache.fop.pdf.PDFColor;
+import org.apache.fop.pdf.PDFColorHandler;
import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFFilterList;
import org.apache.fop.pdf.PDFNumber;
@@ -51,6 +51,8 @@ public class PDFContentGenerator {
/** the current stream to add PDF commands to */
private PDFStream currentStream;
+ private PDFColorHandler colorHandler;
+
/** drawing state */
protected PDFPaintingState currentState = null;
/** Text generation utility holding the current font status */
@@ -80,6 +82,7 @@ public class PDFContentGenerator {
};
this.currentState = new PDFPaintingState();
+ this.colorHandler = new PDFColorHandler(document.getResources());
}
/**
@@ -267,10 +270,10 @@ public class PDFContentGenerator {
/** Indicates the end of a text object. */
protected void endTextObject() {
if (textutil.isInTextObject()) {
+ textutil.endTextObject();
if (this.inMarkedContentSequence) {
endMarkedContentSequence();
}
- textutil.endTextObject();
}
}
@@ -344,8 +347,9 @@ public class PDFContentGenerator {
*/
public void setColor(Color col, boolean fill, PDFStream stream) {
assert stream != null;
- PDFColor color = new PDFColor(this.document, col);
- stream.add(color.getColorSpaceOut(fill));
+ StringBuffer sb = new StringBuffer();
+ setColor(col, fill, sb);
+ stream.add(sb.toString());
}
/**
@@ -367,8 +371,7 @@ public class PDFContentGenerator {
*/
protected void setColor(Color col, boolean fill, StringBuffer pdf) {
if (pdf != null) {
- PDFColor color = new PDFColor(this.document, col);
- pdf.append(color.getColorSpaceOut(fill));
+ colorHandler.establishColor(pdf, col, fill);
} else {
setColor(col, fill, this.currentStream);
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java Thu Apr 5 16:19:19 2012
@@ -25,49 +25,47 @@ import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.IOException;
+import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
-import org.w3c.dom.NodeList;
-
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xmlgraphics.xmp.Metadata;
+import org.apache.fop.accessibility.StructureTreeEventHandler;
import org.apache.fop.apps.MimeConstants;
import org.apache.fop.fo.extensions.xmp.XMPMetadata;
import org.apache.fop.pdf.PDFAnnotList;
import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFPage;
-import org.apache.fop.pdf.PDFReference;
import org.apache.fop.pdf.PDFResourceContext;
import org.apache.fop.pdf.PDFResources;
import org.apache.fop.render.extensions.prepress.PageBoundaries;
import org.apache.fop.render.extensions.prepress.PageScale;
import org.apache.fop.render.intermediate.AbstractBinaryWritingIFDocumentHandler;
import org.apache.fop.render.intermediate.IFContext;
-import org.apache.fop.render.intermediate.IFDocumentHandler;
import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator;
import org.apache.fop.render.intermediate.IFDocumentNavigationHandler;
import org.apache.fop.render.intermediate.IFException;
import org.apache.fop.render.intermediate.IFPainter;
import org.apache.fop.render.pdf.extensions.PDFEmbeddedFileExtensionAttachment;
-import org.apache.fop.util.XMLUtil;
/**
- * {@link IFDocumentHandler} implementation that produces PDF.
+ * {@link org.apache.fop.render.intermediate.IFDocumentHandler} implementation that produces PDF.
*/
public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler {
/** logging instance */
private static Log log = LogFactory.getLog(PDFDocumentHandler.class);
- private int pageSequenceIndex;
-
private boolean accessEnabled;
private PDFLogicalStructureHandler logicalStructureHandler;
+ private PDFStructureTreeBuilder structureTreeBuilder;
+
/** the PDF Document being created */
protected PDFDocument pdfDoc;
@@ -93,7 +91,7 @@ public class PDFDocumentHandler extends
protected PageReference currentPageRef;
/** Used for bookmarks/outlines. */
- protected Map pageReferences = new java.util.HashMap();
+ protected Map<Integer, PageReference> pageReferences = new HashMap<Integer, PageReference>();
private final PDFDocumentNavigationHandler documentNavigationHandler
= new PDFDocumentNavigationHandler(this);
@@ -145,15 +143,23 @@ public class PDFDocumentHandler extends
this.pdfDoc = pdfUtil.setupPDFDocument(this.outputStream);
this.accessEnabled = getUserAgent().isAccessibilityEnabled();
if (accessEnabled) {
- pdfDoc.getRoot().makeTagged();
- logicalStructureHandler = new PDFLogicalStructureHandler(pdfDoc,
- getUserAgent().getEventBroadcaster());
+ setupAccessibility();
}
} catch (IOException e) {
throw new IFException("I/O error in startDocument()", e);
}
}
+ private void setupAccessibility() {
+ pdfDoc.getRoot().makeTagged();
+ logicalStructureHandler = new PDFLogicalStructureHandler(pdfDoc);
+ // TODO this is ugly. All the necessary information should be available
+ // at creation time in order to enforce immutability
+ structureTreeBuilder.setPdfFactory(pdfDoc.getFactory());
+ structureTreeBuilder.setLogicalStructureHandler(logicalStructureHandler);
+ structureTreeBuilder.setEventBroadcaster(getUserAgent().getEventBroadcaster());
+ }
+
/** {@inheritDoc} */
public void endDocumentHeader() throws IFException {
pdfUtil.generateDefaultXMPMetadata();
@@ -178,18 +184,7 @@ public class PDFDocumentHandler extends
/** {@inheritDoc} */
public void startPageSequence(String id) throws IFException {
- //TODO page sequence title
-
- if (this.pdfDoc.getRoot().getLanguage() == null
- && getContext().getLanguage() != null) {
- //No document-level language set, so we use the first page-sequence's language
- this.pdfDoc.getRoot().setLanguage(XMLUtil.toRFC3066(getContext().getLanguage()));
- }
-
- if (accessEnabled) {
- NodeList nodes = getUserAgent().getStructureTree().getPageSequence(pageSequenceIndex++);
- logicalStructureHandler.processStructureTree(nodes, getContext().getLanguage());
- }
+ //nop
}
/** {@inheritDoc} */
@@ -238,7 +233,7 @@ public class PDFDocumentHandler extends
pdfUtil.generatePageLabel(index, name);
currentPageRef = new PageReference(currentPage, size);
- this.pageReferences.put(new Integer(index), currentPageRef);
+ this.pageReferences.put(Integer.valueOf(index), currentPageRef);
this.generator = new PDFContentGenerator(this.pdfDoc, this.outputStream,
this.currentPage);
@@ -289,9 +284,9 @@ public class PDFDocumentHandler extends
/** {@inheritDoc} */
public void handleExtensionObject(Object extension) throws IFException {
if (extension instanceof XMPMetadata) {
- pdfUtil.renderXMPMetadata((XMPMetadata)extension);
+ pdfUtil.renderXMPMetadata((XMPMetadata) extension);
} else if (extension instanceof Metadata) {
- XMPMetadata wrapper = new XMPMetadata(((Metadata)extension));
+ XMPMetadata wrapper = new XMPMetadata(((Metadata) extension));
pdfUtil.renderXMPMetadata(wrapper);
} else if (extension instanceof PDFEmbeddedFileExtensionAttachment) {
PDFEmbeddedFileExtensionAttachment embeddedFile
@@ -307,22 +302,28 @@ public class PDFDocumentHandler extends
}
}
+ /** {@inheritDoc} */
+ public void setDocumentLocale(Locale locale) {
+ pdfDoc.getRoot().setLanguage(locale);
+ }
+
PageReference getPageReference(int pageIndex) {
- return (PageReference)this.pageReferences.get(
- new Integer(pageIndex));
+ return this.pageReferences.get(Integer.valueOf(pageIndex));
}
static final class PageReference {
- private final PDFReference pageRef;
+ private final String pageRef;
private final Dimension pageDimension;
private PageReference(PDFPage page, Dimension dim) {
- this.pageRef = page.makeReference();
+ // Avoid keeping references to PDFPage as memory usage is
+ // considerably increased when handling thousands of pages.
+ this.pageRef = page.makeReference().toString();
this.pageDimension = new Dimension(dim);
}
- public PDFReference getPageRef() {
+ public String getPageRef() {
return this.pageRef;
}
@@ -331,4 +332,11 @@ public class PDFDocumentHandler extends
}
}
+ @Override
+ public StructureTreeEventHandler getStructureTreeEventHandler() {
+ if (structureTreeBuilder == null) {
+ structureTreeBuilder = new PDFStructureTreeBuilder();
+ }
+ return structureTreeBuilder;
+ }
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentHandlerMaker.java Thu Apr 5 16:19:19 2012
@@ -36,6 +36,9 @@ public class PDFDocumentHandlerMaker ext
public IFDocumentHandler makeIFDocumentHandler(FOUserAgent ua) {
PDFDocumentHandler handler = new PDFDocumentHandler();
handler.setContext(new IFContext(ua));
+ if (ua.isAccessibilityEnabled()) {
+ ua.setStructureTreeEventHandler(handler.getStructureTreeEventHandler());
+ }
return handler;
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java Thu Apr 5 16:19:19 2012
@@ -31,6 +31,7 @@ import org.apache.fop.pdf.PDFFactory;
import org.apache.fop.pdf.PDFGoTo;
import org.apache.fop.pdf.PDFLink;
import org.apache.fop.pdf.PDFOutline;
+import org.apache.fop.pdf.PDFStructElem;
import org.apache.fop.render.intermediate.IFDocumentNavigationHandler;
import org.apache.fop.render.intermediate.IFException;
import org.apache.fop.render.intermediate.extensions.AbstractAction;
@@ -111,10 +112,9 @@ public class PDFDocumentNavigationHandle
PDFLink pdfLink = getPDFDoc().getFactory().makeLink(
targetRect2D, pdfAction);
if (pdfLink != null) {
- String ptr = link.getAction().getStructurePointer();
- if (documentHandler.getUserAgent().isAccessibilityEnabled()
- && ptr != null && ptr.length() > 0) {
- documentHandler.getLogicalStructureHandler().addLinkContentItem(pdfLink, ptr);
+ PDFStructElem structure = (PDFStructElem) link.getAction().getStructureTreeElement();
+ if (documentHandler.getUserAgent().isAccessibilityEnabled() && structure != null) {
+ documentHandler.getLogicalStructureHandler().addLinkContentItem(pdfLink, structure);
}
documentHandler.currentPage.addAnnotation(pdfLink);
}
@@ -189,7 +189,7 @@ public class PDFDocumentNavigationHandle
p2d = new Point2D.Double(
action.getTargetLocation().x / 1000.0,
(pageRef.getPageDimension().height - action.getTargetLocation().y) / 1000.0);
- String pdfPageRef = pageRef.getPageRef().toString();
+ String pdfPageRef = pageRef.getPageRef();
pdfGoTo.setPageReference(pdfPageRef);
pdfGoTo.setPosition(p2d);
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.java Thu Apr 5 16:19:19 2012
@@ -65,4 +65,14 @@ public interface PDFEventProducer extend
* @event.severity WARN
*/
void nonStandardStructureType(Object source, String fo, String type, String fallback);
+
+ /**
+ * The encryption length must be a multiple of 8 between 40 and 128.
+ *
+ * @param source the event source
+ * @param originalValue requested encryption length
+ * @param correctedValue corrected encryption length
+ * @event.severity WARN
+ */
+ void incorrectEncryptionLength(Object source, int originalValue, int correctedValue);
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.xml?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.xml (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFEventProducer.xml Thu Apr 5 16:19:19 2012
@@ -2,4 +2,5 @@
<catalogue xml:lang="en">
<message key="nonFullyResolvedLinkTargets">{count} link target{count,equals,1,,s} could not be fully resolved and now point{count,equals,1,,s} to the top of the page or {count,equals,1,is,are} dysfunctional.</message>
<message key="nonStandardStructureType">â{type}â is not a standard structure type defined by the PDF Reference. Falling back to â{fallback}â.</message>
+ <message key="incorrectEncryptionLength">Encryption length must be a multiple of 8 between 40 and 128. Setting encryption length to {correctedValue} instead of {originalValue}.</message>
</catalogue>
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerGraphics2D.java Thu Apr 5 16:19:19 2012
@@ -31,6 +31,7 @@ import org.apache.xmlgraphics.image.load
import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
import org.apache.fop.render.AbstractImageHandlerGraphics2D;
+import org.apache.fop.render.ImageHandlerUtil;
import org.apache.fop.render.RenderingContext;
import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
import org.apache.fop.svg.PDFGraphics2D;
@@ -60,8 +61,8 @@ public class PDFImageHandlerGraphics2D e
float imw = (float)dim.getWidth() / 1000f;
float imh = (float)dim.getHeight() / 1000f;
- float sx = fwidth / (float)imw;
- float sy = fheight / (float)imh;
+ float sx = fwidth / imw;
+ float sy = fheight / imh;
generator.comment("G2D start");
boolean accessibilityEnabled = context.getUserAgent().isAccessibilityEnabled();
@@ -123,8 +124,16 @@ public class PDFImageHandlerGraphics2D e
/** {@inheritDoc} */
public boolean isCompatible(RenderingContext targetContext, Image image) {
- return (image == null || image instanceof ImageGraphics2D)
+ boolean supported = (image == null || image instanceof ImageGraphics2D)
&& targetContext instanceof PDFRenderingContext;
+ if (supported) {
+ String mode = (String)targetContext.getHint(ImageHandlerUtil.CONVERSION_MODE);
+ if (ImageHandlerUtil.isConversionModeBitmap(mode)) {
+ //Disabling this image handler automatically causes a bitmap to be generated
+ return false;
+ }
+ }
+ return supported;
}
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawCCITTFax.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawCCITTFax.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawCCITTFax.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawCCITTFax.java Thu Apr 5 16:19:19 2012
@@ -19,44 +19,26 @@
package org.apache.fop.render.pdf;
-import java.awt.Rectangle;
-import java.io.IOException;
-
import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.impl.ImageRawCCITTFax;
import org.apache.fop.pdf.PDFImage;
-import org.apache.fop.pdf.PDFXObject;
-import org.apache.fop.render.ImageHandler;
import org.apache.fop.render.RenderingContext;
/**
* Image handler implementation which handles CCITT encoded images (CCITT fax group 3/4)
* for PDF output.
*/
-public class PDFImageHandlerRawCCITTFax implements ImageHandler {
+public class PDFImageHandlerRawCCITTFax extends AbstractPDFImageHandler {
private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
ImageFlavor.RAW_CCITTFAX,
};
- /** {@inheritDoc} */
- public void handleImage(RenderingContext context, Image image, Rectangle pos)
- throws IOException {
- PDFRenderingContext pdfContext = (PDFRenderingContext)context;
- PDFContentGenerator generator = pdfContext.getGenerator();
- ImageRawCCITTFax ccitt = (ImageRawCCITTFax)image;
-
- PDFImage pdfimage = new ImageRawCCITTFaxAdapter(ccitt, image.getInfo().getOriginalURI());
- PDFXObject xobj = generator.getDocument().addImage(
- generator.getResourceContext(), pdfimage);
-
- float x = (float)pos.getX() / 1000f;
- float y = (float)pos.getY() / 1000f;
- float w = (float)pos.getWidth() / 1000f;
- float h = (float)pos.getHeight() / 1000f;
- generator.placeImage(x, y, w, h, xobj);
+ @Override
+ PDFImage createPDFImage(Image image, String xobjectKey) {
+ return new ImageRawCCITTFaxAdapter((ImageRawCCITTFax) image, xobjectKey);
}
/** {@inheritDoc} */
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRawJPEG.java Thu Apr 5 16:19:19 2012
@@ -19,56 +19,32 @@
package org.apache.fop.render.pdf;
-import java.awt.Rectangle;
-import java.io.IOException;
-
import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.impl.ImageRawJPEG;
import org.apache.fop.pdf.PDFImage;
-import org.apache.fop.pdf.PDFXObject;
-import org.apache.fop.render.ImageHandler;
import org.apache.fop.render.RenderingContext;
-import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
/**
* Image handler implementation which handles raw JPEG images for PDF output.
*/
-public class PDFImageHandlerRawJPEG implements ImageHandler {
+public class PDFImageHandlerRawJPEG extends AbstractPDFImageHandler {
private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
ImageFlavor.RAW_JPEG,
};
/** {@inheritDoc} */
- public void handleImage(RenderingContext context, Image image, Rectangle pos)
- throws IOException {
- PDFRenderingContext pdfContext = (PDFRenderingContext)context;
- PDFContentGenerator generator = pdfContext.getGenerator();
- ImageRawJPEG imageJPEG = (ImageRawJPEG)image;
-
- PDFImage pdfimage = new ImageRawJPEGAdapter(imageJPEG, image.getInfo().getOriginalURI());
- PDFXObject xobj = generator.getDocument().addImage(
- generator.getResourceContext(), pdfimage);
-
- float x = (float)pos.getX() / 1000f;
- float y = (float)pos.getY() / 1000f;
- float w = (float)pos.getWidth() / 1000f;
- float h = (float)pos.getHeight() / 1000f;
- if (context.getUserAgent().isAccessibilityEnabled()) {
- MarkedContentInfo mci = pdfContext.getMarkedContentInfo();
- generator.placeImage(x, y, w, h, xobj, mci.tag, mci.mcid);
- } else {
- generator.placeImage(x, y, w, h, xobj);
- }
- }
-
- /** {@inheritDoc} */
public int getPriority() {
return 100;
}
+ @Override
+ PDFImage createPDFImage(Image image, String xobjectKey) {
+ return new ImageRawJPEGAdapter((ImageRawJPEG) image, xobjectKey);
+ }
+
/** {@inheritDoc} */
public Class getSupportedImageClass() {
return ImageRawJPEG.class;
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerRenderedImage.java Thu Apr 5 16:19:19 2012
@@ -19,50 +19,26 @@
package org.apache.fop.render.pdf;
-import java.awt.Rectangle;
-import java.io.IOException;
-
import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
import org.apache.fop.pdf.PDFImage;
-import org.apache.fop.pdf.PDFXObject;
-import org.apache.fop.render.ImageHandler;
import org.apache.fop.render.RenderingContext;
-import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
/**
* Image handler implementation which handles RenderedImage instances for PDF output.
*/
-public class PDFImageHandlerRenderedImage implements ImageHandler {
+public class PDFImageHandlerRenderedImage extends AbstractPDFImageHandler {
private static final ImageFlavor[] FLAVORS = new ImageFlavor[] {
ImageFlavor.BUFFERED_IMAGE,
ImageFlavor.RENDERED_IMAGE
};
- /** {@inheritDoc} */
- public void handleImage(RenderingContext context, Image image, Rectangle pos)
- throws IOException {
- PDFRenderingContext pdfContext = (PDFRenderingContext)context;
- PDFContentGenerator generator = pdfContext.getGenerator();
- ImageRendered imageRend = (ImageRendered)image;
-
- PDFImage pdfimage = new ImageRenderedAdapter(imageRend, image.getInfo().getOriginalURI());
- PDFXObject xobj = generator.getDocument().addImage(
- generator.getResourceContext(), pdfimage);
-
- float x = (float)pos.getX() / 1000f;
- float y = (float)pos.getY() / 1000f;
- float w = (float)pos.getWidth() / 1000f;
- float h = (float)pos.getHeight() / 1000f;
- if (context.getUserAgent().isAccessibilityEnabled()) {
- MarkedContentInfo mci = pdfContext.getMarkedContentInfo();
- generator.placeImage(x, y, w, h, xobj, mci.tag, mci.mcid);
- } else {
- generator.placeImage(x, y, w, h, xobj);
- }
+ @Override
+ PDFImage createPDFImage(Image image, String xobjectKey) {
+ return new ImageRenderedAdapter((ImageRendered) image, xobjectKey);
}
/** {@inheritDoc} */
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFImageHandlerSVG.java Thu Apr 5 16:19:19 2012
@@ -24,22 +24,27 @@ import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.io.IOException;
+import org.w3c.dom.Document;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
import org.apache.batik.bridge.BridgeContext;
import org.apache.batik.bridge.GVTBuilder;
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.apache.batik.gvt.GraphicsNode;
import org.apache.batik.util.SVGConstants;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.apache.xmlgraphics.image.loader.Image;
import org.apache.xmlgraphics.image.loader.ImageFlavor;
import org.apache.xmlgraphics.image.loader.impl.ImageXMLDOM;
+import org.apache.xmlgraphics.util.UnitConv;
import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.image.loader.batik.BatikImageFlavors;
import org.apache.fop.image.loader.batik.BatikUtil;
import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.ImageHandlerUtil;
import org.apache.fop.render.RenderingContext;
import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
import org.apache.fop.svg.PDFAElementBridge;
@@ -47,7 +52,6 @@ import org.apache.fop.svg.PDFBridgeConte
import org.apache.fop.svg.PDFGraphics2D;
import org.apache.fop.svg.SVGEventProducer;
import org.apache.fop.svg.SVGUserAgent;
-import org.w3c.dom.Document;
/**
* Image Handler implementation which handles SVG images.
@@ -58,7 +62,8 @@ public class PDFImageHandlerSVG implemen
private static Log log = LogFactory.getLog(PDFImageHandlerSVG.class);
/** {@inheritDoc} */
- public void handleImage(RenderingContext context, Image image, Rectangle pos)
+ public void handleImage(RenderingContext context, // CSOK: MethodLength
+ Image image, Rectangle pos)
throws IOException {
PDFRenderingContext pdfContext = (PDFRenderingContext)context;
PDFContentGenerator generator = pdfContext.getGenerator();
@@ -109,11 +114,13 @@ public class PDFImageHandlerSVG implemen
//Scaling and translation for the bounding box of the image
AffineTransform scaling = new AffineTransform(
sx, 0, 0, sy, pos.x / 1000f, pos.y / 1000f);
+ double sourceScale = UnitConv.IN2PT / uaResolution;
+ scaling.scale(sourceScale, sourceScale);
//Scale for higher resolution on-the-fly images from Batik
- double s = uaResolution / deviceResolution;
AffineTransform resolutionScaling = new AffineTransform();
- resolutionScaling.scale(s, s);
+ double targetScale = uaResolution / deviceResolution;
+ resolutionScaling.scale(targetScale, targetScale);
resolutionScaling.scale(1.0 / sx, 1.0 / sy);
//Transformation matrix that establishes the local coordinate system for the SVG graphic
@@ -122,22 +129,38 @@ public class PDFImageHandlerSVG implemen
imageTransform.concatenate(scaling);
imageTransform.concatenate(resolutionScaling);
+ if (log.isTraceEnabled()) {
+ log.trace("nat size: " + w + "/" + h);
+ log.trace("req size: " + pos.width + "/" + pos.height);
+ log.trace("source res: " + uaResolution + ", targetRes: " + deviceResolution
+ + " --> target scaling: " + targetScale);
+ log.trace(image.getSize());
+ log.trace("sx: " + sx + ", sy: " + sy);
+ log.trace("scaling: " + scaling);
+ log.trace("resolution scaling: " + resolutionScaling);
+ log.trace("image transform: " + resolutionScaling);
+ }
+
/*
* Clip to the svg area.
* Note: To have the svg overlay (under) a text area then use
* an fo:block-container
*/
- generator.comment("SVG setup");
+ if (log.isTraceEnabled()) {
+ generator.comment("SVG setup");
+ }
generator.saveGraphicsState();
if (context.getUserAgent().isAccessibilityEnabled()) {
MarkedContentInfo mci = pdfContext.getMarkedContentInfo();
generator.beginMarkedContentSequence(mci.tag, mci.mcid);
}
- generator.setColor(Color.black, false);
- generator.setColor(Color.black, true);
+ generator.updateColor(Color.black, false, null);
+ generator.updateColor(Color.black, true, null);
if (!scaling.isIdentity()) {
- generator.comment("viewbox");
+ if (log.isTraceEnabled()) {
+ generator.comment("viewbox");
+ }
generator.add(CTMHelper.toPDFString(scaling, false) + " cm\n");
}
@@ -150,8 +173,10 @@ public class PDFImageHandlerSVG implemen
graphics.setGraphicContext(new org.apache.xmlgraphics.java2d.GraphicContext());
if (!resolutionScaling.isIdentity()) {
- generator.comment("resolution scaling for " + uaResolution
- + " -> " + deviceResolution + "\n");
+ if (log.isTraceEnabled()) {
+ generator.comment("resolution scaling for " + uaResolution
+ + " -> " + deviceResolution);
+ }
generator.add(
CTMHelper.toPDFString(resolutionScaling, false) + " cm\n");
graphics.scale(
@@ -159,7 +184,9 @@ public class PDFImageHandlerSVG implemen
1.0 / resolutionScaling.getScaleY());
}
- generator.comment("SVG start");
+ if (log.isTraceEnabled()) {
+ generator.comment("SVG start");
+ }
//Save state and update coordinate system for the SVG image
generator.getState().save();
@@ -175,6 +202,7 @@ public class PDFImageHandlerSVG implemen
graphics.setOutputStream(generator.getOutputStream());
try {
root.paint(graphics);
+ ctx.dispose();
generator.add(graphics.getString());
} catch (Exception e) {
SVGEventProducer eventProducer = SVGEventProducer.Provider.get(
@@ -187,7 +215,9 @@ public class PDFImageHandlerSVG implemen
} else {
generator.restoreGraphicsState();
}
- generator.comment("SVG end");
+ if (log.isTraceEnabled()) {
+ generator.comment("SVG end");
+ }
}
/** {@inheritDoc} */
@@ -209,10 +239,18 @@ public class PDFImageHandlerSVG implemen
/** {@inheritDoc} */
public boolean isCompatible(RenderingContext targetContext, Image image) {
- return (image == null
+ boolean supported = (image == null
|| (image instanceof ImageXMLDOM
&& image.getFlavor().isCompatible(BatikImageFlavors.SVG_DOM)))
&& targetContext instanceof PDFRenderingContext;
+ if (supported) {
+ String mode = (String)targetContext.getHint(ImageHandlerUtil.CONVERSION_MODE);
+ if (ImageHandlerUtil.isConversionModeBitmap(mode)) {
+ //Disabling this image handler automatically causes a bitmap to be generated
+ return false;
+ }
+ }
+ return supported;
}
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFLogicalStructureHandler.java Thu Apr 5 16:19:19 2012
@@ -19,16 +19,8 @@
package org.apache.fop.render.pdf;
-import java.util.HashMap;
import java.util.Locale;
-import java.util.Map;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.apache.fop.events.EventBroadcaster;
-import org.apache.fop.fo.extensions.ExtensionElementMapping;
-import org.apache.fop.fo.extensions.InternalElementMapping;
import org.apache.fop.pdf.PDFArray;
import org.apache.fop.pdf.PDFDictionary;
import org.apache.fop.pdf.PDFDocument;
@@ -53,13 +45,6 @@ class PDFLogicalStructureHandler {
private final PDFDocument pdfDoc;
- private final EventBroadcaster eventBroadcaster;
-
- /**
- * Map of references to the corresponding structure elements.
- */
- private final Map structTreeMap = new HashMap();
-
private final PDFParentTree parentTree = new PDFParentTree();
private int parentTreeKey;
@@ -108,73 +93,24 @@ class PDFLogicalStructureHandler {
*
* @param pdfDoc a document
*/
- PDFLogicalStructureHandler(PDFDocument pdfDoc, EventBroadcaster eventBroadcaster) {
+ PDFLogicalStructureHandler(PDFDocument pdfDoc) {
this.pdfDoc = pdfDoc;
- this.eventBroadcaster = eventBroadcaster;
- PDFStructTreeRoot structTreeRoot = pdfDoc.getFactory().makeStructTreeRoot(parentTree);
- rootStructureElement = pdfDoc.getFactory().makeStructureElement(
+ PDFStructTreeRoot structTreeRoot = pdfDoc.makeStructTreeRoot(parentTree);
+ rootStructureElement = pdfDoc.makeStructureElement(
FOToPDFRoleMap.mapFormattingObject("root", structTreeRoot), structTreeRoot);
structTreeRoot.addKid(rootStructureElement);
}
- /**
- * Converts the given structure tree into PDF.
- *
- * @param structureTree the structure tree of the current page sequence
- * @param language language set on the page sequence
- */
- void processStructureTree(NodeList structureTree, Locale language) {
- pdfDoc.enforceLanguageOnRoot();
- PDFStructElem structElemPart = pdfDoc.getFactory().makeStructureElement(
+
+ PDFStructElem createPageSequence(Locale language) {
+ PDFStructElem structElemPart = pdfDoc.makeStructureElement(
FOToPDFRoleMap.mapFormattingObject("page-sequence", rootStructureElement),
rootStructureElement);
rootStructureElement.addKid(structElemPart);
if (language != null) {
structElemPart.setLanguage(language);
}
-
- for (int i = 0, n = structureTree.getLength(); i < n; i++) {
- Node node = structureTree.item(i);
- assert node.getLocalName().equals("flow")
- || node.getLocalName().equals("static-content");
- PDFStructElem structElemSect = pdfDoc.getFactory().makeStructureElement(
- FOToPDFRoleMap.mapFormattingObject(node.getLocalName(), structElemPart),
- structElemPart);
- structElemPart.addKid(structElemSect);
- NodeList childNodes = node.getChildNodes();
- for (int j = 0, m = childNodes.getLength(); j < m; j++) {
- processNode(childNodes.item(j), structElemSect, true);
- }
- }
- }
-
- private void processNode(Node node, PDFStructElem parent, boolean addKid) {
- Node attr = node.getAttributes().getNamedItemNS(InternalElementMapping.URI, "ptr");
- assert attr != null;
- String ptr = attr.getNodeValue();
- PDFStructElem structElem = pdfDoc.getFactory().makeStructureElement(
- FOToPDFRoleMap.mapFormattingObject(node, parent, eventBroadcaster), parent);
- // TODO necessary? If a page-sequence is empty (e.g., contains a single
- // empty fo:block), should the block still be added to the structure
- // tree? This is not being done for descendant empty elements...
- if (addKid) {
- parent.addKid(structElem);
- }
- String nodeName = node.getLocalName();
- if (nodeName.equals("external-graphic") || nodeName.equals("instream-foreign-object")) {
- Node altTextNode = node.getAttributes().getNamedItemNS(
- ExtensionElementMapping.URI, "alt-text");
- if (altTextNode != null) {
- structElem.put("Alt", altTextNode.getNodeValue());
- } else {
- structElem.put("Alt", "No alternate text specified");
- }
- }
- structTreeMap.put(ptr, structElem);
- NodeList nodes = node.getChildNodes();
- for (int i = 0, n = nodes.getLength(); i < n; i++) {
- processNode(nodes.item(i), structElem, false);
- }
+ return structElemPart;
}
private int getNextParentTreeKey() {
@@ -208,96 +144,79 @@ class PDFLogicalStructureHandler {
parentTree.getNums().put(currentPage.getStructParents(), pageParentTreeArray);
}
- private MarkedContentInfo addToParentTree(String structurePointer) {
- PDFStructElem parent = (PDFStructElem) structTreeMap.get(structurePointer);
- if (parent == null) {
- return ARTIFACT;
- } else {
- pageParentTreeArray.add(parent);
- String type = parent.getStructureType().toString();
- int mcid = pageParentTreeArray.length() - 1;
- return new MarkedContentInfo(type, mcid, parent);
- }
+ private MarkedContentInfo addToParentTree(PDFStructElem structureTreeElement) {
+ PDFStructElem parent = (structureTreeElement instanceof PDFStructElem.Placeholder)
+ ? structureTreeElement.getParentStructElem()
+ : structureTreeElement;
+ pageParentTreeArray.add(parent);
+ String type = parent.getStructureType().toString();
+ int mcid = pageParentTreeArray.length() - 1;
+ return new MarkedContentInfo(type, mcid, structureTreeElement);
}
/**
* Adds a content item corresponding to text into the structure tree, if
* there is a structure element associated to it.
*
- * @param structurePointer reference to the parent structure element of the
- * piece of text
+ * @param structElem the parent structure element of the piece of text
* @return the necessary information for bracketing the content as a
* marked-content sequence. If there is no element in the structure tree
* associated to that content, returns an instance whose
* {@link MarkedContentInfo#tag} value is <code>null</code>. The content
* must then be treated as an artifact.
*/
- MarkedContentInfo addTextContentItem(String structurePointer) {
- MarkedContentInfo mci = addToParentTree(structurePointer);
- if (mci != ARTIFACT) {
+ MarkedContentInfo addTextContentItem(PDFStructElem structElem) {
+ if (structElem == null) {
+ return ARTIFACT;
+ } else {
+ MarkedContentInfo mci = addToParentTree(structElem);
PDFDictionary contentItem = new PDFDictionary();
contentItem.put("Type", MCR);
contentItem.put("Pg", this.currentPage);
contentItem.put("MCID", mci.mcid);
mci.parent.addKid(contentItem);
+ return mci;
}
- return mci;
}
/**
* Adds a content item corresponding to an image into the structure tree, if
* there is a structure element associated to it.
*
- * @param structurePointer reference to the parent structure element of the
- * image
+ * @param structElem the parent structure element of the image
* @return the necessary information for bracketing the content as a
* marked-content sequence. If there is no element in the structure tree
* associated to that image, returns an instance whose
- * {@link MarkedContentInfo#tag} value is <code>null</code>. The image
- * must then be treated as an artifact.
+ * {@link MarkedContentInfo#tag} value is <code>null</code>. The image must
+ * then be treated as an artifact.
*/
- MarkedContentInfo addImageContentItem(String structurePointer) {
- MarkedContentInfo mci = addToParentTree(structurePointer);
- if (mci != ARTIFACT) {
+ MarkedContentInfo addImageContentItem(PDFStructElem structElem) {
+ if (structElem == null) {
+ return ARTIFACT;
+ } else {
+ MarkedContentInfo mci = addToParentTree(structElem);
mci.parent.setMCIDKid(mci.mcid);
mci.parent.setPage(this.currentPage);
+ return mci;
}
- return mci;
}
- // While the PDF spec allows images to be referred as PDF objects, this
- // makes the Acrobat Pro checker complain that the image is not accessible.
- // Its alt-text is still read aloud though. Using marked-content sequences
- // like for text works.
-// MarkedContentInfo addImageObject(String parentReference) {
-// MarkedContentInfo mci = addToParentTree(parentReference);
-// if (mci != ARTIFACT) {
-// PDFDictionary contentItem = new PDFDictionary();
-// contentItem.put("Type", OBJR);
-// contentItem.put("Pg", this.currentPage);
-// contentItem.put("Obj", null);
-// mci.parent.addKid(contentItem);
-// }
-// return mci;
-// }
-
/**
* Adds a content item corresponding to the given link into the structure
* tree.
*
* @param link a link
- * @param structurePointer reference to the corresponding parent structure element
+ * @param structureTreeElement its parent structure element
*/
- void addLinkContentItem(PDFLink link, String structurePointer) {
+ void addLinkContentItem(PDFLink link, PDFStructElem structureTreeElement) {
int structParent = getNextParentTreeKey();
link.setStructParent(structParent);
- parentTree.getNums().put(structParent, link);
PDFDictionary contentItem = new PDFDictionary();
contentItem.put("Type", OBJR);
contentItem.put("Pg", this.currentPage);
contentItem.put("Obj", link);
- PDFStructElem parent = (PDFStructElem) structTreeMap.get(structurePointer);
- parent.addKid(contentItem);
+ parentTree.getNums().put(structParent, structureTreeElement);
+ structureTreeElement.addKid(contentItem);
}
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFPainter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFPainter.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFPainter.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFPainter.java Thu Apr 5 16:19:19 2012
@@ -37,6 +37,7 @@ import org.apache.fop.fonts.SingleByteFo
import org.apache.fop.fonts.Typeface;
import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFNumber;
+import org.apache.fop.pdf.PDFStructElem;
import org.apache.fop.pdf.PDFTextUtil;
import org.apache.fop.pdf.PDFXObject;
import org.apache.fop.render.RenderingContext;
@@ -44,8 +45,10 @@ import org.apache.fop.render.intermediat
import org.apache.fop.render.intermediate.IFContext;
import org.apache.fop.render.intermediate.IFException;
import org.apache.fop.render.intermediate.IFState;
+import org.apache.fop.render.intermediate.IFUtil;
import org.apache.fop.render.pdf.PDFLogicalStructureHandler.MarkedContentInfo;
import org.apache.fop.traits.BorderProps;
+import org.apache.fop.traits.Direction;
import org.apache.fop.traits.RuleStyle;
import org.apache.fop.util.CharUtilities;
@@ -84,6 +87,7 @@ public class PDFPainter extends Abstract
}
/** {@inheritDoc} */
+ @Override
protected IFContext getContext() {
return this.documentHandler.getContext();
}
@@ -132,27 +136,28 @@ public class PDFPainter extends Abstract
PDFXObject xobject = getPDFDoc().getXObject(uri);
if (xobject != null) {
if (accessEnabled) {
- String ptr = getContext().getStructurePointer();
- prepareImageMCID(ptr);
+ PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
+ prepareImageMCID(structElem);
placeImageAccess(rect, xobject);
} else {
placeImage(rect, xobject);
}
} else {
if (accessEnabled) {
- String ptr = getContext().getStructurePointer();
- prepareImageMCID(ptr);
+ PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
+ prepareImageMCID(structElem);
}
drawImageUsingURI(uri, rect);
flushPDFDoc();
}
}
- private void prepareImageMCID(String ptr) {
- imageMCI = logicalStructureHandler.addImageContentItem(ptr);
+ private void prepareImageMCID(PDFStructElem structElem) {
+ imageMCI = logicalStructureHandler.addImageContentItem(structElem);
}
/** {@inheritDoc} */
+ @Override
protected RenderingContext createRenderingContext() {
PDFRenderingContext pdfContext = new PDFRenderingContext(
getUserAgent(), generator, this.documentHandler.currentPage, getFontInfo());
@@ -192,8 +197,8 @@ public class PDFPainter extends Abstract
/** {@inheritDoc} */
public void drawImage(Document doc, Rectangle rect) throws IFException {
if (accessEnabled) {
- String ptr = getContext().getStructurePointer();
- prepareImageMCID(ptr);
+ PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
+ prepareImageMCID(structElem);
}
drawImageUsingDocument(doc, rect);
flushPDFDoc();
@@ -255,12 +260,13 @@ public class PDFPainter extends Abstract
}
/** {@inheritDoc} */
- public void drawBorderRect(Rectangle rect, BorderProps before, BorderProps after,
- BorderProps start, BorderProps end) throws IFException {
- if (before != null || after != null || start != null || end != null) {
+ @Override
+ public void drawBorderRect(Rectangle rect, BorderProps top, BorderProps bottom,
+ BorderProps left, BorderProps right) throws IFException {
+ if (top != null || bottom != null || left != null || right != null) {
generator.endTextObject();
try {
- this.borderPainter.drawBorders(rect, before, after, start, end);
+ this.borderPainter.drawBorders(rect, top, bottom, left, right);
} catch (IOException ioe) {
throw new IFException("I/O error while drawing borders", ioe);
}
@@ -268,6 +274,7 @@ public class PDFPainter extends Abstract
}
/** {@inheritDoc} */
+ @Override
public void drawLine(Point start, Point end, int width, Color color, RuleStyle style)
throws IFException {
generator.endTextObject();
@@ -278,7 +285,7 @@ public class PDFPainter extends Abstract
if (fontName == null) {
throw new NullPointerException("fontName must not be null");
}
- Typeface tf = (Typeface)getFontInfo().getFonts().get(fontName);
+ Typeface tf = getFontInfo().getFonts().get(fontName);
if (tf instanceof LazyFont) {
tf = ((LazyFont)tf).getRealFont();
}
@@ -286,12 +293,12 @@ public class PDFPainter extends Abstract
}
/** {@inheritDoc} */
- public void drawText(int x, int y, int letterSpacing, int wordSpacing, int[] dx,
+ public void drawText(int x, int y, int letterSpacing, int wordSpacing, int[][] dp,
String text)
throws IFException {
if (accessEnabled) {
- String ptr = getContext().getStructurePointer();
- MarkedContentInfo mci = logicalStructureHandler.addTextContentItem(ptr);
+ PDFStructElem structElem = (PDFStructElem) getContext().getStructureTreeElement();
+ MarkedContentInfo mci = logicalStructureHandler.addTextContentItem(structElem);
if (generator.getTextUtil().isInTextObject()) {
generator.separateTextElements(mci.tag, mci.mcid);
}
@@ -304,6 +311,19 @@ public class PDFPainter extends Abstract
FontTriplet triplet = new FontTriplet(
state.getFontFamily(), state.getFontStyle(), state.getFontWeight());
+
+ if ( ( dp == null ) || IFUtil.isDPOnlyDX ( dp ) ) {
+ drawTextWithDX ( x, y, text, triplet, letterSpacing,
+ wordSpacing, IFUtil.convertDPToDX ( dp ) );
+ } else {
+ drawTextWithDP ( x, y, text, triplet, letterSpacing,
+ wordSpacing, dp );
+ }
+ }
+
+ private void drawTextWithDX ( int x, int y, String text, FontTriplet triplet,
+ int letterSpacing, int wordSpacing, int[] dx ) {
+
//TODO Ignored: state.getFontVariant()
//TODO Opportunity for font caching if font state is more heavily used
String fontKey = getFontInfo().getInternalFontKey(triplet);
@@ -337,16 +357,7 @@ public class PDFPainter extends Abstract
float glyphAdjust = 0;
if (font.hasChar(orgChar)) {
ch = font.mapChar(orgChar);
- if (singleByteFont != null && singleByteFont.hasAdditionalEncodings()) {
- int encoding = ch / 256;
- if (encoding == 0) {
- textutil.updateTf(fontName, fontSize, tf.isMultiByte());
- } else {
- textutil.updateTf(fontName + "_" + Integer.toString(encoding),
- fontSize, tf.isMultiByte());
- ch = (char)(ch % 256);
- }
- }
+ ch = selectAndMapSingleByteFont(singleByteFont, fontName, fontSize, textutil, ch);
if ((wordSpacing != 0) && CharUtilities.isAdjustableSpace(orgChar)) {
glyphAdjust += wordSpacing;
}
@@ -362,6 +373,8 @@ public class PDFPainter extends Abstract
glyphAdjust += wordSpacing;
}
}
+ ch = selectAndMapSingleByteFont(singleByteFont, fontName, fontSize,
+ textutil, ch);
}
textutil.writeTJMappedChar(ch);
@@ -377,4 +390,83 @@ public class PDFPainter extends Abstract
textutil.writeTJ();
}
+ private static int[] paZero = new int[4];
+
+ private void drawTextWithDP ( int x, int y, String text, FontTriplet triplet,
+ int letterSpacing, int wordSpacing, int[][] dp ) {
+ assert text != null;
+ assert triplet != null;
+ assert dp != null;
+ String fk = getFontInfo().getInternalFontKey(triplet);
+ Typeface tf = getTypeface(fk);
+ if ( tf.isMultiByte() ) {
+ int fs = state.getFontSize();
+ float fsPoints = fs / 1000f;
+ Font f = getFontInfo().getFontInstance(triplet, fs);
+ // String fn = f.getFontName();
+ PDFTextUtil tu = generator.getTextUtil();
+ double xc = 0f;
+ double yc = 0f;
+ double xoLast = 0f;
+ double yoLast = 0f;
+ double wox = wordSpacing;
+ tu.writeTextMatrix ( new AffineTransform ( 1, 0, 0, -1, x / 1000f, y / 1000f ) );
+ tu.updateTf ( fk, fsPoints, true );
+ generator.updateCharacterSpacing ( letterSpacing / 1000f );
+ for ( int i = 0, n = text.length(); i < n; i++ ) {
+ char ch = text.charAt ( i );
+ int[] pa = ( i < dp.length ) ? dp [ i ] : paZero;
+ double xo = xc + pa[0];
+ double yo = yc + pa[1];
+ double xa = f.getCharWidth(ch) + maybeWordOffsetX ( wox, ch, null );
+ double ya = 0;
+ double xd = ( xo - xoLast ) / 1000f;
+ double yd = ( yo - yoLast ) / 1000f;
+ tu.writeTd ( xd, yd );
+ tu.writeTj ( f.mapChar ( ch ) );
+ xc += xa + pa[2];
+ yc += ya + pa[3];
+ xoLast = xo;
+ yoLast = yo;
+ }
+ }
+ }
+
+ private double maybeWordOffsetX ( double wox, char ch, Direction dir ) {
+ if ( ( wox != 0 )
+ && CharUtilities.isAdjustableSpace ( ch )
+ && ( ( dir == null ) || dir.isHorizontal() ) ) {
+ return wox;
+ } else {
+ return 0;
+ }
+ }
+
+ /*
+ private double maybeWordOffsetY ( double woy, char ch, Direction dir ) {
+ if ( ( woy != 0 )
+ && CharUtilities.isAdjustableSpace ( ch ) && dir.isVertical()
+ && ( ( dir != null ) && dir.isVertical() ) ) {
+ return woy;
+ } else {
+ return 0;
+ }
+ }
+ */
+
+ private char selectAndMapSingleByteFont(SingleByteFont singleByteFont, String fontName,
+ float fontSize, PDFTextUtil textutil, char ch) {
+ if (singleByteFont != null && singleByteFont.hasAdditionalEncodings()) {
+ int encoding = ch / 256;
+ if (encoding == 0) {
+ textutil.updateTf(fontName, fontSize, singleByteFont.isMultiByte());
+ } else {
+ textutil.updateTf(fontName + "_" + Integer.toString(encoding),
+ fontSize, singleByteFont.isMultiByte());
+ ch = (char)(ch % 256);
+ }
+ }
+ return ch;
+ }
+
}
Modified: xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java?rev=1309921&r1=1309920&r2=1309921&view=diff
==============================================================================
--- xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java (original)
+++ xmlgraphics/fop/branches/Temp_TrueTypeInPostScript/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java Thu Apr 5 16:19:19 2012
@@ -81,7 +81,7 @@ public class PDFRendererConfigurator ext
Configuration encryptionParamsConfig
= cfg.getChild(PDFConfigurationConstants.ENCRYPTION_PARAMS, false);
if (encryptionParamsConfig != null) {
- PDFEncryptionParams encryptionParams = new PDFEncryptionParams();
+ PDFEncryptionParams encryptionParams = pdfUtil.getEncryptionParams();
Configuration ownerPasswordConfig = encryptionParamsConfig.getChild(
PDFConfigurationConstants.OWNER_PASSWORD, false);
if (ownerPasswordConfig != null) {
@@ -118,8 +118,35 @@ public class PDFRendererConfigurator ext
if (noAnnotationsConfig != null) {
encryptionParams.setAllowEditAnnotations(false);
}
- pdfUtil.setEncryptionParams(encryptionParams);
+ Configuration noFillInForms = encryptionParamsConfig.getChild(
+ PDFConfigurationConstants.NO_FILLINFORMS, false);
+ if (noFillInForms != null) {
+ encryptionParams.setAllowFillInForms(false);
+ }
+ Configuration noAccessContentConfig = encryptionParamsConfig.getChild(
+ PDFConfigurationConstants.NO_ACCESSCONTENT, false);
+ if (noAccessContentConfig != null) {
+ encryptionParams.setAllowAccessContent(false);
+ }
+ Configuration noAssembleDocConfig = encryptionParamsConfig.getChild(
+ PDFConfigurationConstants.NO_ASSEMBLEDOC, false);
+ if (noAssembleDocConfig != null) {
+ encryptionParams.setAllowAssembleDocument(false);
+ }
+ Configuration noPrintHqConfig = encryptionParamsConfig.getChild(
+ PDFConfigurationConstants.NO_PRINTHQ, false);
+ if (noPrintHqConfig != null) {
+ encryptionParams.setAllowPrintHq(false);
+ }
+ Configuration encryptionLengthConfig = encryptionParamsConfig.getChild(
+ PDFConfigurationConstants.ENCRYPTION_LENGTH, false);
+ if (encryptionLengthConfig != null) {
+ int encryptionLength = checkEncryptionLength(
+ Integer.parseInt(encryptionLengthConfig.getValue(null)));
+ encryptionParams.setEncryptionLengthInBits(encryptionLength);
+ }
}
+
s = cfg.getChild(PDFConfigurationConstants.KEY_OUTPUT_PROFILE, true).getValue(null);
if (s != null) {
pdfUtil.setOutputProfileURI(s);
@@ -130,6 +157,40 @@ public class PDFRendererConfigurator ext
pdfUtil.setDisableSRGBColorSpace(
disableColorSpaceConfig.getValueAsBoolean(false));
}
+
+ setPDFDocVersion(cfg, pdfUtil);
+ }
+
+ private int checkEncryptionLength(int encryptionLength) {
+ int correctEncryptionLength = encryptionLength;
+ if (encryptionLength < 40) {
+ correctEncryptionLength = 40;
+ } else if (encryptionLength > 128) {
+ correctEncryptionLength = 128;
+ } else if (encryptionLength % 8 != 0) {
+ correctEncryptionLength = ((int) Math.round(encryptionLength / 8.0f)) * 8;
+ }
+ if (correctEncryptionLength != encryptionLength) {
+ PDFEventProducer.Provider.get(userAgent.getEventBroadcaster())
+ .incorrectEncryptionLength(this, encryptionLength, correctEncryptionLength);
+ }
+ return correctEncryptionLength;
+ }
+
+ private void setPDFDocVersion(Configuration cfg, PDFRenderingUtil pdfUtil) throws FOPException {
+ Configuration pdfVersion = cfg.getChild(PDFConfigurationConstants.PDF_VERSION, false);
+ if (pdfVersion != null) {
+ String version = pdfVersion.getValue(null);
+ if (version != null && version.length() != 0) {
+ try {
+ pdfUtil.setPDFVersion(version);
+ } catch (IllegalArgumentException e) {
+ throw new FOPException(e.getMessage());
+ }
+ } else {
+ throw new FOPException("The PDF version has not been set.");
+ }
+ }
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org