aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/org/apache/fop/render/pdf/PDFRendererConfig.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/org/apache/fop/render/pdf/PDFRendererConfig.java')
-rw-r--r--src/java/org/apache/fop/render/pdf/PDFRendererConfig.java227
1 files changed, 227 insertions, 0 deletions
diff --git a/src/java/org/apache/fop/render/pdf/PDFRendererConfig.java b/src/java/org/apache/fop/render/pdf/PDFRendererConfig.java
new file mode 100644
index 000000000..049345609
--- /dev/null
+++ b/src/java/org/apache/fop/render/pdf/PDFRendererConfig.java
@@ -0,0 +1,227 @@
+/*
+ * 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.util.ArrayList;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.commons.logging.Log;
+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.fonts.DefaultFontConfig;
+import org.apache.fop.fonts.DefaultFontConfig.DefaultFontConfigParser;
+import org.apache.fop.pdf.PDFEncryptionParams;
+import org.apache.fop.pdf.PDFFilterList;
+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.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.
+ */
+public final class PDFRendererConfig implements RendererConfig {
+
+ private static final Log LOG = LogFactory.getLog(PDFRendererConfig.class);
+
+ private final PDFRendererOptionsConfig configOption;
+
+ private final DefaultFontConfig fontConfig;
+
+ private PDFRendererConfig(DefaultFontConfig fontConfig, PDFRendererOptionsConfig config) {
+ this.fontConfig = fontConfig;
+ this.configOption = config;
+ }
+
+ public PDFRendererOptionsConfig getConfigOptions() {
+ return configOption;
+ }
+
+ public DefaultFontConfig getFontInfoConfig() {
+ return fontConfig;
+ }
+
+ /**
+ * The PDF renderer configuration data parser.
+ */
+ public static final class PDFRendererConfigParser implements RendererConfigParser {
+
+ public PDFRendererConfig build(FOUserAgent userAgent, Configuration cfg) throws FOPException {
+ boolean strict = userAgent != null ? userAgent.validateUserConfigStrictly() : false;
+ return new ParserHelper(cfg, userAgent, strict).pdfConfig;
+ }
+
+ public String getMimeType() {
+ return MimeConstants.MIME_PDF;
+ }
+ }
+
+ private static final class ParserHelper {
+
+ private final Map<PDFRendererOption, Object> configOptions
+ = new EnumMap<PDFRendererOption, Object>(PDFRendererOption.class);
+
+ private PDFEncryptionParams encryptionConfig;
+
+ private PDFRendererConfig pdfConfig;
+
+ private ParserHelper(Configuration cfg, FOUserAgent userAgent, boolean strict) throws FOPException {
+ 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(PDFRendererOption option, Object value) {
+ if (value != null && !value.equals(option.getDefaultValue())) {
+ configOptions.put(option, value);
+ }
+ }
+
+ private void configure(Configuration cfg, FOUserAgent userAgent, boolean strict) throws FOPException {
+ try {
+ buildFilterMapFromConfiguration(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);
+ }
+ }
+
+ 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<String, List<String>> filterMap = new HashMap<String, List<String>>();
+ for (Configuration filters : filterLists) {
+ String type = filters.getAttribute("type", PDFFilterList.DEFAULT_FILTER);
+ List<String> filterList = new ArrayList<String>();
+ for (Configuration nameCfg : filters.getChildren("value")) {
+ filterList.add(nameCfg.getValue());
+ }
+ if (!filterList.isEmpty() && LOG.isDebugEnabled()) {
+ StringBuffer debug = new StringBuffer("Adding PDF filter");
+ if (filterList.size() != 1) {
+ debug.append("s");
+ }
+ debug.append(" for type ").append(type).append(": ");
+ for (int j = 0; j < filterList.size(); j++) {
+ if (j != 0) {
+ debug.append(", ");
+ }
+ debug.append(filterList.get(j));
+ }
+ LogUtil.handleError(LOG, debug.toString(), true);
+ }
+
+ if (filterMap.get(type) != null) {
+ throw new ConfigurationException("A filterList of type '"
+ + type + "' has already been defined");
+ }
+ filterMap.put(type, filterList);
+ }
+ put(FILTER_LIST, filterMap);
+ }
+
+ private String parseConfig(Configuration cfg, RendererConfigOption option) {
+ Configuration child = cfg.getChild(option.getName());
+ return child.getValue(null);
+ }
+
+ private boolean doesValueExist(Configuration cfg, RendererConfigOption option) {
+ return cfg.getChild(option.getName(), false) != null;
+ }
+
+ private int checkEncryptionLength(int encryptionLength, FOUserAgent userAgent) {
+ int correctEncryptionLength = encryptionLength;
+ if (encryptionLength < 40) {
+ correctEncryptionLength = 40;
+ } else if (encryptionLength > 128) {
+ correctEncryptionLength = 128;
+ } else if (encryptionLength % 8 != 0) {
+ correctEncryptionLength = Math.round(encryptionLength / 8.0f) * 8;
+ }
+ if (correctEncryptionLength != encryptionLength && userAgent != null) {
+ PDFEventProducer.Provider.get(userAgent.getEventBroadcaster())
+ .incorrectEncryptionLength(this, encryptionLength,
+ correctEncryptionLength);
+ }
+ return correctEncryptionLength;
+ }
+ }
+
+}