From 141722a7cd16bf481453de7dce21a2506dc8ca0b Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Sun, 7 May 2006 13:43:35 +0000 Subject: [PATCH] The default sRGB color profile provided by the Java class library is no longer embedded if it is encountered. This should reduce the PDF size considerably. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@404759 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/fop/render/pdf/FopPDFImage.java | 20 +++++- .../apache/fop/render/pdf/PDFRenderer.java | 19 +----- .../org/apache/fop/util/ColorProfileUtil.java | 67 +++++++++++++++++++ status.xml | 4 ++ 4 files changed, 91 insertions(+), 19 deletions(-) create mode 100644 src/java/org/apache/fop/util/ColorProfileUtil.java diff --git a/src/java/org/apache/fop/render/pdf/FopPDFImage.java b/src/java/org/apache/fop/render/pdf/FopPDFImage.java index 2ecdcbcec..eed46a218 100644 --- a/src/java/org/apache/fop/render/pdf/FopPDFImage.java +++ b/src/java/org/apache/fop/render/pdf/FopPDFImage.java @@ -17,6 +17,8 @@ /* $Id$ */ package org.apache.fop.render.pdf; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.fop.pdf.PDFConformanceException; import org.apache.fop.pdf.PDFFilterList; import org.apache.fop.pdf.PDFImage; @@ -29,6 +31,7 @@ import org.apache.fop.pdf.CCFFilter; import org.apache.fop.pdf.PDFColorSpace; import org.apache.fop.pdf.PDFXObject; import org.apache.fop.pdf.BitmapImage; +import org.apache.fop.util.ColorProfileUtil; import org.apache.fop.image.FopImage; import org.apache.fop.image.EPSImage; @@ -44,6 +47,9 @@ import java.awt.color.ICC_Profile; */ public class FopPDFImage implements PDFImage { + /** logging instance */ + private static Log log = LogFactory.getLog(FopPDFImage.class); + private FopImage fopImage; private PDFICCStream pdfICCStream = null; private PDFFilter pdfFilter = null; @@ -114,8 +120,18 @@ public class FopPDFImage implements PDFImage { ICC_Profile prof = fopImage.getICCProfile(); PDFColorSpace pdfCS = toPDFColorSpace(fopImage.getColorSpace()); if (prof != null) { - pdfICCStream = doc.getFactory().makePDFICCStream(); - pdfICCStream.setColorSpace(prof, pdfCS); + boolean defaultsRGB = ColorProfileUtil.isDefaultsRGB(prof); + if (log.isDebugEnabled()) { + String desc = ColorProfileUtil.getICCProfileDescription(prof); + log.debug("Image returns ICC profile: " + desc + ", default sRGB=" + defaultsRGB); + } + //TODO Instead of skipping the ICC profile for sRGB, let's think about embedding our + //own sRGB profile instead, but if possible only once per PDF (Need a new structure in + //the PDF library for that). + if (!defaultsRGB) { + pdfICCStream = doc.getFactory().makePDFICCStream(); + pdfICCStream.setColorSpace(prof, pdfCS); + } } //Handle transparency mask if applicable if (fopImage.hasSoftMask()) { diff --git a/src/java/org/apache/fop/render/pdf/PDFRenderer.java b/src/java/org/apache/fop/render/pdf/PDFRenderer.java index fbc7049ca..86dbea064 100644 --- a/src/java/org/apache/fop/render/pdf/PDFRenderer.java +++ b/src/java/org/apache/fop/render/pdf/PDFRenderer.java @@ -90,6 +90,7 @@ import org.apache.fop.render.AbstractPathOrientedRenderer; import org.apache.fop.render.Graphics2DAdapter; import org.apache.fop.render.RendererContext; import org.apache.fop.util.CharUtilities; +import org.apache.fop.util.ColorProfileUtil; import org.apache.fop.fo.Constants; import org.apache.fop.fo.extensions.ExtensionAttachment; import org.apache.fop.fo.extensions.xmp.XMPMetadata; @@ -387,7 +388,7 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { //Fallback: Use the sRGB profile from the JRE (about 140KB) profile = ICC_Profile.getInstance(ColorSpace.CS_sRGB); } - String desc = getICCProfileDescription(profile); + String desc = ColorProfileUtil.getICCProfileDescription(profile); icc.setColorSpace(profile, null); outputIntent.setDestOutputProfile(icc); @@ -396,22 +397,6 @@ public class PDFRenderer extends AbstractPathOrientedRenderer { pdfDoc.getRoot().addOutputIntent(outputIntent); } - private String getICCProfileDescription(ICC_Profile profile) { - byte[] data = profile.getData(ICC_Profile.icSigProfileDescriptionTag); - if (data == null) { - return null; - } else { - //Info on the data format: http://www.color.org/ICC-1_1998-09.PDF - int length = (data[8] << 3 * 8) | (data[9] << 2 * 8) | (data[10] << 8) | data[11]; - length--; //Remove trailing NUL character - try { - return new String(data, 12, length, "US-ASCII"); - } catch (UnsupportedEncodingException e) { - throw new UnsupportedOperationException("Incompatible VM"); - } - } - } - /** * @see org.apache.fop.render.Renderer#stopRenderer() */ diff --git a/src/java/org/apache/fop/util/ColorProfileUtil.java b/src/java/org/apache/fop/util/ColorProfileUtil.java new file mode 100644 index 000000000..8c0e7794f --- /dev/null +++ b/src/java/org/apache/fop/util/ColorProfileUtil.java @@ -0,0 +1,67 @@ +/* + * Copyright 2006 The Apache Software Foundation. + * + * Licensed 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.util; + +import java.awt.color.ColorSpace; +import java.awt.color.ICC_ColorSpace; +import java.awt.color.ICC_Profile; +import java.io.UnsupportedEncodingException; + +/** + * Helper methods for handling color profiles. + */ +public class ColorProfileUtil { + + /** + * Returns the profile description of an ICC profile + * @param profile the profile + * @return the description + */ + public static String getICCProfileDescription(ICC_Profile profile) { + byte[] data = profile.getData(ICC_Profile.icSigProfileDescriptionTag); + if (data == null) { + return null; + } else { + //Info on the data format: http://www.color.org/ICC-1_1998-09.PDF + int length = (data[8] << 3 * 8) | (data[9] << 2 * 8) | (data[10] << 8) | data[11]; + length--; //Remove trailing NUL character + try { + return new String(data, 12, length, "US-ASCII"); + } catch (UnsupportedEncodingException e) { + throw new UnsupportedOperationException("Incompatible VM"); + } + } + } + + /** + * Indicates whether a given color profile is identical to the default sRGB profile + * provided by the Java class library. + * @param profile the color profile to check + * @return true if it is the default sRGB profile + */ + public static boolean isDefaultsRGB(ICC_Profile profile) { + ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB); + ICC_Profile sRGBProfile = null; + if (sRGB instanceof ICC_ColorSpace) { + sRGBProfile = ((ICC_ColorSpace)sRGB).getProfile(); + } + return profile == sRGBProfile; + } + +} diff --git a/status.xml b/status.xml index f27e30a18..c2f835f65 100644 --- a/status.xml +++ b/status.xml @@ -27,6 +27,10 @@ + + The default sRGB color profile provided by the Java class library is no longer + embedded if it is encountered. This should reduce the PDF size considerably. + Bugfix: Sections with span="all" lead to overlapping text if spanning multiple pages. -- 2.39.5