From c9f6e74ddf229f879ea7df1b389d6018286ca1aa Mon Sep 17 00:00:00 2001 From: Mehdi Houshmand Date: Tue, 26 Jun 2012 12:31:50 +0000 Subject: Improved the handling of defaults for PDF config and general clean up git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_URI_Unification@1353992 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/fop/afp/util/AFPResourceUtil.java | 60 +++-- .../apache/fop/apps/io/TempResourceResolver.java | 18 ++ .../fop/apps/io/TempResourceURIGenerator.java | 2 +- .../org/apache/fop/cli/CommandLineOptions.java | 7 +- src/java/org/apache/fop/fonts/CustomFont.java | 5 +- .../org/apache/fop/fonts/DefaultFontConfig.java | 10 +- src/java/org/apache/fop/fonts/EmbedFontInfo.java | 2 +- src/java/org/apache/fop/fonts/FontManager.java | 10 + src/java/org/apache/fop/fonts/FontReader.java | 1 - src/java/org/apache/fop/fonts/LazyFont.java | 10 +- src/java/org/apache/fop/fonts/MultiByteFont.java | 2 +- .../fop/fonts/autodetect/FontInfoFinder.java | 3 +- .../apache/fop/fonts/truetype/FontFileReader.java | 6 +- .../apache/fop/fonts/truetype/TTFCmapEntry.java | 118 +++++++++ .../org/apache/fop/fonts/truetype/TTFFile.java | 3 +- .../apache/fop/fonts/truetype/TTFFontLoader.java | 8 +- .../apache/fop/fonts/type1/Type1FontLoader.java | 4 + src/java/org/apache/fop/pdf/PDFFactory.java | 1 + .../fop/render/PrintRendererConfigurator.java | 38 ++- .../apache/fop/render/afp/AFPRendererConfig.java | 44 ++-- .../fop/render/afp/AFPRendererConfigOption.java | 64 ----- .../apache/fop/render/afp/AFPRendererOption.java | 64 +++++ .../fop/render/bitmap/BitmapRendererConfig.java | 34 +-- .../render/bitmap/BitmapRendererConfigOption.java | 74 ------ .../fop/render/bitmap/BitmapRendererOption.java | 74 ++++++ .../fop/render/bitmap/BitmapRenderingSettings.java | 6 +- .../fop/render/bitmap/TIFFDocumentHandler.java | 2 - .../fop/render/bitmap/TIFFRendererConfig.java | 18 +- .../render/java2d/ConfiguredFontCollection.java | 9 +- .../fop/render/pcl/Java2DRendererConfigOption.java | 49 ---- .../fop/render/pcl/Java2DRendererOption.java | 49 ++++ .../apache/fop/render/pcl/PCLRendererConfig.java | 14 +- .../apache/fop/render/pdf/PDFDocumentHandler.java | 4 +- .../apache/fop/render/pdf/PDFEncryptionOption.java | 100 +++++++ src/java/org/apache/fop/render/pdf/PDFPainter.java | 4 - .../apache/fop/render/pdf/PDFRendererConfig.java | 180 ++++++------- .../fop/render/pdf/PDFRendererConfigOption.java | 112 -------- .../fop/render/pdf/PDFRendererConfigurator.java | 47 +--- .../apache/fop/render/pdf/PDFRendererOption.java | 112 ++++++++ .../fop/render/pdf/PDFRendererOptionsConfig.java | 123 +++++++++ .../apache/fop/render/pdf/PDFRenderingUtil.java | 291 ++++++++------------- .../org/apache/fop/render/ps/PSRendererConfig.java | 20 +- .../render/ps/PSRendererConfigurationOption.java | 57 ---- .../org/apache/fop/render/ps/PSRendererOption.java | 57 ++++ .../org/apache/fop/render/ps/PSRenderingUtil.java | 6 +- .../org/apache/fop/render/ps/PSTextPainter.java | 2 +- .../apache/fop/render/ps/fonts/PSTTFGenerator.java | 101 +++++++ .../render/ps/fonts/PSTTFGlyphOutputStream.java | 75 ++++++ .../fop/render/ps/fonts/PSTTFOutputStream.java | 62 +++++ .../render/ps/fonts/PSTTFTableOutputStream.java | 59 +++++ .../apache/fop/render/txt/TxtRendererConfig.java | 12 +- .../fop/svg/PDFDocumentGraphics2DConfigurator.java | 2 +- 52 files changed, 1397 insertions(+), 838 deletions(-) create mode 100644 src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java delete mode 100644 src/java/org/apache/fop/render/afp/AFPRendererConfigOption.java create mode 100644 src/java/org/apache/fop/render/afp/AFPRendererOption.java delete mode 100644 src/java/org/apache/fop/render/bitmap/BitmapRendererConfigOption.java create mode 100644 src/java/org/apache/fop/render/bitmap/BitmapRendererOption.java delete mode 100644 src/java/org/apache/fop/render/pcl/Java2DRendererConfigOption.java create mode 100644 src/java/org/apache/fop/render/pcl/Java2DRendererOption.java create mode 100644 src/java/org/apache/fop/render/pdf/PDFEncryptionOption.java delete mode 100644 src/java/org/apache/fop/render/pdf/PDFRendererConfigOption.java create mode 100644 src/java/org/apache/fop/render/pdf/PDFRendererOption.java create mode 100644 src/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java delete mode 100644 src/java/org/apache/fop/render/ps/PSRendererConfigurationOption.java create mode 100644 src/java/org/apache/fop/render/ps/PSRendererOption.java create mode 100644 src/java/org/apache/fop/render/ps/fonts/PSTTFGenerator.java create mode 100644 src/java/org/apache/fop/render/ps/fonts/PSTTFGlyphOutputStream.java create mode 100644 src/java/org/apache/fop/render/ps/fonts/PSTTFOutputStream.java create mode 100644 src/java/org/apache/fop/render/ps/fonts/PSTTFTableOutputStream.java (limited to 'src/java/org') diff --git a/src/java/org/apache/fop/afp/util/AFPResourceUtil.java b/src/java/org/apache/fop/afp/util/AFPResourceUtil.java index 538f2b880..979376b3e 100644 --- a/src/java/org/apache/fop/afp/util/AFPResourceUtil.java +++ b/src/java/org/apache/fop/afp/util/AFPResourceUtil.java @@ -92,13 +92,10 @@ public final class AFPResourceUtil { throws UnsupportedEncodingException { //The first 8 bytes of the field data represent the resource name byte[] nameBytes = new byte[8]; - - byte[] fieldData = field.getData(); - if (fieldData.length < 8) { - throw new IllegalArgumentException("Field data does not contain a resource name"); - } - System.arraycopy(fieldData, 0, nameBytes, 0, 8); - return new String(nameBytes, AFPConstants.EBCIDIC_ENCODING); + System.arraycopy(field.getData(), 0, nameBytes, 0, 8); + String asciiName; + asciiName = new String(nameBytes, AFPConstants.EBCIDIC_ENCODING); + return asciiName; } /** @@ -131,13 +128,12 @@ public final class AFPResourceUtil { public static void copyNamedResource(String name, final InputStream in, final OutputStream out) throws IOException { final MODCAParser parser = new MODCAParser(in); - Collection resourceNames = new java.util.HashSet(); + Collection resourceNames = new java.util.HashSet(); //Find matching "Begin" field final UnparsedStructuredField fieldBegin; while (true) { - final UnparsedStructuredField field = parser.readNextStructuredField(); - + UnparsedStructuredField field = parser.readNextStructuredField(); if (field == null) { throw new IOException("Requested resource '" + name + "' not found. Encountered resource names: " + resourceNames); @@ -146,10 +142,8 @@ public final class AFPResourceUtil { if (field.getSfTypeCode() != TYPE_CODE_BEGIN) { //0xA8=Begin continue; //Not a "Begin" field } - final String resourceName = getResourceName(field); - + String resourceName = getResourceName(field); resourceNames.add(resourceName); - if (resourceName.equals(name)) { if (LOG.isDebugEnabled()) { LOG.debug("Start of requested structured field found:\n" @@ -176,35 +170,45 @@ public final class AFPResourceUtil { if (wrapInResource) { ResourceObject resourceObject = new ResourceObject(name) { protected void writeContent(OutputStream os) throws IOException { - copyNamedStructuredFields(name, fieldBegin, parser, out); + copyStructuredFields(name, fieldBegin, parser, out); } }; resourceObject.setType(ResourceObject.TYPE_PAGE_SEGMENT); resourceObject.writeToStream(out); } else { - copyNamedStructuredFields(name, fieldBegin, parser, out); + copyStructuredFields(name, fieldBegin, parser, out); } } - private static void copyNamedStructuredFields(final String name, - UnparsedStructuredField fieldBegin, MODCAParser parser, - OutputStream out) throws IOException { + private static void copyStructuredFields(String name, UnparsedStructuredField fieldBegin, + MODCAParser parser, OutputStream out) throws IOException { + boolean inRequestedResource; - UnparsedStructuredField field = fieldBegin; + //The "Begin" field first + out.write(MODCAParser.CARRIAGE_CONTROL_CHAR); + fieldBegin.writeTo(out); + UnparsedStructuredField field; - while (true) { + //Then the rest of the fields until the corresponding "End" field + inRequestedResource = true; + do { + field = parser.readNextStructuredField(); if (field == null) { - throw new IOException("Ending structured field not found for resource " + name); + break; //Unexpected EOF } - out.write(MODCAParser.CARRIAGE_CONTROL_CHAR); - field.writeTo(out); - if (field.getSfTypeCode() == TYPE_CODE_END - && fieldBegin.getSfCategoryCode() == field.getSfCategoryCode() - && name.equals(getResourceName(field))) { - break; + if (field.getSfTypeCode() == TYPE_CODE_END) { + String resourceName = getResourceName(field); + if (resourceName.equals(name)) { + inRequestedResource = false; //Signal end of loop + } } - field = parser.readNextStructuredField(); + out.write(MODCAParser.CARRIAGE_CONTROL_CHAR); + field.writeTo(out); + } while (inRequestedResource); + if (inRequestedResource) { + throw new IOException("Ending structured field not found for resource " + name); } } + } diff --git a/src/java/org/apache/fop/apps/io/TempResourceResolver.java b/src/java/org/apache/fop/apps/io/TempResourceResolver.java index ab9b4d75f..b17630a1d 100644 --- a/src/java/org/apache/fop/apps/io/TempResourceResolver.java +++ b/src/java/org/apache/fop/apps/io/TempResourceResolver.java @@ -22,9 +22,27 @@ package org.apache.fop.apps.io; import java.io.IOException; import java.io.OutputStream; +/** + * Implementations of this interface resolve URIs for temporary files used by FOP. The temporary- + * resource URI scheme comes from {@link TempResourceURIGenerator#TMP_SCHEMA}. + */ public interface TempResourceResolver { + /** + * Get a temporary-resource given the URI pointing to said resource. + * + * @param uri the resource URI + * @return the resource + * @throws IOException if an I/O error occured during resource acquisition + */ Resource getResource(String id) throws IOException; + /** + * Gets an temporary-output stream of a given URI. + * + * @param uri the output stream URI + * @return the output stream + * @throws IOException if an I/O error occured while creating an output stream + */ OutputStream getOutputStream(String id) throws IOException; } diff --git a/src/java/org/apache/fop/apps/io/TempResourceURIGenerator.java b/src/java/org/apache/fop/apps/io/TempResourceURIGenerator.java index 039f4cab4..8e6c3606c 100644 --- a/src/java/org/apache/fop/apps/io/TempResourceURIGenerator.java +++ b/src/java/org/apache/fop/apps/io/TempResourceURIGenerator.java @@ -25,7 +25,7 @@ import java.util.concurrent.atomic.AtomicLong; */ public final class TempResourceURIGenerator { - private static final String TMP_SCHEMA = "tmp"; + public static final String TMP_SCHEMA = "tmp"; private final String tempURIPrefix; diff --git a/src/java/org/apache/fop/cli/CommandLineOptions.java b/src/java/org/apache/fop/cli/CommandLineOptions.java index 780c8758b..6dda84cb4 100644 --- a/src/java/org/apache/fop/cli/CommandLineOptions.java +++ b/src/java/org/apache/fop/cli/CommandLineOptions.java @@ -52,13 +52,12 @@ import org.apache.fop.render.awt.AWTRenderer; import org.apache.fop.render.intermediate.IFContext; import org.apache.fop.render.intermediate.IFDocumentHandler; import org.apache.fop.render.intermediate.IFSerializer; +import org.apache.fop.render.pdf.PDFEncryptionOption; import org.apache.fop.render.print.PagesMode; import org.apache.fop.render.print.PrintRenderer; import org.apache.fop.render.xml.XMLRenderer; import org.apache.fop.util.CommandLineLogger; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.ENCRYPTION_PARAMS; - /** * Options parses the commandline arguments */ @@ -822,14 +821,14 @@ public class CommandLineOptions { } private PDFEncryptionParams getPDFEncryptionParams() throws FOPException { - PDFEncryptionParams params = (PDFEncryptionParams) renderingOptions.get(ENCRYPTION_PARAMS); + PDFEncryptionParams params = (PDFEncryptionParams) renderingOptions.get(PDFEncryptionOption.ENCRYPTION_PARAMS); if (params == null) { if (!PDFEncryptionManager.checkAvailableAlgorithms()) { throw new FOPException("PDF encryption requested but it is not available." + " Please make sure MD5 and RC4 algorithms are available."); } params = new PDFEncryptionParams(); - renderingOptions.put(ENCRYPTION_PARAMS, params); + renderingOptions.put(PDFEncryptionOption.ENCRYPTION_PARAMS, params); } return params; } diff --git a/src/java/org/apache/fop/fonts/CustomFont.java b/src/java/org/apache/fop/fonts/CustomFont.java index 4f35422ca..70961a55c 100644 --- a/src/java/org/apache/fop/fonts/CustomFont.java +++ b/src/java/org/apache/fop/fonts/CustomFont.java @@ -64,8 +64,6 @@ public abstract class CustomFont extends Typeface private boolean useKerning = true; private boolean useAdvanced = true; - /** the character map, mapping Unicode ranges to glyph indices. */ - protected CMapSegment[] cmap; /** * @param resourceResolver the URI resource resolver for controlling file access @@ -73,6 +71,8 @@ public abstract class CustomFont extends Typeface public CustomFont(InternalResourceResolver resourceResolver) { this.resourceResolver = resourceResolver; } + /** the character map, mapping Unicode ranges to glyph indices. */ + protected CMapSegment[] cmap; /** {@inheritDoc} */ public String getFontName() { @@ -124,6 +124,7 @@ public abstract class CustomFont extends Typeface } /** + * Returns the embedding mode for this font. * @return embedding mode */ diff --git a/src/java/org/apache/fop/fonts/DefaultFontConfig.java b/src/java/org/apache/fop/fonts/DefaultFontConfig.java index 439d28cc1..923e68fdc 100644 --- a/src/java/org/apache/fop/fonts/DefaultFontConfig.java +++ b/src/java/org/apache/fop/fonts/DefaultFontConfig.java @@ -112,7 +112,7 @@ public final class DefaultFontConfig implements FontConfig { fontCfg.getAttribute("sub-font", null), fontCfg.getAttributeAsBoolean( "kerning", true), fontCfg.getAttributeAsBoolean("advanced", true), fontCfg.getAttribute("encoding-mode", EncodingMode.AUTO.getName()), - fontCfg.getAttribute("embedding-mode", EmbeddingMode.AUTO.getName())); + fontCfg.getAttribute("embedding-mode", EncodingMode.AUTO.getName())); instance.fonts.add(font); boolean hasTriplets = false; for (Configuration tripletCfg : fontCfg.getChildren("font-triplet")) { @@ -279,6 +279,10 @@ public final class DefaultFontConfig implements FontConfig { private final String embeddingMode; + public String getEncodingMode() { + return encodingMode; + } + private final List tripletList = new ArrayList(); public List getTripletList() { @@ -332,10 +336,6 @@ public final class DefaultFontConfig implements FontConfig { return subFont; } - public String getEncodingMode() { - return encodingMode; - } - public String getEmbeddingMode() { return embeddingMode; } diff --git a/src/java/org/apache/fop/fonts/EmbedFontInfo.java b/src/java/org/apache/fop/fonts/EmbedFontInfo.java index 25d7c1c0f..5af3fc5ba 100644 --- a/src/java/org/apache/fop/fonts/EmbedFontInfo.java +++ b/src/java/org/apache/fop/fonts/EmbedFontInfo.java @@ -42,6 +42,7 @@ public class EmbedFontInfo implements Serializable { protected final boolean advanced; /** the requested encoding mode for the font */ private final EncodingMode encodingMode; + /** the requested embedding mode for this font */ private final EmbeddingMode embeddingMode; /** the PostScript name of the font */ @@ -63,7 +64,6 @@ public class EmbedFontInfo implements Serializable { * @param embedURI Path to the embeddable font file (may be null) * @param subFontName the sub-fontname used for TrueType Collections (null otherwise) * @param encodingMode the encoding mode to use for this font - * @param embeddingMode the embedding mode for this font */ public EmbedFontInfo(URI metricsURI, boolean kerning, boolean advanced, List fontTriplets, URI embedURI, String subFontName, diff --git a/src/java/org/apache/fop/fonts/FontManager.java b/src/java/org/apache/fop/fonts/FontManager.java index 35ec7355a..e9b021978 100644 --- a/src/java/org/apache/fop/fonts/FontManager.java +++ b/src/java/org/apache/fop/fonts/FontManager.java @@ -233,6 +233,16 @@ public class FontManager { } } + /** + * Detect fonts from the operating system via FOPs autodetect mechanism. + * + * @param autoDetectFonts if autodetect has been enabled + * @param fontAdder the font adding mechanism + * @param strict whether to enforce strict validation + * @param listener the listener for font related events + * @param fontInfoList a list of font info objects + * @throws FOPException if an exception was thrown auto-detecting fonts + */ public void autoDetectFonts(boolean autoDetectFonts, FontAdder fontAdder, boolean strict, FontEventListener listener, List fontInfoList) throws FOPException { if (autoDetectFonts) { diff --git a/src/java/org/apache/fop/fonts/FontReader.java b/src/java/org/apache/fop/fonts/FontReader.java index 12d9e082d..68c5c7177 100644 --- a/src/java/org/apache/fop/fonts/FontReader.java +++ b/src/java/org/apache/fop/fonts/FontReader.java @@ -153,7 +153,6 @@ public class FontReader extends DefaultHandler { /** * {@inheritDoc} */ - @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (localName.equals("font-metrics")) { diff --git a/src/java/org/apache/fop/fonts/LazyFont.java b/src/java/org/apache/fop/fonts/LazyFont.java index ab261f275..8fb50fd08 100644 --- a/src/java/org/apache/fop/fonts/LazyFont.java +++ b/src/java/org/apache/fop/fonts/LazyFont.java @@ -46,9 +46,9 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, private final boolean useKerning; private final boolean useAdvanced; private final EncodingMode encodingMode; - private final EmbeddingMode embeddingMode; - private final boolean embedded; + private EmbeddingMode embeddingMode; private final String subFontName; + private final boolean embedded; private final InternalResourceResolver resourceResolver; private boolean isMetricsLoaded; @@ -70,8 +70,10 @@ public class LazyFont extends Typeface implements FontDescriptor, Substitutable, } else { this.useAdvanced = fontInfo.getAdvanced(); } - this.encodingMode = fontInfo.getEncodingMode(); - this.embeddingMode = fontInfo.getEmbeddingMode(); + this.encodingMode = fontInfo.getEncodingMode() != null ? fontInfo.getEncodingMode() + : EncodingMode.AUTO; + this.embeddingMode = fontInfo.getEmbeddingMode() != null ? fontInfo.getEmbeddingMode() + : EmbeddingMode.AUTO; this.subFontName = fontInfo.getSubFontName(); this.embedded = fontInfo.isEmbedded(); this.resourceResolver = resourceResolver; diff --git a/src/java/org/apache/fop/fonts/MultiByteFont.java b/src/java/org/apache/fop/fonts/MultiByteFont.java index 6e4f84fd3..a460140cb 100644 --- a/src/java/org/apache/fop/fonts/MultiByteFont.java +++ b/src/java/org/apache/fop/fonts/MultiByteFont.java @@ -67,7 +67,7 @@ public class MultiByteFont extends CIDFont implements Substitutable, Positionabl private int lastUnmapped; /** - * @param resourceResolver the resource resolver for accessing the font + * Default constructor */ public MultiByteFont(InternalResourceResolver resourceResolver) { super(resourceResolver); diff --git a/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java b/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java index 7adf41c58..e115264bb 100644 --- a/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java +++ b/src/java/org/apache/fop/fonts/autodetect/FontInfoFinder.java @@ -221,7 +221,8 @@ public class FontInfoFinder { } try { TTFFontLoader ttfLoader = new TTFFontLoader(fontURI, fontName, true, - EmbeddingMode.AUTO, EncodingMode.AUTO, useKerning, useAdvanced, resourceResolver); + EmbeddingMode.AUTO, EncodingMode.AUTO, useKerning, useAdvanced, + resourceResolver); customFont = ttfLoader.getFont(); if (this.eventListener != null) { customFont.setEventListener(this.eventListener); diff --git a/src/java/org/apache/fop/fonts/truetype/FontFileReader.java b/src/java/org/apache/fop/fonts/truetype/FontFileReader.java index 29ac86b4e..790e885bc 100644 --- a/src/java/org/apache/fop/fonts/truetype/FontFileReader.java +++ b/src/java/org/apache/fop/fonts/truetype/FontFileReader.java @@ -124,9 +124,9 @@ public class FontFileReader { final byte buf = read(); if (buf < 0) { - return (int)(256 + buf); + return (256 + buf); } else { - return (int)buf; + return buf; } } @@ -150,7 +150,7 @@ public class FontFileReader { */ public final int readTTFUShort() throws IOException { final int ret = (readTTFUByte() << 8) + readTTFUByte(); - return (int)ret; + return ret; } /** diff --git a/src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java b/src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java new file mode 100644 index 000000000..897d5e2de --- /dev/null +++ b/src/java/org/apache/fop/fonts/truetype/TTFCmapEntry.java @@ -0,0 +1,118 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.fonts.truetype; + +/** + * The CMap entry contains information of a Unicode range and the + * the glyph indexes related to the range + */ +public class TTFCmapEntry { + + private int unicodeStart; + private int unicodeEnd; + private int glyphStartIndex; + + TTFCmapEntry() { + unicodeStart = 0; + unicodeEnd = 0; + glyphStartIndex = 0; + } + + TTFCmapEntry(int unicodeStart, int unicodeEnd, int glyphStartIndex) { + this.unicodeStart = unicodeStart; + this.unicodeEnd = unicodeEnd; + this.glyphStartIndex = glyphStartIndex; + } + + /** + * {@inheritDoc} + */ + public int hashCode() { + int hc = super.hashCode(); + hc ^= ( hc * 11 ) + unicodeStart; + hc ^= ( hc * 19 ) + unicodeEnd; + hc ^= ( hc * 23 ) + glyphStartIndex; + return hc; + } + + /** + * {@inheritDoc} + */ + public boolean equals(Object o) { + if (o instanceof TTFCmapEntry) { + TTFCmapEntry ce = (TTFCmapEntry)o; + if (ce.unicodeStart == this.unicodeStart + && ce.unicodeEnd == this.unicodeEnd + && ce.glyphStartIndex == this.glyphStartIndex) { + return true; + } + } + return false; + } + + /** + * Returns the glyphStartIndex. + * @return int + */ + public int getGlyphStartIndex() { + return glyphStartIndex; + } + + /** + * Returns the unicodeEnd. + * @return int + */ + public int getUnicodeEnd() { + return unicodeEnd; + } + + /** + * Returns the unicodeStart. + * @return int + */ + public int getUnicodeStart() { + return unicodeStart; + } + + /** + * Sets the glyphStartIndex. + * @param glyphStartIndex The glyphStartIndex to set + */ + public void setGlyphStartIndex(int glyphStartIndex) { + this.glyphStartIndex = glyphStartIndex; + } + + /** + * Sets the unicodeEnd. + * @param unicodeEnd The unicodeEnd to set + */ + public void setUnicodeEnd(int unicodeEnd) { + this.unicodeEnd = unicodeEnd; + } + + /** + * Sets the unicodeStart. + * @param unicodeStart The unicodeStart to set + */ + public void setUnicodeStart(int unicodeStart) { + this.unicodeStart = unicodeStart; + } + +} diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFile.java b/src/java/org/apache/fop/fonts/truetype/TTFFile.java index 9c4c3a71b..05f61750e 100644 --- a/src/java/org/apache/fop/fonts/truetype/TTFFile.java +++ b/src/java/org/apache/fop/fonts/truetype/TTFFile.java @@ -2018,9 +2018,9 @@ public class TTFFile { try { boolean useKerning = true; boolean useAdvanced = true; - stream = new FileInputStream(args[0]); TTFFile ttfFile = new TTFFile(useKerning, useAdvanced); + stream = new FileInputStream(args[0]); FontFileReader reader = new FontFileReader(stream); String name = null; @@ -2037,6 +2037,5 @@ public class TTFFile { } finally { IOUtils.closeQuietly(stream); } - } } diff --git a/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java b/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java index f0443118d..c97b17211 100644 --- a/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java +++ b/src/java/org/apache/fop/fonts/truetype/TTFFontLoader.java @@ -72,10 +72,10 @@ public class TTFFontLoader extends FontLoader { * @param useAdvanced true to enable loading advanced info if available, false to disable * @param resolver the FontResolver for font URI resolution */ - public TTFFontLoader(URI fontFileURI, String subFontName, - boolean embedded, EmbeddingMode embeddingMode, EncodingMode encodingMode, - boolean useKerning, boolean useAdvanced, InternalResourceResolver resourceResolver) { - super(fontFileURI, embedded, useKerning, useAdvanced, resourceResolver); + public TTFFontLoader(URI fontFileURI, String subFontName, boolean embedded, + EmbeddingMode embeddingMode, EncodingMode encodingMode, boolean useKerning, + boolean useAdvanced, InternalResourceResolver resolver) { + super(fontFileURI, embedded, useKerning, useAdvanced, resolver); this.subFontName = subFontName; this.encodingMode = encodingMode; this.embeddingMode = embeddingMode; diff --git a/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java b/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java index 5c6c32e7e..853e23eb5 100644 --- a/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java +++ b/src/java/org/apache/fop/fonts/type1/Type1FontLoader.java @@ -29,6 +29,8 @@ import java.util.List; import java.util.Set; import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.io.InternalResourceResolver; import org.apache.fop.fonts.CodePointMapping; @@ -42,6 +44,8 @@ import org.apache.fop.fonts.SingleByteFont; */ public class Type1FontLoader extends FontLoader { + private static final Log log = LogFactory.getLog(Type1FontLoader.class); + private SingleByteFont singleFont; /** diff --git a/src/java/org/apache/fop/pdf/PDFFactory.java b/src/java/org/apache/fop/pdf/PDFFactory.java index f6e9e255d..633ce9dd1 100644 --- a/src/java/org/apache/fop/pdf/PDFFactory.java +++ b/src/java/org/apache/fop/pdf/PDFFactory.java @@ -40,6 +40,7 @@ import org.apache.commons.logging.LogFactory; import org.apache.xmlgraphics.java2d.color.ColorUtil; import org.apache.xmlgraphics.java2d.color.NamedColorSpace; + import org.apache.xmlgraphics.xmp.Metadata; import org.apache.fop.fonts.CIDFont; diff --git a/src/java/org/apache/fop/render/PrintRendererConfigurator.java b/src/java/org/apache/fop/render/PrintRendererConfigurator.java index 24cdd702e..f36bd4c7f 100644 --- a/src/java/org/apache/fop/render/PrintRendererConfigurator.java +++ b/src/java/org/apache/fop/render/PrintRendererConfigurator.java @@ -74,14 +74,35 @@ public abstract class PrintRendererConfigurator extends AbstractRendererConfigur this.fontInfoConfigurator = fontInfoConfigurator; } + /** + * Returns the renderer configuration data for a specific renderer. + * + * @param documentHandler the document handler + * @return the renderer configuration data + * @throws FOPException if an error occurs + */ protected RendererConfig getRendererConfig(IFDocumentHandler documentHandler) throws FOPException { - return getRendererConfig(documentHandler.getMimeType()); + return getRendererConfig(documentHandler.getMimeType()); } + /** + * gets the renderer configuration data for a specific renderer. + * + * @param mimeType the MIME type + * @return the renderer configuration data + * @throws FOPException if an error occurs + */ protected RendererConfig getRendererConfig(String mimeType) throws FOPException { return userAgent.getRendererConfig(mimeType, rendererConfigParser); } + /** + * gets the renderer configuration data for a specific renderer. + * + * @param renderer the renderer + * @return the renderer configuration data + * @throws FOPException if an error occurs + */ protected RendererConfig getRendererConfig(Renderer renderer) throws FOPException { return getRendererConfig(renderer.getMimeType()); } @@ -114,6 +135,14 @@ public abstract class PrintRendererConfigurator extends AbstractRendererConfigur protected abstract List getDefaultFontCollection(); + /** + * Returns the font collection for custom configured fonts. + * + * @param resolver the resource resolver + * @param mimeType the renderer MIME type + * @return the font collection + * @throws FOPException if an error occurs + */ protected FontCollection getCustomFontCollection(InternalResourceResolver resolver, String mimeType) throws FOPException { List fontList; @@ -125,6 +154,13 @@ public abstract class PrintRendererConfigurator extends AbstractRendererConfigur return createCollectionFromFontList(resolver, fontList); } + /*** + * Creates the font collection given a list of embedded font infomation. + * + * @param resolver the resource resolver + * @param fontList the embedded font infomation + * @return the font collection + */ protected FontCollection createCollectionFromFontList(InternalResourceResolver resolver, List fontList) { return new CustomFontCollection(resolver, fontList, diff --git a/src/java/org/apache/fop/render/afp/AFPRendererConfig.java b/src/java/org/apache/fop/render/afp/AFPRendererConfig.java index 6b031c9eb..6d210c0d0 100644 --- a/src/java/org/apache/fop/render/afp/AFPRendererConfig.java +++ b/src/java/org/apache/fop/render/afp/AFPRendererConfig.java @@ -45,23 +45,23 @@ import org.apache.fop.util.LogUtil; import static org.apache.fop.render.afp.AFPRendererConfig.ImagesModeOptions.MODE_COLOR; import static org.apache.fop.render.afp.AFPRendererConfig.ImagesModeOptions.MODE_GRAYSCALE; -import static org.apache.fop.render.afp.AFPRendererConfigOption.DEFAULT_RESOURCE_LEVELS; -import static org.apache.fop.render.afp.AFPRendererConfigOption.GOCA; -import static org.apache.fop.render.afp.AFPRendererConfigOption.GOCA_TEXT; -import static org.apache.fop.render.afp.AFPRendererConfigOption.IMAGES; -import static org.apache.fop.render.afp.AFPRendererConfigOption.IMAGES_DITHERING_QUALITY; -import static org.apache.fop.render.afp.AFPRendererConfigOption.IMAGES_FS45; -import static org.apache.fop.render.afp.AFPRendererConfigOption.IMAGES_JPEG; -import static org.apache.fop.render.afp.AFPRendererConfigOption.IMAGES_MAPPING_OPTION; -import static org.apache.fop.render.afp.AFPRendererConfigOption.IMAGES_MODE; -import static org.apache.fop.render.afp.AFPRendererConfigOption.IMAGES_NATIVE; -import static org.apache.fop.render.afp.AFPRendererConfigOption.IMAGES_WRAP_PSEG; -import static org.apache.fop.render.afp.AFPRendererConfigOption.JPEG_ALLOW_JPEG_EMBEDDING; -import static org.apache.fop.render.afp.AFPRendererConfigOption.JPEG_BITMAP_ENCODING_QUALITY; -import static org.apache.fop.render.afp.AFPRendererConfigOption.LINE_WIDTH_CORRECTION; -import static org.apache.fop.render.afp.AFPRendererConfigOption.RENDERER_RESOLUTION; -import static org.apache.fop.render.afp.AFPRendererConfigOption.RESOURCE_GROUP_URI; -import static org.apache.fop.render.afp.AFPRendererConfigOption.SHADING; +import static org.apache.fop.render.afp.AFPRendererOption.DEFAULT_RESOURCE_LEVELS; +import static org.apache.fop.render.afp.AFPRendererOption.GOCA; +import static org.apache.fop.render.afp.AFPRendererOption.GOCA_TEXT; +import static org.apache.fop.render.afp.AFPRendererOption.IMAGES; +import static org.apache.fop.render.afp.AFPRendererOption.IMAGES_DITHERING_QUALITY; +import static org.apache.fop.render.afp.AFPRendererOption.IMAGES_FS45; +import static org.apache.fop.render.afp.AFPRendererOption.IMAGES_JPEG; +import static org.apache.fop.render.afp.AFPRendererOption.IMAGES_MAPPING_OPTION; +import static org.apache.fop.render.afp.AFPRendererOption.IMAGES_MODE; +import static org.apache.fop.render.afp.AFPRendererOption.IMAGES_NATIVE; +import static org.apache.fop.render.afp.AFPRendererOption.IMAGES_WRAP_PSEG; +import static org.apache.fop.render.afp.AFPRendererOption.JPEG_ALLOW_JPEG_EMBEDDING; +import static org.apache.fop.render.afp.AFPRendererOption.JPEG_BITMAP_ENCODING_QUALITY; +import static org.apache.fop.render.afp.AFPRendererOption.LINE_WIDTH_CORRECTION; +import static org.apache.fop.render.afp.AFPRendererOption.RENDERER_RESOLUTION; +import static org.apache.fop.render.afp.AFPRendererOption.RESOURCE_GROUP_URI; +import static org.apache.fop.render.afp.AFPRendererOption.SHADING; /** * The AFP renderer config object. @@ -103,7 +103,7 @@ public final class AFPRendererConfig implements RendererConfig { } } - private final EnumMap params = new EnumMap(AFPRendererConfigOption.class); + private final EnumMap params = new EnumMap(AFPRendererOption.class); private final EnumMap imageModeParams = new EnumMap(ImagesModeOptions.class); @@ -189,12 +189,12 @@ public final class AFPRendererConfig implements RendererConfig { return getParam(GOCA_TEXT, Boolean.class); } - private T getParam(AFPRendererConfigOption options, Class type) { + private T getParam(AFPRendererOption options, Class type) { assert options.getType().equals(type); return type.cast(params.get(options)); } - private void setParam(AFPRendererConfigOption option, T value) { + private void setParam(AFPRendererOption option, T value) { assert option.getType().isInstance(value); params.put(option, value); } @@ -272,7 +272,7 @@ public final class AFPRendererConfig implements RendererConfig { createResourceLevel(); } - private void setParam(AFPRendererConfigOption option, Object value) { + private void setParam(AFPRendererOption option, Object value) { config.setParam(option, value); } @@ -289,7 +289,7 @@ public final class AFPRendererConfig implements RendererConfig { config.imageModeParams.put(MODE_GRAYSCALE, imagesCfg.getAttributeAsInteger(imagesMode.getModeAttribute(), 8)); } - String dithering = imagesCfg.getAttribute(AFPRendererConfigOption.IMAGES_DITHERING_QUALITY.getName(), "medium"); + String dithering = imagesCfg.getAttribute(AFPRendererOption.IMAGES_DITHERING_QUALITY.getName(), "medium"); float dq; if (dithering.startsWith("min")) { dq = 0.0f; diff --git a/src/java/org/apache/fop/render/afp/AFPRendererConfigOption.java b/src/java/org/apache/fop/render/afp/AFPRendererConfigOption.java deleted file mode 100644 index 5a99ae360..000000000 --- a/src/java/org/apache/fop/render/afp/AFPRendererConfigOption.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.fop.render.afp; - -import java.net.URI; - -import org.apache.fop.afp.AFPResourceLevelDefaults; -import org.apache.fop.render.RendererConfigOption; - -/** - * An enumeration of the configuration options available for the AFP renderer. - */ -public enum AFPRendererConfigOption implements RendererConfigOption { - DEFAULT_RESOURCE_LEVELS("default-resource-levels", AFPResourceLevelDefaults.class), - IMAGES("images", null), - IMAGES_JPEG("jpeg", null), - IMAGES_DITHERING_QUALITY("dithering-quality", Float.class), - IMAGES_FS45("fs45", Boolean.class), - IMAGES_MAPPING_OPTION("mapping_option", Byte.class), - IMAGES_MODE("mode", Boolean.class), - IMAGES_NATIVE("native", Boolean.class), - IMAGES_WRAP_PSEG("pseg", Boolean.class), - JPEG_ALLOW_JPEG_EMBEDDING("allow-embedding", Boolean.class), - JPEG_BITMAP_ENCODING_QUALITY("bitmap-encoding-quality", Float.class), - RENDERER_RESOLUTION("renderer-resolution", Integer.class), - RESOURCE_GROUP_URI("resource-group-file", URI.class), - SHADING("shading", AFPShadingMode.class), - LINE_WIDTH_CORRECTION("line-width-correction", Float.class), - GOCA("goca", Boolean.class), - GOCA_TEXT("text", Boolean.class); - - private final String name; - - private final Class type; - - private AFPRendererConfigOption(String name, Class type) { - this.name = name; - this.type = type; - } - - /** {@inheritDoc}}*/ - public String getName() { - return name; - } - - public Class getType() { - return type; - } -} diff --git a/src/java/org/apache/fop/render/afp/AFPRendererOption.java b/src/java/org/apache/fop/render/afp/AFPRendererOption.java new file mode 100644 index 000000000..d573570d0 --- /dev/null +++ b/src/java/org/apache/fop/render/afp/AFPRendererOption.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.fop.render.afp; + +import java.net.URI; + +import org.apache.fop.afp.AFPResourceLevelDefaults; +import org.apache.fop.render.RendererConfigOption; + +/** + * An enumeration of the configuration options available for the AFP renderer. + */ +public enum AFPRendererOption implements RendererConfigOption { + DEFAULT_RESOURCE_LEVELS("default-resource-levels", AFPResourceLevelDefaults.class), + IMAGES("images", null), + IMAGES_JPEG("jpeg", null), + IMAGES_DITHERING_QUALITY("dithering-quality", Float.class), + IMAGES_FS45("fs45", Boolean.class), + IMAGES_MAPPING_OPTION("mapping_option", Byte.class), + IMAGES_MODE("mode", Boolean.class), + IMAGES_NATIVE("native", Boolean.class), + IMAGES_WRAP_PSEG("pseg", Boolean.class), + JPEG_ALLOW_JPEG_EMBEDDING("allow-embedding", Boolean.class), + JPEG_BITMAP_ENCODING_QUALITY("bitmap-encoding-quality", Float.class), + RENDERER_RESOLUTION("renderer-resolution", Integer.class), + RESOURCE_GROUP_URI("resource-group-file", URI.class), + SHADING("shading", AFPShadingMode.class), + LINE_WIDTH_CORRECTION("line-width-correction", Float.class), + GOCA("goca", Boolean.class), + GOCA_TEXT("text", Boolean.class); + + private final String name; + + private final Class type; + + private AFPRendererOption(String name, Class type) { + this.name = name; + this.type = type; + } + + /** {@inheritDoc}}*/ + public String getName() { + return name; + } + + public Class getType() { + return type; + } +} diff --git a/src/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java b/src/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java index e76f941d8..828f41d34 100644 --- a/src/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java +++ b/src/java/org/apache/fop/render/bitmap/BitmapRendererConfig.java @@ -34,21 +34,21 @@ import org.apache.fop.render.java2d.Java2DRendererConfig; import org.apache.fop.render.java2d.Java2DRendererConfig.Java2DRendererConfigParser; import org.apache.fop.util.ColorUtil; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.ANTI_ALIASING; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.BACKGROUND_COLOR; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.COLOR_MODE; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.JAVA2D_TRANSPARENT_PAGE_BACKGROUND; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.RENDERING_QUALITY; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.RENDERING_QUALITY_ELEMENT; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.RENDERING_SPEED; +import static org.apache.fop.render.bitmap.BitmapRendererOption.ANTI_ALIASING; +import static org.apache.fop.render.bitmap.BitmapRendererOption.BACKGROUND_COLOR; +import static org.apache.fop.render.bitmap.BitmapRendererOption.COLOR_MODE; +import static org.apache.fop.render.bitmap.BitmapRendererOption.JAVA2D_TRANSPARENT_PAGE_BACKGROUND; +import static org.apache.fop.render.bitmap.BitmapRendererOption.RENDERING_QUALITY; +import static org.apache.fop.render.bitmap.BitmapRendererOption.RENDERING_QUALITY_ELEMENT; +import static org.apache.fop.render.bitmap.BitmapRendererOption.RENDERING_SPEED; /** * The Bitmap renderer config data object. */ public class BitmapRendererConfig implements RendererConfig { - private final EnumMap params - = new EnumMap(BitmapRendererConfigOption.class); + private final EnumMap params + = new EnumMap(BitmapRendererOption.class); private final DefaultFontConfig fontConfig; @@ -82,7 +82,7 @@ public class BitmapRendererConfig implements RendererConfig { : JAVA2D_TRANSPARENT_PAGE_BACKGROUND.getDefaultValue()); } - private Object get(BitmapRendererConfigOption option) { + private Object get(BitmapRendererOption option) { return params.get(option); } @@ -97,7 +97,7 @@ public class BitmapRendererConfig implements RendererConfig { this.mimeType = mimeType; } - private void setParam(BitmapRendererConfig config, BitmapRendererConfigOption option, + private void setParam(BitmapRendererConfig config, BitmapRendererOption option, Object value) { config.params.put(option, value != null ? value : option.getDefaultValue()); } @@ -122,17 +122,17 @@ public class BitmapRendererConfig implements RendererConfig { ColorUtil.parseColorString(userAgent, background)); } - setParam(config, BitmapRendererConfigOption.ANTI_ALIASING, + setParam(config, BitmapRendererOption.ANTI_ALIASING, getChild(cfg, ANTI_ALIASING).getValueAsBoolean( (Boolean) ANTI_ALIASING.getDefaultValue())); String optimization = getValue(cfg, RENDERING_QUALITY_ELEMENT); setParam(config, RENDERING_QUALITY, - !(BitmapRendererConfigOption.getValue(optimization) == RENDERING_SPEED)); + !(BitmapRendererOption.getValue(optimization) == RENDERING_SPEED)); String color = getValue(cfg, COLOR_MODE); setParam(config, COLOR_MODE, - getBufferedImageIntegerFromColor(BitmapRendererConfigOption.getValue(color))); + getBufferedImageIntegerFromColor(BitmapRendererOption.getValue(color))); } } @@ -144,7 +144,7 @@ public class BitmapRendererConfig implements RendererConfig { return config; } - private Integer getBufferedImageIntegerFromColor(BitmapRendererConfigOption option) { + private Integer getBufferedImageIntegerFromColor(BitmapRendererOption option) { if (option == null) { return null; } @@ -163,11 +163,11 @@ public class BitmapRendererConfig implements RendererConfig { } } - private Configuration getChild(Configuration cfg, BitmapRendererConfigOption option) { + private Configuration getChild(Configuration cfg, BitmapRendererOption option) { return cfg.getChild(option.getName()); } - private String getValue(Configuration cfg, BitmapRendererConfigOption option) { + private String getValue(Configuration cfg, BitmapRendererOption option) { return cfg.getChild(option.getName()).getValue(null); } diff --git a/src/java/org/apache/fop/render/bitmap/BitmapRendererConfigOption.java b/src/java/org/apache/fop/render/bitmap/BitmapRendererConfigOption.java deleted file mode 100644 index 00b043a4e..000000000 --- a/src/java/org/apache/fop/render/bitmap/BitmapRendererConfigOption.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* $Id$ */ - -package org.apache.fop.render.bitmap; - -import java.awt.Color; -import java.awt.image.BufferedImage; - -import org.apache.fop.render.RendererConfigOption; - -/** - * An enumeration of the Bitmap renderer configuration opetions available to the user via the FOP - * conf. - */ -public enum BitmapRendererConfigOption implements RendererConfigOption { - JAVA2D_TRANSPARENT_PAGE_BACKGROUND("transparent-page-background", false), - BACKGROUND_COLOR("background-color", Color.WHITE), - ANTI_ALIASING("anti-aliasing", true), - RENDERING_QUALITY_ELEMENT("rendering"), - RENDERING_QUALITY("quality", true), - RENDERING_SPEED("speed"), - COLOR_MODE("color-mode", BufferedImage.TYPE_INT_ARGB), - COLOR_MODE_RGBA("rgba"), - COLOR_MODE_RGB("rgb"), - COLOR_MODE_GRAY("gray"), - COLOR_MODE_BINARY("binary"), - COLOR_MODE_BILEVEL("bi-level"); - - private final String name; - private final Object defaultValue; - - private BitmapRendererConfigOption(String name, Object defaultValue) { - this.name = name; - this.defaultValue = defaultValue; - } - - private BitmapRendererConfigOption(String name) { - this(name, null); - } - - /** {@inheritDoc} */ - public String getName() { - return name; - } - - public Object getDefaultValue() { - return defaultValue; - } - - public static BitmapRendererConfigOption getValue(String str) { - for (BitmapRendererConfigOption opt : BitmapRendererConfigOption.values()) { - if (opt.getName().equalsIgnoreCase(str)) { - return opt; - } - } - return null; - } -} diff --git a/src/java/org/apache/fop/render/bitmap/BitmapRendererOption.java b/src/java/org/apache/fop/render/bitmap/BitmapRendererOption.java new file mode 100644 index 000000000..d6030b5ac --- /dev/null +++ b/src/java/org/apache/fop/render/bitmap/BitmapRendererOption.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.bitmap; + +import java.awt.Color; +import java.awt.image.BufferedImage; + +import org.apache.fop.render.RendererConfigOption; + +/** + * An enumeration of the Bitmap renderer configuration opetions available to the user via the FOP + * conf. + */ +public enum BitmapRendererOption implements RendererConfigOption { + JAVA2D_TRANSPARENT_PAGE_BACKGROUND("transparent-page-background", false), + BACKGROUND_COLOR("background-color", Color.WHITE), + ANTI_ALIASING("anti-aliasing", true), + RENDERING_QUALITY_ELEMENT("rendering"), + RENDERING_QUALITY("quality", true), + RENDERING_SPEED("speed"), + COLOR_MODE("color-mode", BufferedImage.TYPE_INT_ARGB), + COLOR_MODE_RGBA("rgba"), + COLOR_MODE_RGB("rgb"), + COLOR_MODE_GRAY("gray"), + COLOR_MODE_BINARY("binary"), + COLOR_MODE_BILEVEL("bi-level"); + + private final String name; + private final Object defaultValue; + + private BitmapRendererOption(String name, Object defaultValue) { + this.name = name; + this.defaultValue = defaultValue; + } + + private BitmapRendererOption(String name) { + this(name, null); + } + + /** {@inheritDoc} */ + public String getName() { + return name; + } + + public Object getDefaultValue() { + return defaultValue; + } + + public static BitmapRendererOption getValue(String str) { + for (BitmapRendererOption opt : BitmapRendererOption.values()) { + if (opt.getName().equalsIgnoreCase(str)) { + return opt; + } + } + return null; + } +} diff --git a/src/java/org/apache/fop/render/bitmap/BitmapRenderingSettings.java b/src/java/org/apache/fop/render/bitmap/BitmapRenderingSettings.java index 0648b4af0..d239fe0fd 100644 --- a/src/java/org/apache/fop/render/bitmap/BitmapRenderingSettings.java +++ b/src/java/org/apache/fop/render/bitmap/BitmapRenderingSettings.java @@ -23,9 +23,9 @@ import org.apache.xmlgraphics.image.writer.ImageWriterParams; import org.apache.fop.render.java2d.Java2DRenderingSettings; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.ANTI_ALIASING; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.COLOR_MODE; -import static org.apache.fop.render.bitmap.BitmapRendererConfigOption.RENDERING_QUALITY; +import static org.apache.fop.render.bitmap.BitmapRendererOption.ANTI_ALIASING; +import static org.apache.fop.render.bitmap.BitmapRendererOption.COLOR_MODE; +import static org.apache.fop.render.bitmap.BitmapRendererOption.RENDERING_QUALITY; /** * This class holds settings used when rendering to bitmaps. diff --git a/src/java/org/apache/fop/render/bitmap/TIFFDocumentHandler.java b/src/java/org/apache/fop/render/bitmap/TIFFDocumentHandler.java index 848ed6f00..b147f497b 100644 --- a/src/java/org/apache/fop/render/bitmap/TIFFDocumentHandler.java +++ b/src/java/org/apache/fop/render/bitmap/TIFFDocumentHandler.java @@ -31,7 +31,6 @@ import org.apache.fop.render.intermediate.IFDocumentHandlerConfigurator; */ public class TIFFDocumentHandler extends AbstractBitmapDocumentHandler { - TIFFDocumentHandler(IFContext context) { super(context); } @@ -51,5 +50,4 @@ public class TIFFDocumentHandler extends AbstractBitmapDocumentHandler { public IFDocumentHandlerConfigurator getConfigurator() { return new TIFFRendererConfigurator(getUserAgent(), new TIFFRendererConfigParser()); } - } diff --git a/src/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java b/src/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java index 152b669b6..5417ecc1e 100644 --- a/src/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java +++ b/src/java/org/apache/fop/render/bitmap/TIFFRendererConfig.java @@ -36,13 +36,13 @@ import org.apache.fop.render.RendererConfigOption; */ public final class TIFFRendererConfig extends BitmapRendererConfig { - public enum TIFFRendererConfigOption implements RendererConfigOption { + public enum TIFFRendererOption implements RendererConfigOption { COMPRESSION("compression", TIFFCompressionValues.PACKBITS); private final String name; private final Object defaultValue; - private TIFFRendererConfigOption(String name, Object defaultValue) { + private TIFFRendererOption(String name, Object defaultValue) { this.name = name; this.defaultValue = defaultValue; } @@ -56,15 +56,15 @@ public final class TIFFRendererConfig extends BitmapRendererConfig { } } - private final EnumMap params - = new EnumMap(TIFFRendererConfigOption.class); + private final EnumMap params + = new EnumMap(TIFFRendererOption.class); private TIFFRendererConfig(DefaultFontConfig fontConfig) { super(fontConfig); } public TIFFCompressionValues getCompressionType() { - return (TIFFCompressionValues) params.get(TIFFRendererConfigOption.COMPRESSION); + return (TIFFCompressionValues) params.get(TIFFRendererOption.COMPRESSION); } /** @@ -78,11 +78,11 @@ public final class TIFFRendererConfig extends BitmapRendererConfig { private TIFFRendererConfig config; - private void setParam(TIFFRendererConfigOption option, Object value) { + private void setParam(TIFFRendererOption option, Object value) { config.params.put(option, value != null ? value : option.getDefaultValue()); } - private String getValue(Configuration cfg, TIFFRendererConfigOption option) { + private String getValue(Configuration cfg, TIFFRendererOption option) { return cfg.getChild(option.getName()).getValue(null); } @@ -92,9 +92,9 @@ public final class TIFFRendererConfig extends BitmapRendererConfig { .parse(cfg, userAgent.validateStrictly())); super.build(config, userAgent, cfg); if (cfg != null) { - setParam(TIFFRendererConfigOption.COMPRESSION, + setParam(TIFFRendererOption.COMPRESSION, TIFFCompressionValues.getValue(getValue(cfg, - TIFFRendererConfigOption.COMPRESSION))); + TIFFRendererOption.COMPRESSION))); } return config; } diff --git a/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java b/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java index 143c15031..0b410873b 100644 --- a/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java +++ b/src/java/org/apache/fop/render/java2d/ConfiguredFontCollection.java @@ -29,7 +29,6 @@ import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.io.InternalResourceResolver; import org.apache.fop.fonts.CustomFont; import org.apache.fop.fonts.EmbedFontInfo; -import org.apache.fop.fonts.EncodingMode; import org.apache.fop.fonts.FontCollection; import org.apache.fop.fonts.FontInfo; import org.apache.fop.fonts.FontLoader; @@ -82,10 +81,10 @@ public class ConfiguredFontCollection implements FontCollection { InputStream fontSource = resourceResolver.getResource(fontURI); font = new CustomFontMetricsMapper(fontMetrics, fontSource); } else { - CustomFont fontMetrics = FontLoader.loadFont( - fontURI, null, true, configFontInfo.getEmbeddingMode(), - EncodingMode.AUTO, configFontInfo.getKerning(), - configFontInfo.getAdvanced(), resourceResolver); + CustomFont fontMetrics = FontLoader.loadFont(fontURI, null, true, + configFontInfo.getEmbeddingMode(), configFontInfo.getEncodingMode(), + configFontInfo.getKerning(), configFontInfo.getAdvanced(), + resourceResolver); font = new CustomFontMetricsMapper(fontMetrics); } diff --git a/src/java/org/apache/fop/render/pcl/Java2DRendererConfigOption.java b/src/java/org/apache/fop/render/pcl/Java2DRendererConfigOption.java deleted file mode 100644 index a3ce884ab..000000000 --- a/src/java/org/apache/fop/render/pcl/Java2DRendererConfigOption.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.apache.fop.render.pcl; - -import org.apache.fop.render.RendererConfigOption; - -/** - * An enumeration of the renderer configuration options available to the Java2D renderer via the - * FOP conf. - */ -public enum Java2DRendererConfigOption implements RendererConfigOption { - - RENDERING_MODE("rendering", PCLRenderingMode.class), - TEXT_RENDERING("text-rendering", Boolean.class), - DISABLE_PJL("disable-pjl", Boolean.class); - - private final String name; - - private final Class type; - - private Java2DRendererConfigOption(String name, Class type) { - this.name = name; - this.type = type; - } - - /** {@inheritDoc} */ - public String getName() { - return name; - } - - Class getType() { - return type; - } -} diff --git a/src/java/org/apache/fop/render/pcl/Java2DRendererOption.java b/src/java/org/apache/fop/render/pcl/Java2DRendererOption.java new file mode 100644 index 000000000..cb23f7191 --- /dev/null +++ b/src/java/org/apache/fop/render/pcl/Java2DRendererOption.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.fop.render.pcl; + +import org.apache.fop.render.RendererConfigOption; + +/** + * An enumeration of the renderer configuration options available to the Java2D renderer via the + * FOP conf. + */ +public enum Java2DRendererOption implements RendererConfigOption { + + RENDERING_MODE("rendering", PCLRenderingMode.class), + TEXT_RENDERING("text-rendering", Boolean.class), + DISABLE_PJL("disable-pjl", Boolean.class); + + private final String name; + + private final Class type; + + private Java2DRendererOption(String name, Class type) { + this.name = name; + this.type = type; + } + + /** {@inheritDoc} */ + public String getName() { + return name; + } + + Class getType() { + return type; + } +} diff --git a/src/java/org/apache/fop/render/pcl/PCLRendererConfig.java b/src/java/org/apache/fop/render/pcl/PCLRendererConfig.java index d48c00cd3..29fccc2c8 100644 --- a/src/java/org/apache/fop/render/pcl/PCLRendererConfig.java +++ b/src/java/org/apache/fop/render/pcl/PCLRendererConfig.java @@ -31,17 +31,17 @@ import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.render.RendererConfig; -import static org.apache.fop.render.pcl.Java2DRendererConfigOption.DISABLE_PJL; -import static org.apache.fop.render.pcl.Java2DRendererConfigOption.RENDERING_MODE; -import static org.apache.fop.render.pcl.Java2DRendererConfigOption.TEXT_RENDERING; +import static org.apache.fop.render.pcl.Java2DRendererOption.DISABLE_PJL; +import static org.apache.fop.render.pcl.Java2DRendererOption.RENDERING_MODE; +import static org.apache.fop.render.pcl.Java2DRendererOption.TEXT_RENDERING; /** * The PCL renderer configuration data object. */ public final class PCLRendererConfig implements RendererConfig { - private final Map params - = new EnumMap(Java2DRendererConfigOption.class); + private final Map params + = new EnumMap(Java2DRendererOption.class); private final DefaultFontConfig fontConfig; @@ -65,12 +65,12 @@ public final class PCLRendererConfig implements RendererConfig { return getParam(DISABLE_PJL, Boolean.class); } - private T getParam(Java2DRendererConfigOption option, Class type) { + private T getParam(Java2DRendererOption option, Class type) { assert option.getType().equals(type); return type.cast(params.get(option)); } - private void setParam(Java2DRendererConfigOption option, T value) { + private void setParam(Java2DRendererOption option, T value) { assert option.getType().isInstance(value); params.put(option, value); } diff --git a/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java b/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java index a8f7df66b..1ad8034e0 100644 --- a/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java +++ b/src/java/org/apache/fop/render/pdf/PDFDocumentHandler.java @@ -125,8 +125,8 @@ public class PDFDocumentHandler extends AbstractBinaryWritingIFDocumentHandler { return this.documentNavigationHandler; } - PDFRenderingUtil getPDFUtil() { - return this.pdfUtil; + void mergeRendererOptionsConfig(PDFRendererOptionsConfig config) { + pdfUtil.mergeRendererOptionsConfig(config); } PDFLogicalStructureHandler getLogicalStructureHandler() { diff --git a/src/java/org/apache/fop/render/pdf/PDFEncryptionOption.java b/src/java/org/apache/fop/render/pdf/PDFEncryptionOption.java new file mode 100644 index 000000000..3d94e236b --- /dev/null +++ b/src/java/org/apache/fop/render/pdf/PDFEncryptionOption.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.pdf; + +import org.apache.fop.pdf.PDFAMode; +import org.apache.fop.pdf.PDFXMode; +import org.apache.fop.render.RendererConfigOption; + +public enum PDFEncryptionOption implements RendererConfigOption { + + /** + * PDF encryption length parameter: must be a multiple of 8 between 40 and 128, + * default value 40, datatype: int, default: 40 + */ + ENCRYPTION_LENGTH("encryption-length", 40), + /** + * PDF encryption parameter: Forbids printing to high quality, datatype: Boolean or + * "true"/"false", default: false + */ + NO_PRINTHQ("noprinthq", 40), + /** + * PDF encryption parameter: Forbids assembling document, datatype: Boolean or + * "true"/"false", default: false + */ + NO_ASSEMBLEDOC("noassembledoc", false), + /** + * PDF encryption parameter: Forbids extracting text and graphics, datatype: Boolean + * or "true"/"false", default: false + */ + NO_ACCESSCONTENT("noaccesscontent", false), + /** + * PDF encryption parameter: Forbids filling in existing interactive forms, datatype: + * Boolean or "true"/"false", default: false + */ + NO_FILLINFORMS("nofillinforms", false), + /** + * PDF encryption parameter: Forbids annotations, datatype: Boolean or "true"/"false", + * default: false + */ + NO_ANNOTATIONS("noannotations", false), + /** + * PDF encryption parameter: Forbids printing, datatype: Boolean or "true"/"false", + * default: false + */ + NO_PRINT("noprint", false), + /** + * PDF encryption parameter: Forbids copying content, datatype: Boolean or "true"/"false", + * default: false + */ + NO_COPY_CONTENT("nocopy", false), + /** + * PDF encryption parameter: Forbids editing content, datatype: Boolean or "true"/"false", + * default: false + */ + NO_EDIT_CONTENT("noedit", false), + /** PDF encryption parameter: user password, datatype: String, default: "" */ + USER_PASSWORD("user-password", ""), + /** PDF encryption parameter: owner password, datatype: String, default: "" */ + OWNER_PASSWORD("owner-password", ""); + + public static final String ENCRYPTION_PARAMS = "encryption-params"; + + private final String name; + + private final Object defaultValue; + + private PDFEncryptionOption(String name, Object defaultValue) { + this.name = name; + this.defaultValue = defaultValue; + } + + private PDFEncryptionOption(String name) { + this(name, null); + } + + public String getName() { + return name; + } + + public Object getDefaultValue() { + return defaultValue; + } +} diff --git a/src/java/org/apache/fop/render/pdf/PDFPainter.java b/src/java/org/apache/fop/render/pdf/PDFPainter.java index 4928e7251..f51088fab 100644 --- a/src/java/org/apache/fop/render/pdf/PDFPainter.java +++ b/src/java/org/apache/fop/render/pdf/PDFPainter.java @@ -92,10 +92,6 @@ public class PDFPainter extends AbstractIFPainter { return this.documentHandler.getContext(); } - PDFRenderingUtil getPDFUtil() { - return this.documentHandler.pdfUtil; - } - PDFDocument getPDFDoc() { return this.documentHandler.pdfDoc; } diff --git a/src/java/org/apache/fop/render/pdf/PDFRendererConfig.java b/src/java/org/apache/fop/render/pdf/PDFRendererConfig.java index ffb092b33..049345609 100644 --- a/src/java/org/apache/fop/render/pdf/PDFRendererConfig.java +++ b/src/java/org/apache/fop/render/pdf/PDFRendererConfig.java @@ -19,8 +19,6 @@ package org.apache.fop.render.pdf; -import java.net.URI; -import java.net.URISyntaxException; import java.util.ArrayList; import java.util.EnumMap; import java.util.HashMap; @@ -35,35 +33,32 @@ import org.apache.commons.logging.LogFactory; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.MimeConstants; -import org.apache.fop.apps.io.InternalResourceResolver; import org.apache.fop.fonts.DefaultFontConfig; import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; -import org.apache.fop.pdf.PDFAMode; import org.apache.fop.pdf.PDFEncryptionParams; import org.apache.fop.pdf.PDFFilterList; -import org.apache.fop.pdf.PDFXMode; -import org.apache.fop.pdf.Version; import org.apache.fop.render.RendererConfig; +import org.apache.fop.render.RendererConfigOption; import org.apache.fop.util.LogUtil; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.DISABLE_SRGB_COLORSPACE; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.ENCRYPTION_LENGTH; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.ENCRYPTION_PARAMS; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.FILTER_LIST; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_ACCESSCONTENT; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_ANNOTATIONS; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_ASSEMBLEDOC; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_COPY_CONTENT; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_EDIT_CONTENT; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_FILLINFORMS; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_PRINT; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_PRINTHQ; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.OUTPUT_PROFILE; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.OWNER_PASSWORD; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.PDF_A_MODE; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.PDF_X_MODE; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.USER_PASSWORD; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.VERSION; +import static org.apache.fop.render.pdf.PDFEncryptionOption.ENCRYPTION_LENGTH; +import static org.apache.fop.render.pdf.PDFEncryptionOption.ENCRYPTION_PARAMS; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_ACCESSCONTENT; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_ANNOTATIONS; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_ASSEMBLEDOC; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_COPY_CONTENT; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_EDIT_CONTENT; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_FILLINFORMS; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_PRINT; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_PRINTHQ; +import static org.apache.fop.render.pdf.PDFEncryptionOption.OWNER_PASSWORD; +import static org.apache.fop.render.pdf.PDFEncryptionOption.USER_PASSWORD; +import static org.apache.fop.render.pdf.PDFRendererOption.DISABLE_SRGB_COLORSPACE; +import static org.apache.fop.render.pdf.PDFRendererOption.FILTER_LIST; +import static org.apache.fop.render.pdf.PDFRendererOption.OUTPUT_PROFILE; +import static org.apache.fop.render.pdf.PDFRendererOption.PDF_A_MODE; +import static org.apache.fop.render.pdf.PDFRendererOption.PDF_X_MODE; +import static org.apache.fop.render.pdf.PDFRendererOption.VERSION; /** * The PDF renderer configuration data object. @@ -72,46 +67,21 @@ public final class PDFRendererConfig implements RendererConfig { private static final Log LOG = LogFactory.getLog(PDFRendererConfig.class); - private final Map configOptions - = new EnumMap(PDFRendererConfigOption.class); + private final PDFRendererOptionsConfig configOption; private final DefaultFontConfig fontConfig; - private PDFRendererConfig(DefaultFontConfig fontConfig) { + private PDFRendererConfig(DefaultFontConfig fontConfig, PDFRendererOptionsConfig config) { this.fontConfig = fontConfig; + this.configOption = config; } - public DefaultFontConfig getFontInfoConfig() { - return fontConfig; - } - - public Map> getFilterMap() { - return (Map>) configOptions.get(FILTER_LIST); - } - - public PDFAMode getPDFAMode() { - return (PDFAMode) configOptions.get(PDF_A_MODE); - } - - public PDFXMode getPDFXMode() { - return (PDFXMode) configOptions.get(PDF_X_MODE); + public PDFRendererOptionsConfig getConfigOptions() { + return configOption; } - public PDFEncryptionParams getEncryptionParameters() { - return (PDFEncryptionParams) configOptions.get(ENCRYPTION_PARAMS); - } - - public URI getOutputProfileURI() { - return (URI) configOptions.get(OUTPUT_PROFILE); - } - - public Boolean getDisableSRGBColorSpace() { - return (Boolean) configOptions.get(DISABLE_SRGB_COLORSPACE); - } - - public Version getPDFVersion() { - String pdfVersion = (String) configOptions.get(VERSION); - return pdfVersion == null ? null : Version.getValueOf(pdfVersion); + public DefaultFontConfig getFontInfoConfig() { + return fontConfig; } /** @@ -131,61 +101,70 @@ public final class PDFRendererConfig implements RendererConfig { private static final class ParserHelper { + private final Map configOptions + = new EnumMap(PDFRendererOption.class); + + private PDFEncryptionParams encryptionConfig; + private PDFRendererConfig pdfConfig; private ParserHelper(Configuration cfg, FOUserAgent userAgent, boolean strict) throws FOPException { - pdfConfig = new PDFRendererConfig(new DefaultFontConfigParser().parse(cfg, strict)); if (cfg != null) { configure(cfg, userAgent, strict); } + pdfConfig = new PDFRendererConfig(new DefaultFontConfigParser().parse(cfg, strict), + new PDFRendererOptionsConfig(configOptions, encryptionConfig)); + } + + private void parseAndPut(PDFRendererOption option, Configuration cfg) { + put(option, option.parse(parseConfig(cfg, option))); } - private void put(PDFRendererConfigOption option, Object value) { + private void put(PDFRendererOption option, Object value) { if (value != null && !value.equals(option.getDefaultValue())) { - pdfConfig.configOptions.put(option, value); + configOptions.put(option, value); } } - private void configure(Configuration cfg, FOUserAgent userAgent, boolean strict) - throws FOPException { + private void configure(Configuration cfg, FOUserAgent userAgent, boolean strict) throws FOPException { try { buildFilterMapFromConfiguration(cfg); - put(PDF_A_MODE, PDFAMode.getValueOf(parseConfig(cfg, PDF_A_MODE))); - put(PDF_X_MODE, PDFXMode.getValueOf(parseConfig(cfg, PDF_X_MODE))); - Configuration encryptCfg = cfg.getChild(ENCRYPTION_PARAMS.getName(), false); - if (encryptCfg != null) { - PDFEncryptionParams encryptionConfig = new PDFEncryptionParams(); - encryptionConfig.setOwnerPassword(parseConfig(encryptCfg, OWNER_PASSWORD)); - encryptionConfig.setUserPassword(parseConfig(encryptCfg, USER_PASSWORD)); - encryptionConfig.setAllowPrint(!doesValueExist(encryptCfg, NO_PRINT)); - encryptionConfig.setAllowCopyContent(!doesValueExist(encryptCfg, NO_COPY_CONTENT)); - encryptionConfig.setAllowEditContent(!doesValueExist(encryptCfg, NO_EDIT_CONTENT)); - encryptionConfig.setAllowEditAnnotations(!doesValueExist(encryptCfg, NO_ANNOTATIONS)); - encryptionConfig.setAllowFillInForms(!doesValueExist(encryptCfg, NO_FILLINFORMS)); - encryptionConfig.setAllowAccessContent(!doesValueExist(encryptCfg, NO_ACCESSCONTENT)); - encryptionConfig.setAllowAssembleDocument(!doesValueExist(encryptCfg, - NO_ASSEMBLEDOC)); - encryptionConfig.setAllowPrintHq(!doesValueExist(encryptCfg, NO_PRINTHQ)); - String encryptionLength = parseConfig(encryptCfg, ENCRYPTION_LENGTH); - if (encryptionLength != null) { - int validatedLength = checkEncryptionLength(Integer.parseInt(encryptionLength), - userAgent); - encryptionConfig.setEncryptionLengthInBits(validatedLength); - } - put(ENCRYPTION_PARAMS, encryptionConfig); - } - put(OUTPUT_PROFILE, InternalResourceResolver.cleanURI(parseConfig(cfg, OUTPUT_PROFILE))); - put(DISABLE_SRGB_COLORSPACE, Boolean.valueOf(parseConfig(cfg, DISABLE_SRGB_COLORSPACE))); - put(VERSION, getPDFDocVersion(cfg)); + parseAndPut(PDF_A_MODE, cfg); + parseAndPut(PDF_X_MODE, cfg); + configureEncryptionParams(cfg, userAgent, strict); + parseAndPut(OUTPUT_PROFILE, cfg); + parseAndPut(DISABLE_SRGB_COLORSPACE, cfg); + + parseAndPut(VERSION, cfg); } catch (ConfigurationException e) { LogUtil.handleException(LOG, e, strict); - } catch (URISyntaxException use) { - LogUtil.handleException(LOG, use, strict); } } - private void buildFilterMapFromConfiguration(Configuration cfg) - throws ConfigurationException, FOPException { + private void configureEncryptionParams(Configuration cfg, FOUserAgent userAgent, boolean strict) { + Configuration encryptCfg = cfg.getChild(ENCRYPTION_PARAMS, false); + if (encryptCfg != null) { + encryptionConfig = new PDFEncryptionParams(); + encryptionConfig.setOwnerPassword(parseConfig(encryptCfg, OWNER_PASSWORD)); + encryptionConfig.setUserPassword(parseConfig(encryptCfg, USER_PASSWORD)); + encryptionConfig.setAllowPrint(!doesValueExist(encryptCfg, NO_PRINT)); + encryptionConfig.setAllowCopyContent(!doesValueExist(encryptCfg, NO_COPY_CONTENT)); + encryptionConfig.setAllowEditContent(!doesValueExist(encryptCfg, NO_EDIT_CONTENT)); + encryptionConfig.setAllowEditAnnotations(!doesValueExist(encryptCfg, NO_ANNOTATIONS)); + encryptionConfig.setAllowFillInForms(!doesValueExist(encryptCfg, NO_FILLINFORMS)); + encryptionConfig.setAllowAccessContent(!doesValueExist(encryptCfg, NO_ACCESSCONTENT)); + encryptionConfig.setAllowAssembleDocument(!doesValueExist(encryptCfg, NO_ASSEMBLEDOC)); + encryptionConfig.setAllowPrintHq(!doesValueExist(encryptCfg, NO_PRINTHQ)); + String encryptionLength = parseConfig(encryptCfg, ENCRYPTION_LENGTH); + if (encryptionLength != null) { + int validatedLength = checkEncryptionLength(Integer.parseInt(encryptionLength), userAgent); + encryptionConfig.setEncryptionLengthInBits(validatedLength); + } + } + } + + private void buildFilterMapFromConfiguration(Configuration cfg) throws ConfigurationException, + FOPException { Configuration[] filterLists = cfg.getChildren(FILTER_LIST.getName()); Map> filterMap = new HashMap>(); for (Configuration filters : filterLists) { @@ -218,28 +197,15 @@ public final class PDFRendererConfig implements RendererConfig { put(FILTER_LIST, filterMap); } - private String parseConfig(Configuration cfg, PDFRendererConfigOption option) { + private String parseConfig(Configuration cfg, RendererConfigOption option) { Configuration child = cfg.getChild(option.getName()); return child.getValue(null); } - private boolean doesValueExist(Configuration cfg, PDFRendererConfigOption option) { + private boolean doesValueExist(Configuration cfg, RendererConfigOption option) { return cfg.getChild(option.getName(), false) != null; } - private String getPDFDocVersion(Configuration cfg) throws FOPException { - Configuration pdfVersion = cfg.getChild(VERSION.getName(), false); - if (pdfVersion != null) { - String version = pdfVersion.getValue(null); - if (version != null && version.length() != 0) { - return version; - } else { - throw new FOPException("The PDF version has not been set."); - } - } - return null; - } - private int checkEncryptionLength(int encryptionLength, FOUserAgent userAgent) { int correctEncryptionLength = encryptionLength; if (encryptionLength < 40) { diff --git a/src/java/org/apache/fop/render/pdf/PDFRendererConfigOption.java b/src/java/org/apache/fop/render/pdf/PDFRendererConfigOption.java deleted file mode 100644 index faa3302c3..000000000 --- a/src/java/org/apache/fop/render/pdf/PDFRendererConfigOption.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* $Id$ */ - -package org.apache.fop.render.pdf; - -import org.apache.fop.pdf.PDFAMode; -import org.apache.fop.pdf.PDFXMode; -import org.apache.fop.render.RendererConfigOption; - -public enum PDFRendererConfigOption implements RendererConfigOption { - FILTER_LIST("filterList"), - /** Rendering Options key for the PDF/A mode, default: {@link PDFAMode#DISABLED} */ - PDF_A_MODE("pdf-a-mode", PDFAMode.DISABLED), - /** Rendering Options key for the PDF/X mode, default: {@link PDFXMode#DISABLED} */ - PDF_X_MODE("pdf-x-mode", PDFXMode.DISABLED), - /** PDF version entry: specify the version of the PDF document created, datatype: String */ - VERSION("version"), - /** - * Rendering Options key for disabling the sRGB color space (only possible if no PDF/A or - * PDF/X profile is active), default: false - */ - DISABLE_SRGB_COLORSPACE("disable-srgb-colorspace", false), - /** Rendering Options key for the ICC profile for the output intent. */ - OUTPUT_PROFILE("output-profile"), - /** PDF encryption parameter: all parameters as object, datatype: PDFEncryptionParams */ - ENCRYPTION_PARAMS("encryption-params"), - /** - * PDF encryption length parameter: must be a multiple of 8 between 40 and 128, - * default value 40, datatype: int, default: 40 - */ - ENCRYPTION_LENGTH("encryption-length", 40), - /** - * PDF encryption parameter: Forbids printing to high quality, datatype: Boolean or - * "true"/"false", default: false - */ - NO_PRINTHQ("noprinthq", 40), - /** - * PDF encryption parameter: Forbids assembling document, datatype: Boolean or - * "true"/"false", default: false - */ - NO_ASSEMBLEDOC("noassembledoc", false), - /** - * PDF encryption parameter: Forbids extracting text and graphics, datatype: Boolean - * or "true"/"false", default: false - */ - NO_ACCESSCONTENT("noaccesscontent", false), - /** - * PDF encryption parameter: Forbids filling in existing interactive forms, datatype: - * Boolean or "true"/"false", default: false - */ - NO_FILLINFORMS("nofillinforms", false), - /** - * PDF encryption parameter: Forbids annotations, datatype: Boolean or "true"/"false", - * default: false - */ - NO_ANNOTATIONS("noannotations", false), - /** - * PDF encryption parameter: Forbids printing, datatype: Boolean or "true"/"false", - * default: false - */ - NO_PRINT("noprint", false), - /** - * PDF encryption parameter: Forbids copying content, datatype: Boolean or "true"/"false", - * default: false - */ - NO_COPY_CONTENT("nocopy", false), - /** - * PDF encryption parameter: Forbids editing content, datatype: Boolean or "true"/"false", - * default: false - */ - NO_EDIT_CONTENT("noedit", false), - /** PDF encryption parameter: user password, datatype: String, default: "" */ - USER_PASSWORD("user-password", ""), - /** PDF encryption parameter: owner password, datatype: String, default: "" */ - OWNER_PASSWORD("owner-password", ""); - - private final String name; - private final Object defaultValue; - - private PDFRendererConfigOption(String name, Object defaultValue) { - this.name = name; - this.defaultValue = defaultValue; - } - - private PDFRendererConfigOption(String name) { - this(name, null); - } - - public String getName() { - return name; - } - - public Object getDefaultValue() { - return defaultValue; - } -} diff --git a/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java b/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java index 9cd89fa01..96a19db6a 100644 --- a/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java +++ b/src/java/org/apache/fop/render/pdf/PDFRendererConfigurator.java @@ -21,7 +21,6 @@ package org.apache.fop.render.pdf; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; -import org.apache.fop.pdf.PDFEncryptionParams; import org.apache.fop.render.DefaultRendererConfigurator; import org.apache.fop.render.RendererConfig.RendererConfigParser; import org.apache.fop.render.intermediate.IFDocumentHandler; @@ -40,52 +39,10 @@ public class PDFRendererConfigurator extends DefaultRendererConfigurator { super(userAgent, rendererConfigParser); } - // ---=== IFDocumentHandler configuration ===--- - /** {@inheritDoc} */ public void configure(IFDocumentHandler documentHandler) throws FOPException { - final PDFRendererConfig pdfConfig = (PDFRendererConfig) getRendererConfig(documentHandler); - if (pdfConfig != null) { - PDFDocumentHandler pdfDocumentHandler = (PDFDocumentHandler) documentHandler; - PDFRenderingUtil pdfUtil = pdfDocumentHandler.getPDFUtil(); - if (pdfConfig.getFilterMap() != null) { - pdfUtil.setFilterMap(pdfConfig.getFilterMap()); - } - if (pdfConfig.getPDFAMode() != null) { - pdfUtil.setAMode(pdfConfig.getPDFAMode()); - } - if (pdfConfig.getPDFXMode() != null) { - pdfUtil.setXMode(pdfConfig.getPDFXMode()); - } - if (pdfConfig.getOutputProfileURI() != null) { - pdfUtil.setOutputProfileURI(pdfConfig.getOutputProfileURI()); - } - if (pdfConfig.getPDFVersion() != null) { - pdfUtil.setPDFVersion(pdfConfig.getPDFVersion()); - } - if (pdfConfig.getDisableSRGBColorSpace() != null) { - pdfUtil.setDisableSRGBColorSpace(pdfConfig.getDisableSRGBColorSpace()); - } - - PDFEncryptionParams config = pdfConfig.getEncryptionParameters(); - if (config != null) { - PDFEncryptionParams utilParams = pdfUtil.getEncryptionParams(); - if (config.getUserPassword() != null) { - utilParams.setUserPassword(config.getUserPassword()); - } - if (config.getOwnerPassword() != null) { - utilParams.setOwnerPassword(config.getOwnerPassword()); - } - utilParams.setAllowPrint(config.isAllowPrint()); - utilParams.setAllowCopyContent(config.isAllowCopyContent()); - utilParams.setAllowEditContent(config.isAllowEditContent()); - utilParams.setAllowAssembleDocument(config.isAllowAssembleDocument()); - utilParams.setAllowAccessContent(config.isAllowAccessContent()); - utilParams.setAllowFillInForms(config.isAllowFillInForms()); - utilParams.setAllowPrintHq(config.isAllowPrintHq()); - utilParams.setEncryptionLengthInBits(config.getEncryptionLengthInBits()); - } - } + ((PDFDocumentHandler) documentHandler).mergeRendererOptionsConfig( + ((PDFRendererConfig) getRendererConfig(documentHandler)).getConfigOptions()); } } diff --git a/src/java/org/apache/fop/render/pdf/PDFRendererOption.java b/src/java/org/apache/fop/render/pdf/PDFRendererOption.java new file mode 100644 index 000000000..7305b9646 --- /dev/null +++ b/src/java/org/apache/fop/render/pdf/PDFRendererOption.java @@ -0,0 +1,112 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.pdf; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.fop.apps.io.InternalResourceResolver; +import org.apache.fop.pdf.PDFAMode; +import org.apache.fop.pdf.PDFXMode; +import org.apache.fop.pdf.Version; +import org.apache.fop.render.RendererConfigOption; + +public enum PDFRendererOption implements RendererConfigOption { + FILTER_LIST("filterList", null) { + @Override + Object deserialize(String value) { + throw new UnsupportedOperationException(); + } + }, + /** Rendering Options key for the PDF/A mode, default: {@link PDFAMode#DISABLED} */ + PDF_A_MODE("pdf-a-mode", PDFAMode.DISABLED){ + @Override + PDFAMode deserialize(String value) { + return PDFAMode.getValueOf(value); + } + }, + /** Rendering Options key for the PDF/X mode, default: {@link PDFXMode#DISABLED} */ + PDF_X_MODE("pdf-x-mode", PDFXMode.DISABLED){ + @Override + PDFXMode deserialize(String value) { + return PDFXMode.getValueOf(value); + } + }, + /** PDF version entry: specify the version of the PDF document created, datatype: String */ + VERSION("version") { + @Override + Version deserialize(String value) { + return Version.getValueOf(value); + } + }, + /** + * Rendering Options key for disabling the sRGB color space (only possible if no PDF/A or + * PDF/X profile is active), default: false + */ + DISABLE_SRGB_COLORSPACE("disable-srgb-colorspace", false) { + @Override + Boolean deserialize(String value) { + return Boolean.valueOf(value); + } + }, + /** Rendering Options key for the ICC profile for the output intent. */ + OUTPUT_PROFILE("output-profile") { + @Override + URI deserialize(String value) { + try { + return InternalResourceResolver.cleanURI(value); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + }; + + private final String name; + + private final Object defaultValue; + + private PDFRendererOption(String name, Object defaultValue) { + this.name = name; + this.defaultValue = defaultValue; + } + + private PDFRendererOption(String name) { + this(name, null); + } + + public String getName() { + return name; + } + + public Object getDefaultValue() { + return defaultValue; + } + + public Object parse(Object object) { + if (object instanceof String) { + return deserialize((String) object); + } else { + return object; + } + } + + abstract Object deserialize(String value); + +} diff --git a/src/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java b/src/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java new file mode 100644 index 000000000..e8b068647 --- /dev/null +++ b/src/java/org/apache/fop/render/pdf/PDFRendererOptionsConfig.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.pdf; + +import java.net.URI; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; + +import org.apache.fop.pdf.PDFAMode; +import org.apache.fop.pdf.PDFEncryptionParams; +import org.apache.fop.pdf.PDFXMode; +import org.apache.fop.pdf.Version; + +import static org.apache.fop.render.pdf.PDFRendererOption.DISABLE_SRGB_COLORSPACE; +import static org.apache.fop.render.pdf.PDFRendererOption.FILTER_LIST; +import static org.apache.fop.render.pdf.PDFRendererOption.OUTPUT_PROFILE; +import static org.apache.fop.render.pdf.PDFRendererOption.PDF_A_MODE; +import static org.apache.fop.render.pdf.PDFRendererOption.PDF_X_MODE; +import static org.apache.fop.render.pdf.PDFRendererOption.VERSION; + +/** + * The renderer options configuration data. + */ +public final class PDFRendererOptionsConfig { + + static final PDFRendererOptionsConfig DEFAULT; + + static { + final EnumMap props + = new EnumMap(PDFRendererOption.class); + for(PDFRendererOption option : PDFRendererOption.values()) { + props.put(option, option.getDefaultValue()); + } + DEFAULT = new PDFRendererOptionsConfig(props, null); + } + + private final Map properties + = new EnumMap(PDFRendererOption.class); + + private final PDFEncryptionParams encryptionConfig; + + PDFRendererOptionsConfig(Map props, + PDFEncryptionParams encryptionParams) { + properties.putAll(props); + this.encryptionConfig = copyPDFEncryptionParams(encryptionParams); + } + + private static PDFEncryptionParams copyPDFEncryptionParams(PDFEncryptionParams source) { + return source == null ? null : new PDFEncryptionParams(source); + } + + PDFRendererOptionsConfig merge(PDFRendererOptionsConfig config) { + if (config == null) { + return this; + } else { + return new PDFRendererOptionsConfig(merge(this.properties, config.properties), + config.getEncryptionParameters() == null + ? copyPDFEncryptionParams(this.encryptionConfig) + : copyPDFEncryptionParams(config.getEncryptionParameters())); + } + } + + private static Map merge( + Map first, Map second) { + final EnumMap merged + = new EnumMap(PDFRendererOption.class); + for (PDFRendererOption option : PDFRendererOption.values()) { + Object value = second.get(option); + if (value != null) { + merged.put(option, value); + } else { + merged.put(option, first.get(option)); + } + } + return merged; + } + + public Map> getFilterMap() { + return (Map>) properties.get(FILTER_LIST); + } + + public PDFAMode getPDFAMode() { + return (PDFAMode) properties.get(PDF_A_MODE); + } + + public PDFXMode getPDFXMode() { + return (PDFXMode) properties.get(PDF_X_MODE); + } + + public PDFEncryptionParams getEncryptionParameters() { + return encryptionConfig; + } + + public URI getOutputProfileURI() { + return (URI) properties.get(OUTPUT_PROFILE); + } + + public Boolean getDisableSRGBColorSpace() { + return (Boolean) properties.get(DISABLE_SRGB_COLORSPACE); + } + + public Version getPDFVersion() { + return (Version) properties.get(VERSION); + } +} diff --git a/src/java/org/apache/fop/render/pdf/PDFRenderingUtil.java b/src/java/org/apache/fop/render/pdf/PDFRenderingUtil.java index 2a6a364e6..fba9d922f 100644 --- a/src/java/org/apache/fop/render/pdf/PDFRenderingUtil.java +++ b/src/java/org/apache/fop/render/pdf/PDFRenderingUtil.java @@ -26,6 +26,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; +import java.util.EnumMap; import java.util.Map; import org.apache.commons.io.IOUtils; @@ -66,21 +67,18 @@ import org.apache.fop.pdf.Version; import org.apache.fop.pdf.VersionController; import org.apache.fop.render.pdf.extensions.PDFEmbeddedFileExtensionAttachment; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.DISABLE_SRGB_COLORSPACE; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.ENCRYPTION_PARAMS; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_ACCESSCONTENT; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_ANNOTATIONS; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_ASSEMBLEDOC; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_COPY_CONTENT; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_EDIT_CONTENT; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_FILLINFORMS; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_PRINT; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.NO_PRINTHQ; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.OUTPUT_PROFILE; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.OWNER_PASSWORD; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.PDF_A_MODE; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.PDF_X_MODE; -import static org.apache.fop.render.pdf.PDFRendererConfigOption.USER_PASSWORD; +import static org.apache.fop.render.pdf.PDFEncryptionOption.ENCRYPTION_PARAMS; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_ACCESSCONTENT; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_ANNOTATIONS; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_ASSEMBLEDOC; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_COPY_CONTENT; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_EDIT_CONTENT; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_FILLINFORMS; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_PRINT; +import static org.apache.fop.render.pdf.PDFEncryptionOption.NO_PRINTHQ; +import static org.apache.fop.render.pdf.PDFEncryptionOption.OWNER_PASSWORD; +import static org.apache.fop.render.pdf.PDFEncryptionOption.USER_PASSWORD; + /** * Utility class which enables all sorts of features that are not directly connected to the @@ -96,168 +94,40 @@ class PDFRenderingUtil { /** the PDF Document being created */ private PDFDocument pdfDoc; - /** the PDF/A mode (Default: disabled) */ - private PDFAMode pdfAMode = (PDFAMode) PDFRendererConfigOption.PDF_A_MODE.getDefaultValue(); - - /** the PDF/X mode (Default: disabled) */ - private PDFXMode pdfXMode = (PDFXMode) PDFRendererConfigOption.PDF_X_MODE.getDefaultValue(); - - /** the (optional) encryption parameters */ - private PDFEncryptionParams encryptionParams; - - /** Registry of PDF filters */ - private Map filterMap; + private PDFRendererOptionsConfig rendererConfig; /** the ICC stream used as output profile by this document for PDF/A and PDF/X functionality. */ private PDFICCStream outputProfile; + /** the default sRGB color space. */ private PDFICCBasedColorSpace sRGBColorSpace; - /** controls whether the sRGB color space should be installed */ - private boolean disableSRGBColorSpace = false; - - /** Optional URI to an output profile to be used. */ - private URI outputProfileURI; - - private Version maxPDFVersion; - PDFRenderingUtil(FOUserAgent userAgent) { this.userAgent = userAgent; initialize(); } - private static boolean booleanValueOf(Object obj) { - if (obj instanceof Boolean) { - return ((Boolean)obj).booleanValue(); - } else if (obj instanceof String) { - return Boolean.valueOf((String)obj).booleanValue(); - } else { - throw new IllegalArgumentException("Boolean or \"true\" or \"false\" expected."); - } - } - private void initialize() { - PDFEncryptionParams params - = (PDFEncryptionParams) userAgent.getRendererOption(ENCRYPTION_PARAMS); - if (params != null) { - this.encryptionParams = params; //overwrite if available - } - String userPassword = (String) userAgent.getRendererOption(USER_PASSWORD); - if (userPassword != null) { - getEncryptionParams().setUserPassword(userPassword); - } - String ownerPassword = (String) userAgent.getRendererOption(OWNER_PASSWORD); - if (ownerPassword != null) { - getEncryptionParams().setOwnerPassword(ownerPassword); - } - Object noPrint = userAgent.getRendererOption(NO_PRINT); - if (noPrint != null) { - getEncryptionParams().setAllowPrint(!booleanValueOf(noPrint)); - } - Object noCopyContent = userAgent.getRendererOption(NO_COPY_CONTENT); - if (noCopyContent != null) { - getEncryptionParams().setAllowCopyContent(!booleanValueOf(noCopyContent)); - } - Object noEditContent = userAgent.getRendererOption(NO_EDIT_CONTENT); - if (noEditContent != null) { - getEncryptionParams().setAllowEditContent(!booleanValueOf(noEditContent)); - } - Object noAnnotations = userAgent.getRendererOption(NO_ANNOTATIONS); - if (noAnnotations != null) { - getEncryptionParams().setAllowEditAnnotations(!booleanValueOf(noAnnotations)); - } - Object noFillInForms = userAgent.getRendererOption(NO_FILLINFORMS); - if (noFillInForms != null) { - getEncryptionParams().setAllowFillInForms(!booleanValueOf(noFillInForms)); - } - Object noAccessContent = userAgent.getRendererOption(NO_ACCESSCONTENT); - if (noAccessContent != null) { - getEncryptionParams().setAllowAccessContent(!booleanValueOf(noAccessContent)); - } - Object noAssembleDoc = userAgent.getRendererOption(NO_ASSEMBLEDOC); - if (noAssembleDoc != null) { - getEncryptionParams().setAllowAssembleDocument(!booleanValueOf(noAssembleDoc)); - } - Object noPrintHQ = userAgent.getRendererOption(NO_PRINTHQ); - if (noPrintHQ != null) { - getEncryptionParams().setAllowPrintHq(!booleanValueOf(noPrintHQ)); - } - String s = (String) userAgent.getRendererOption(PDF_A_MODE); - if (s != null) { - this.pdfAMode = PDFAMode.getValueOf(s); - } - if (this.pdfAMode.isPDFA1LevelA()) { + rendererConfig = PDFRendererOptionsConfig.DEFAULT.merge(createFromUserAgent(userAgent)); + if (rendererConfig.getPDFAMode().isPDFA1LevelA()) { //Enable accessibility if PDF/A-1a is enabled because it requires tagged PDF. userAgent.getRendererOptions().put(Accessibility.ACCESSIBILITY, Boolean.TRUE); } - s = (String) userAgent.getRendererOption(PDF_X_MODE); - if (s != null) { - this.pdfXMode = PDFXMode.getValueOf(s); - } - s = (String) userAgent.getRendererOption(OUTPUT_PROFILE); - if (s != null) { - this.outputProfileURI = URI.create(s); - } - Object disableSRGBColorSpace = userAgent.getRendererOption(DISABLE_SRGB_COLORSPACE); - if (disableSRGBColorSpace != null) { - this.disableSRGBColorSpace = booleanValueOf(disableSRGBColorSpace); - } - } - - public FOUserAgent getUserAgent() { - return this.userAgent; - } - - /** - * Sets the PDF/A mode for the PDF renderer. - * @param mode the PDF/A mode - */ - public void setAMode(PDFAMode mode) { - this.pdfAMode = mode; - } - - /** - * Sets the PDF/X mode for the PDF renderer. - * @param mode the PDF/X mode - */ - public void setXMode(PDFXMode mode) { - this.pdfXMode = mode; } - /** - * Sets the output color profile for the PDF renderer. - * @param outputProfileURI the URI to the output color profile - */ - public void setOutputProfileURI(URI outputProfileURI) { - this.outputProfileURI = outputProfileURI; - } - - /** - * Enables or disables the default sRGB color space needed for the PDF document to preserve - * the sRGB colors used in XSL-FO. - * @param disable true to disable, false to enable - */ - public void setDisableSRGBColorSpace(boolean disable) { - this.disableSRGBColorSpace = disable; - } - - /** - * Sets the filter map to be used by the PDF renderer. - * @param filterMap the filter map - */ - public void setFilterMap(Map filterMap) { - this.filterMap = filterMap; + private static PDFRendererOptionsConfig createFromUserAgent(FOUserAgent userAgent) { + Map properties + = new EnumMap(PDFRendererOption.class); + for (PDFRendererOption option : PDFRendererOption.values()) { + Object value = userAgent.getRendererOption(option); + properties.put(option, option.parse(value)); + } + PDFEncryptionParams encryptionConfig = new EncryptionParamsBuilder().createParams(userAgent); + return new PDFRendererOptionsConfig(properties, encryptionConfig); } - /** - * Gets the encryption parameters used by the PDF renderer. - * @return encryptionParams the encryption parameters - */ - PDFEncryptionParams getEncryptionParams() { - if (this.encryptionParams == null) { - this.encryptionParams = new PDFEncryptionParams(); - } - return this.encryptionParams; + void mergeRendererOptionsConfig(PDFRendererOptionsConfig config) { + rendererConfig = rendererConfig.merge(config); } private void updateInfo() { @@ -271,15 +141,15 @@ class PDFRenderingUtil { } private void updatePDFProfiles() { - pdfDoc.getProfile().setPDFAMode(this.pdfAMode); - pdfDoc.getProfile().setPDFXMode(this.pdfXMode); + pdfDoc.getProfile().setPDFAMode(rendererConfig.getPDFAMode()); + pdfDoc.getProfile().setPDFXMode(rendererConfig.getPDFXMode()); } private void addsRGBColorSpace() throws IOException { - if (disableSRGBColorSpace) { - if (this.pdfAMode != PDFAMode.DISABLED - || this.pdfXMode != PDFXMode.DISABLED - || this.outputProfileURI != null) { + if (rendererConfig.getDisableSRGBColorSpace()) { + if (rendererConfig.getPDFAMode() != PDFAMode.DISABLED + || rendererConfig.getPDFXMode() != PDFXMode.DISABLED + || rendererConfig.getOutputProfileURI() != null) { throw new IllegalStateException("It is not possible to disable the sRGB color" + " space if PDF/A or PDF/X functionality is enabled or an" + " output profile is set!"); @@ -299,9 +169,10 @@ class PDFRenderingUtil { } ICC_Profile profile; InputStream in = null; - if (this.outputProfileURI != null) { + URI outputProfileUri = rendererConfig.getOutputProfileURI(); + if (outputProfileUri != null) { this.outputProfile = pdfDoc.getFactory().makePDFICCStream(); - in = getUserAgent().getResourceResolver().getResource(outputProfileURI); + in = userAgent.getResourceResolver().getResource(rendererConfig.getOutputProfileURI()); try { profile = ColorProfileUtil.getICC_Profile(in); } finally { @@ -386,7 +257,7 @@ class PDFRenderingUtil { } String producer = userAgent.getProducer() != null ? userAgent.getProducer() : ""; - + final Version maxPDFVersion = rendererConfig.getPDFVersion(); if (maxPDFVersion == null) { this.pdfDoc = new PDFDocument(producer); } else { @@ -396,22 +267,24 @@ class PDFRenderingUtil { } updateInfo(); updatePDFProfiles(); - pdfDoc.setFilterMap(filterMap); + pdfDoc.setFilterMap(rendererConfig.getFilterMap()); pdfDoc.outputHeader(out); //Setup encryption if necessary - PDFEncryptionManager.setupPDFEncryption(encryptionParams, pdfDoc); + PDFEncryptionManager.setupPDFEncryption(rendererConfig.getEncryptionParameters(), pdfDoc); addsRGBColorSpace(); - if (this.outputProfileURI != null) { + if (rendererConfig.getOutputProfileURI() != null) { addDefaultOutputProfile(); } + PDFXMode pdfXMode = rendererConfig.getPDFXMode(); if (pdfXMode != PDFXMode.DISABLED) { log.debug(pdfXMode + " is active."); log.warn("Note: " + pdfXMode + " support is work-in-progress and not fully implemented, yet!"); addPDFXOutputIntent(); } + PDFAMode pdfAMode = rendererConfig.getPDFAMode(); if (pdfAMode.isPDFA1LevelB()) { log.debug("PDF/A is active. Conformance Level: " + pdfAMode); addPDFA1OutputIntent(); @@ -467,7 +340,7 @@ class PDFRenderingUtil { } catch (URISyntaxException use) { throw new RuntimeException(use); } - InputStream in = getUserAgent().getResourceResolver().getResource(srcURI); + InputStream in = userAgent.getResourceResolver().getResource(srcURI); if (in == null) { throw new FileNotFoundException(embeddedFile.getSrc()); } @@ -507,14 +380,72 @@ class PDFRenderingUtil { nameArray.add(new PDFReference(fileSpec)); } - /** - * Sets the PDF version of the output document. See {@link Version} for the format of - * version. - * @param version the PDF version - * @throws IllegalArgumentException if the format of version doesn't conform to that specified - * by {@link Version} - */ - public void setPDFVersion(Version version) { - maxPDFVersion = version; + private static final class EncryptionParamsBuilder { + private PDFEncryptionParams params; + + private EncryptionParamsBuilder() { + } + + private PDFEncryptionParams createParams(FOUserAgent userAgent) { + params = (PDFEncryptionParams) userAgent.getRendererOptions().get(ENCRYPTION_PARAMS); + String userPassword = (String) userAgent.getRendererOption(USER_PASSWORD); + if (userPassword != null) { + getEncryptionParams().setUserPassword(userPassword); + } + String ownerPassword = (String) userAgent.getRendererOption(OWNER_PASSWORD); + if (ownerPassword != null) { + getEncryptionParams().setOwnerPassword(ownerPassword); + } + Object noPrint = userAgent.getRendererOption(NO_PRINT); + if (noPrint != null) { + getEncryptionParams().setAllowPrint(!booleanValueOf(noPrint)); + } + Object noCopyContent = userAgent.getRendererOption(NO_COPY_CONTENT); + if (noCopyContent != null) { + getEncryptionParams().setAllowCopyContent(!booleanValueOf(noCopyContent)); + } + Object noEditContent = userAgent.getRendererOption(NO_EDIT_CONTENT); + if (noEditContent != null) { + getEncryptionParams().setAllowEditContent(!booleanValueOf(noEditContent)); + } + Object noAnnotations = userAgent.getRendererOption(NO_ANNOTATIONS); + if (noAnnotations != null) { + getEncryptionParams().setAllowEditAnnotations(!booleanValueOf(noAnnotations)); + } + Object noFillInForms = userAgent.getRendererOption(NO_FILLINFORMS); + if (noFillInForms != null) { + getEncryptionParams().setAllowFillInForms(!booleanValueOf(noFillInForms)); + } + Object noAccessContent = userAgent.getRendererOption(NO_ACCESSCONTENT); + if (noAccessContent != null) { + getEncryptionParams().setAllowAccessContent(!booleanValueOf(noAccessContent)); + } + Object noAssembleDoc = userAgent.getRendererOption(NO_ASSEMBLEDOC); + if (noAssembleDoc != null) { + getEncryptionParams().setAllowAssembleDocument(!booleanValueOf(noAssembleDoc)); + } + Object noPrintHQ = userAgent.getRendererOption(NO_PRINTHQ); + if (noPrintHQ != null) { + getEncryptionParams().setAllowPrintHq(!booleanValueOf(noPrintHQ)); + } + return params; + } + + private PDFEncryptionParams getEncryptionParams() { + if (params == null) { + params = new PDFEncryptionParams(); + } + return params; + } + + private static boolean booleanValueOf(Object obj) { + if (obj instanceof Boolean) { + return ((Boolean)obj).booleanValue(); + } else if (obj instanceof String) { + return Boolean.valueOf((String)obj).booleanValue(); + } else { + throw new IllegalArgumentException("Boolean or \"true\" or \"false\" expected."); + } + } } } diff --git a/src/java/org/apache/fop/render/ps/PSRendererConfig.java b/src/java/org/apache/fop/render/ps/PSRendererConfig.java index 0d043c10d..e26be11d0 100644 --- a/src/java/org/apache/fop/render/ps/PSRendererConfig.java +++ b/src/java/org/apache/fop/render/ps/PSRendererConfig.java @@ -35,20 +35,20 @@ import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser; import org.apache.fop.render.RendererConfig; import org.apache.fop.util.LogUtil; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.AUTO_ROTATE_LANDSCAPE; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.DSC_COMPLIANT; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.LANGUAGE_LEVEL; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.OPTIMIZE_RESOURCES; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.RENDERING_MODE; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.SAFE_SET_PAGE_DEVICE; +import static org.apache.fop.render.ps.PSRendererOption.AUTO_ROTATE_LANDSCAPE; +import static org.apache.fop.render.ps.PSRendererOption.DSC_COMPLIANT; +import static org.apache.fop.render.ps.PSRendererOption.LANGUAGE_LEVEL; +import static org.apache.fop.render.ps.PSRendererOption.OPTIMIZE_RESOURCES; +import static org.apache.fop.render.ps.PSRendererOption.RENDERING_MODE; +import static org.apache.fop.render.ps.PSRendererOption.SAFE_SET_PAGE_DEVICE; /** * The PostScript renderer configuration data object. */ public final class PSRendererConfig implements RendererConfig { - private final EnumMap params - = new EnumMap(PSRendererConfigurationOption.class); + private final EnumMap params + = new EnumMap(PSRendererOption.class); private final DefaultFontConfig fontConfig; @@ -132,12 +132,12 @@ public final class PSRendererConfig implements RendererConfig { } } - private void setConfigParameter(PSRendererConfigurationOption option, + private void setConfigParameter(PSRendererOption option, Object value) { config.params.put(option, value != null ? value : option.getDefaultValue()); } - private void setBoolConfigParam(Configuration cfg, PSRendererConfigurationOption option) { + private void setBoolConfigParam(Configuration cfg, PSRendererOption option) { setConfigParameter(option, cfg.getChild( option.getName()).getValueAsBoolean((Boolean) option.getDefaultValue())); } diff --git a/src/java/org/apache/fop/render/ps/PSRendererConfigurationOption.java b/src/java/org/apache/fop/render/ps/PSRendererConfigurationOption.java deleted file mode 100644 index 7358517af..000000000 --- a/src/java/org/apache/fop/render/ps/PSRendererConfigurationOption.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* $Id$ */ - -package org.apache.fop.render.ps; - -import org.apache.xmlgraphics.ps.PSGenerator; - -import org.apache.fop.render.RendererConfigOption; - -/** - * An enumeration of the PostScript renderer configuration options along with their default values. - */ -public enum PSRendererConfigurationOption implements RendererConfigOption { - /** Indicates whether landscape pages should be rotated, default: false */ - AUTO_ROTATE_LANDSCAPE("auto-rotate-landscape", false), - /** Sets the PostScript language leven, default: {@see PSGenerator#DEFAULT_LANGUAGE_LEVEL}*/ - LANGUAGE_LEVEL("language-level", PSGenerator.DEFAULT_LANGUAGE_LEVEL), - /** Whether resources should be optimized in a post-processing run, default: false */ - OPTIMIZE_RESOURCES("optimize-resources", false), - /** Indicates whether the "safe setpagedevice" mode is active, default: false */ - SAFE_SET_PAGE_DEVICE("safe-set-page-device", false), - /** Indicates whether the PostScript output should be DSC compliant, default: true*/ - DSC_COMPLIANT("dsc-compliant", true), - RENDERING_MODE("rendering", PSRenderingMode.QUALITY); - - private final String name; - private final Object defaultValue; - - private PSRendererConfigurationOption(String name, Object defaultValue) { - this.name = name; - this.defaultValue = defaultValue; - } - - public String getName() { - return name; - } - - public Object getDefaultValue() { - return defaultValue; - } -} diff --git a/src/java/org/apache/fop/render/ps/PSRendererOption.java b/src/java/org/apache/fop/render/ps/PSRendererOption.java new file mode 100644 index 000000000..4c3396921 --- /dev/null +++ b/src/java/org/apache/fop/render/ps/PSRendererOption.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.ps; + +import org.apache.xmlgraphics.ps.PSGenerator; + +import org.apache.fop.render.RendererConfigOption; + +/** + * An enumeration of the PostScript renderer configuration options along with their default values. + */ +public enum PSRendererOption implements RendererConfigOption { + /** Indicates whether landscape pages should be rotated, default: false */ + AUTO_ROTATE_LANDSCAPE("auto-rotate-landscape", false), + /** Sets the PostScript language leven, default: {@see PSGenerator#DEFAULT_LANGUAGE_LEVEL}*/ + LANGUAGE_LEVEL("language-level", PSGenerator.DEFAULT_LANGUAGE_LEVEL), + /** Whether resources should be optimized in a post-processing run, default: false */ + OPTIMIZE_RESOURCES("optimize-resources", false), + /** Indicates whether the "safe setpagedevice" mode is active, default: false */ + SAFE_SET_PAGE_DEVICE("safe-set-page-device", false), + /** Indicates whether the PostScript output should be DSC compliant, default: true*/ + DSC_COMPLIANT("dsc-compliant", true), + RENDERING_MODE("rendering", PSRenderingMode.QUALITY); + + private final String name; + private final Object defaultValue; + + private PSRendererOption(String name, Object defaultValue) { + this.name = name; + this.defaultValue = defaultValue; + } + + public String getName() { + return name; + } + + public Object getDefaultValue() { + return defaultValue; + } +} diff --git a/src/java/org/apache/fop/render/ps/PSRenderingUtil.java b/src/java/org/apache/fop/render/ps/PSRenderingUtil.java index 1322d5e4b..4033c304f 100644 --- a/src/java/org/apache/fop/render/ps/PSRenderingUtil.java +++ b/src/java/org/apache/fop/render/ps/PSRenderingUtil.java @@ -33,9 +33,9 @@ import org.apache.fop.render.ps.extensions.PSCommentBefore; import org.apache.fop.render.ps.extensions.PSExtensionAttachment; import org.apache.fop.render.ps.extensions.PSSetupCode; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.AUTO_ROTATE_LANDSCAPE; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.LANGUAGE_LEVEL; -import static org.apache.fop.render.ps.PSRendererConfigurationOption.OPTIMIZE_RESOURCES; +import static org.apache.fop.render.ps.PSRendererOption.AUTO_ROTATE_LANDSCAPE; +import static org.apache.fop.render.ps.PSRendererOption.LANGUAGE_LEVEL; +import static org.apache.fop.render.ps.PSRendererOption.OPTIMIZE_RESOURCES; /** * Utility class which enables all sorts of features that are not directly connected to the diff --git a/src/java/org/apache/fop/render/ps/PSTextPainter.java b/src/java/org/apache/fop/render/ps/PSTextPainter.java index 2b3afaec7..1f89dc8f0 100644 --- a/src/java/org/apache/fop/render/ps/PSTextPainter.java +++ b/src/java/org/apache/fop/render/ps/PSTextPainter.java @@ -52,7 +52,7 @@ import org.apache.fop.util.CharUtilities; import org.apache.fop.util.HexEncoder; /** - * Renders the attributed character iterator of a text node. + * Renders the attributed character iterator of a {@link org.apache.batik.gvt.TextNode TextNode}. * This class draws the text directly using PostScript text operators so * the text is not drawn using shapes which makes the PS files larger. *

diff --git a/src/java/org/apache/fop/render/ps/fonts/PSTTFGenerator.java b/src/java/org/apache/fop/render/ps/fonts/PSTTFGenerator.java new file mode 100644 index 000000000..556b62457 --- /dev/null +++ b/src/java/org/apache/fop/render/ps/fonts/PSTTFGenerator.java @@ -0,0 +1,101 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.ps.fonts; + +import java.io.IOException; + +import org.apache.xmlgraphics.ps.PSGenerator; +import org.apache.xmlgraphics.util.io.ASCIIHexOutputStream; + +/** + * This is a wrapper for {@link PSGenerator} that contains some members specific for streaming + * TrueType fonts to a PostScript document. + */ +public class PSTTFGenerator { + private PSGenerator gen; + private ASCIIHexOutputStream hexOut; + + /** + * The buffer is used to store the font file in an array of hex-encoded strings. Strings are + * limited to 65535 characters, string will start with a newline, 2 characters are needed to + * hex-encode each byte. + */ + public static final int MAX_BUFFER_SIZE = 32764; + + /** + * Creates a new instance wrapping the given generator. + * @param gen the PSGenerator to wrap + */ + public PSTTFGenerator(PSGenerator gen) { + this.gen = gen; + hexOut = new ASCIIHexOutputStream(gen.getOutputStream()); + } + + /** + * Writes the '<' character that starts a string. + */ + public void startString() throws IOException { + // We need to reset the streamer so that it starts a new line in the PS document + hexOut = new ASCIIHexOutputStream(gen.getOutputStream()); + gen.writeln("<"); + } + + /** + * Writes the given string to the output. + * @param cmd a string + */ + public void write(String cmd) throws IOException { + gen.write(cmd); + } + + /** + * Writes the given string to the output, followed by a newline. + * @param cmd a string + */ + public void writeln(String cmd) throws IOException { + gen.writeln(cmd); + } + + /** + * Writes bytes from the given byte array to the output. + * + * @param byteArray byte[] a byte array + * @param offset the position in the byte array where the streaming must start + * @param length the number of bytes to stream. This MUST be less than + * {@link #MAX_BUFFER_SIZE} - 1 since strings are suffixed by '00' (see Section 4.2 of + * Adobe Technical Note #5012, The Type 42 Font Format Specification.). + */ + public void streamBytes(byte[] byteArray, int offset, int length) throws IOException { + if (length > MAX_BUFFER_SIZE) { + throw new UnsupportedOperationException("Attempting to write a string to a PostScript" + + " file that is greater than the buffer size."); + } + hexOut.write(byteArray, offset, length); + } + + /** + * Finishes writing a string by appending '00' and '>' to the end. + */ + public void endString() throws IOException { + /* Appends a '00' to the end of the string as specified in the spec */ + gen.write("00\n> "); + } + +} diff --git a/src/java/org/apache/fop/render/ps/fonts/PSTTFGlyphOutputStream.java b/src/java/org/apache/fop/render/ps/fonts/PSTTFGlyphOutputStream.java new file mode 100644 index 000000000..cc2ae3e82 --- /dev/null +++ b/src/java/org/apache/fop/render/ps/fonts/PSTTFGlyphOutputStream.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.ps.fonts; + +import java.io.IOException; + +import org.apache.fop.fonts.truetype.TTFGlyphOutputStream; + +/** + * Streams glyphs in accordance with the constraints of the PostScript file format. + * Mainly, PostScript strings have a limited capacity and the font data may have to be + * broken down into several strings; however, this must occur at well-defined places like + * table or glyph boundaries. See also Adobe Technical Note #5012, The Type 42 Font + * Format Specification. + */ +public class PSTTFGlyphOutputStream implements TTFGlyphOutputStream { + + /** Total number of bytes written so far. */ + private int byteCounter; + + private int lastStringBoundary; + + private PSTTFGenerator ttfGen; + + /** + * Constructor + * @param ttfGen PSTTFGenerator + */ + public PSTTFGlyphOutputStream(PSTTFGenerator ttfGen) { + this.ttfGen = ttfGen; + } + + public void startGlyphStream() throws IOException { + ttfGen.startString(); + } + + public void streamGlyph(byte[] glyphData, int offset, int size) throws IOException { + if (size > PSTTFGenerator.MAX_BUFFER_SIZE) { + throw new UnsupportedOperationException("The glyph is " + size + + " bytes. There may be an error in the font file."); + } + + if (size + (byteCounter - lastStringBoundary) < PSTTFGenerator.MAX_BUFFER_SIZE) { + ttfGen.streamBytes(glyphData, offset, size); + } else { + ttfGen.endString(); + lastStringBoundary = byteCounter; + ttfGen.startString(); + ttfGen.streamBytes(glyphData, offset, size); + } + byteCounter += size; + } + + public void endGlyphStream() throws IOException { + ttfGen.endString(); + } + +} diff --git a/src/java/org/apache/fop/render/ps/fonts/PSTTFOutputStream.java b/src/java/org/apache/fop/render/ps/fonts/PSTTFOutputStream.java new file mode 100644 index 000000000..271d87d1b --- /dev/null +++ b/src/java/org/apache/fop/render/ps/fonts/PSTTFOutputStream.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.ps.fonts; + +import java.io.IOException; + +import org.apache.xmlgraphics.ps.PSGenerator; + +import org.apache.fop.fonts.truetype.TTFGlyphOutputStream; +import org.apache.fop.fonts.truetype.TTFOutputStream; +import org.apache.fop.fonts.truetype.TTFTableOutputStream; + +/** + * Streams a TrueType font according to the PostScript format. + */ +public class PSTTFOutputStream implements TTFOutputStream { + + private final PSTTFGenerator ttfGen; + + /** + * Creates a new instance wrapping the given generator. + * + * @param gen the generator to wrap + */ + public PSTTFOutputStream(PSGenerator gen) { + this.ttfGen = new PSTTFGenerator(gen); + } + + public void startFontStream() throws IOException { + ttfGen.write("/sfnts["); + } + + public TTFTableOutputStream getTableOutputStream() { + return new PSTTFTableOutputStream(ttfGen); + } + + public TTFGlyphOutputStream getGlyphOutputStream() { + return new PSTTFGlyphOutputStream(ttfGen); + } + + public void endFontStream() throws IOException { + ttfGen.writeln("] def"); + } + +} diff --git a/src/java/org/apache/fop/render/ps/fonts/PSTTFTableOutputStream.java b/src/java/org/apache/fop/render/ps/fonts/PSTTFTableOutputStream.java new file mode 100644 index 000000000..2226e11e8 --- /dev/null +++ b/src/java/org/apache/fop/render/ps/fonts/PSTTFTableOutputStream.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.ps.fonts; + +import java.io.IOException; + +import org.apache.fop.fonts.truetype.TTFTableOutputStream; + +/** + * Streams a TrueType table according to the PostScript format. + */ +public class PSTTFTableOutputStream implements TTFTableOutputStream { + + private PSTTFGenerator ttfGen; + + /** + * Constructor. + * @param ttfGen the helper object to stream TrueType data + */ + public PSTTFTableOutputStream(PSTTFGenerator ttfGen) { + this.ttfGen = ttfGen; + } + + public void streamTable(byte[] ttfData, int offset, int size) throws IOException { + int offsetPosition = offset; + // Need to split the table into MAX_BUFFER_SIZE chunks + for (int i = 0; i < size / PSTTFGenerator.MAX_BUFFER_SIZE; i++) { + streamString(ttfData, offsetPosition, PSTTFGenerator.MAX_BUFFER_SIZE); + offsetPosition += PSTTFGenerator.MAX_BUFFER_SIZE; + } + if (size % PSTTFGenerator.MAX_BUFFER_SIZE > 0) { + streamString(ttfData, offsetPosition, size % PSTTFGenerator.MAX_BUFFER_SIZE); + } + } + + private void streamString(byte[] byteArray, int offset, int length) throws IOException { + ttfGen.startString(); + ttfGen.streamBytes(byteArray, offset, length); + ttfGen.endString(); + } + +} diff --git a/src/java/org/apache/fop/render/txt/TxtRendererConfig.java b/src/java/org/apache/fop/render/txt/TxtRendererConfig.java index 7b0045664..f597ee518 100644 --- a/src/java/org/apache/fop/render/txt/TxtRendererConfig.java +++ b/src/java/org/apache/fop/render/txt/TxtRendererConfig.java @@ -36,13 +36,13 @@ import org.apache.fop.render.RendererConfigOption; */ public final class TxtRendererConfig implements RendererConfig { - public enum TxtRendererConfigOption implements RendererConfigOption { + public enum TxtRendererOption implements RendererConfigOption { ENCODING("encoding", "UTF-8"); private final String name; private final Object defaultValue; - private TxtRendererConfigOption(String name, Object defaultValue) { + private TxtRendererOption(String name, Object defaultValue) { this.name = name; this.defaultValue = defaultValue; } @@ -56,8 +56,8 @@ public final class TxtRendererConfig implements RendererConfig { } } - private final EnumMap params - = new EnumMap(TxtRendererConfigOption.class); + private final EnumMap params + = new EnumMap(TxtRendererOption.class); private final DefaultFontConfig fontConfig; @@ -70,7 +70,7 @@ public final class TxtRendererConfig implements RendererConfig { } public String getEncoding() { - return (String) params.get(TxtRendererConfigOption.ENCODING); + return (String) params.get(TxtRendererOption.ENCODING); } /** @@ -83,7 +83,7 @@ public final class TxtRendererConfig implements RendererConfig { TxtRendererConfig config = new TxtRendererConfig(new DefaultFontConfigParser().parse(cfg, userAgent.validateStrictly())); if (cfg != null) { - TxtRendererConfigOption option = TxtRendererConfigOption.ENCODING; + TxtRendererOption option = TxtRendererOption.ENCODING; String value = cfg.getChild(option.getName(), true).getValue(null); config.params.put(option, value != null ? value : option.getDefaultValue()); } diff --git a/src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java b/src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java index e5eba3ea2..d413e3274 100644 --- a/src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java +++ b/src/java/org/apache/fop/svg/PDFDocumentGraphics2DConfigurator.java @@ -61,7 +61,7 @@ public class PDFDocumentGraphics2DConfigurator { try { //Filter map PDFRendererConfig pdfConfig = new PDFRendererConfigParser().build(null, cfg); - pdfDoc.setFilterMap(pdfConfig.getFilterMap()); + pdfDoc.setFilterMap(pdfConfig.getConfigOptions().getFilterMap()); } catch (FOPException e) { throw new RuntimeException(e); } -- cgit v1.2.3