From 30db82b9df3fa0af8d2be9336ee72a92b419c703 Mon Sep 17 00:00:00 2001 From: Ben McCann Date: Fri, 25 Sep 2015 18:30:47 -0700 Subject: [PATCH] Create a PDTransparencyGroup for added code clarity --- .../pdfbox/contentstream/PDFStreamEngine.java | 3 +- .../contentstream/operator/DrawObject.java | 7 ++- .../operator/graphics/DrawObject.java | 16 ++--- .../pdfbox/pdmodel/graphics/PDXObject.java | 7 +++ .../graphics/form/PDTransparencyGroup.java | 59 +++++++++++++++++++ .../pdmodel/graphics/state/PDSoftMask.java | 6 +- .../apache/pdfbox/rendering/PageDrawer.java | 3 +- 7 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDTransparencyGroup.java diff --git a/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java b/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java index 7cd5682f712..1e47cffb5ff 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java @@ -51,6 +51,7 @@ import org.apache.pdfbox.pdmodel.graphics.color.PDColor; import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.pdmodel.graphics.form.PDTransparencyGroup; import org.apache.pdfbox.pdmodel.graphics.pattern.PDTilingPattern; import org.apache.pdfbox.pdmodel.graphics.state.PDGraphicsState; import org.apache.pdfbox.pdmodel.graphics.state.PDTextState; @@ -156,7 +157,7 @@ public void processPage(PDPage page) throws IOException * @param form transparency group (form) XObject * @throws IOException if the transparency group cannot be processed */ - public void showTransparencyGroup(PDFormXObject form) throws IOException + public void showTransparencyGroup(PDTransparencyGroup form) throws IOException { processTransparencyGroup(form); } diff --git a/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java b/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java index a4b454900a7..aeb7a9b7a9f 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/DrawObject.java @@ -20,6 +20,7 @@ import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.pdmodel.graphics.form.PDTransparencyGroup; import org.apache.pdfbox.text.PDFMarkedContentExtractor; import java.io.IOException; @@ -52,7 +53,11 @@ public void process(Operator operator, List arguments) throws IOExcepti ((PDFMarkedContentExtractor) context).xobject(xobject); } - if(xobject instanceof PDFormXObject) + if (xobject instanceof PDTransparencyGroup) + { + context.showTransparencyGroup((PDTransparencyGroup)xobject); + } + else if(xobject instanceof PDFormXObject) { PDFormXObject form = (PDFormXObject)xobject; context.showForm(form); diff --git a/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java b/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java index d4bc4958de5..88bacb65e72 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/contentstream/operator/graphics/DrawObject.java @@ -24,6 +24,7 @@ import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.MissingResourceException; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.pdmodel.graphics.form.PDTransparencyGroup; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.apache.pdfbox.contentstream.operator.Operator; @@ -60,18 +61,13 @@ else if (xobject instanceof PDImageXObject) PDImageXObject image = (PDImageXObject)xobject; context.drawImage(image); } + else if (xobject instanceof PDTransparencyGroup) + { + getContext().showTransparencyGroup((PDTransparencyGroup)xobject); + } else if (xobject instanceof PDFormXObject) { - PDFormXObject form = (PDFormXObject) xobject; - if (form.getGroup() != null && - COSName.TRANSPARENCY.equals(form.getGroup().getSubType())) - { - getContext().showTransparencyGroup(form); - } - else - { - getContext().showForm(form); - } + getContext().showForm((PDFormXObject)xobject); } } diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java index 50c85a61282..5f343edc810 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java @@ -17,6 +17,7 @@ package org.apache.pdfbox.pdmodel.graphics; import org.apache.pdfbox.cos.COSBase; +import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.pdmodel.PDDocument; @@ -25,6 +26,7 @@ import org.apache.pdfbox.pdmodel.common.COSObjectable; import org.apache.pdfbox.pdmodel.common.PDStream; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.pdmodel.graphics.form.PDTransparencyGroup; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import java.io.IOException; @@ -69,6 +71,11 @@ public static PDXObject createXObject(COSBase base, PDResources resources) throw else if (COSName.FORM.getName().equals(subtype)) { ResourceCache cache = resources != null ? resources.getResourceCache() : null; + COSDictionary group = (COSDictionary)stream.getDictionaryObject(COSName.GROUP); + if (group != null && COSName.TRANSPARENCY.equals(group.getCOSName(COSName.S))) + { + return new PDTransparencyGroup(stream, cache); + } return new PDFormXObject(stream, cache); } else if (COSName.PS.getName().equals(subtype)) diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDTransparencyGroup.java b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDTransparencyGroup.java new file mode 100644 index 00000000000..89eca5f6d69 --- /dev/null +++ b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDTransparencyGroup.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. + */ + +package org.apache.pdfbox.pdmodel.graphics.form; + +import org.apache.pdfbox.cos.COSStream; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.ResourceCache; +import org.apache.pdfbox.pdmodel.common.PDStream; + +/** + * A transparency group. + * + * @author John Hewson + */ +public class PDTransparencyGroup extends PDFormXObject +{ + /** + * Creates a Transparency Group for reading. + * @param stream The XObject stream + */ + public PDTransparencyGroup(PDStream stream) + { + super(stream); + } + + /** + * Creates a Transparency Group for reading. + * @param stream The XObject stream + */ + public PDTransparencyGroup(COSStream stream, ResourceCache cache) + { + super(stream, cache); + } + + /** + * Creates a Transparency Group for writing, in the given document. + * @param document The current document + */ + public PDTransparencyGroup(PDDocument document) + { + super(document); + // todo: set mandatory fields + } +} diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java index ce5ba27606a..754cdb78554 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDSoftMask.java @@ -28,6 +28,7 @@ import org.apache.pdfbox.pdmodel.common.function.PDFunction; import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.pdmodel.graphics.form.PDTransparencyGroup; /** * Soft mask. @@ -70,7 +71,7 @@ else if (dictionary instanceof COSDictionary) private final COSDictionary dictionary; private COSName subType = null; - private PDFormXObject group = null; + private PDTransparencyGroup group = null; private COSArray backdropColor = null; private PDFunction transferFunction = null; @@ -114,8 +115,7 @@ public PDFormXObject getGroup() throws IOException COSBase cosGroup = getCOSObject().getDictionaryObject(COSName.G); if (cosGroup != null) { - group = (PDFormXObject) PDXObject - .createXObject(cosGroup, null); + group = (PDTransparencyGroup) PDXObject.createXObject(cosGroup, null); } } return group; diff --git a/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java b/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java index a259a743036..a574b756334 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java @@ -54,6 +54,7 @@ import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace; import org.apache.pdfbox.pdmodel.graphics.color.PDPattern; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; +import org.apache.pdfbox.pdmodel.graphics.form.PDTransparencyGroup; import org.apache.pdfbox.pdmodel.graphics.image.PDImage; import org.apache.pdfbox.pdmodel.graphics.pattern.PDAbstractPattern; import org.apache.pdfbox.pdmodel.graphics.pattern.PDShadingPattern; @@ -844,7 +845,7 @@ public void showAnnotation(PDAnnotation annotation) throws IOException } @Override - public void showTransparencyGroup(PDFormXObject form) throws IOException + public void showTransparencyGroup(PDTransparencyGroup form) throws IOException { TransparencyGroup group = new TransparencyGroup(form, false);