123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- /*
- * 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.pdf;
-
- // Java
- import java.awt.geom.AffineTransform;
- import java.awt.geom.Rectangle2D;
- import java.io.IOException;
- import java.io.OutputStream;
-
- /**
- * PDF Form XObject
- *
- * A derivative of the PDFXObject, is a PDF Stream that has not only a
- * dictionary but a stream of image data.
- */
- public class PDFFormXObject extends PDFXObject {
-
- private PDFStream contents;
-
- /**
- * create a FormXObject with the given number and name and load the
- * image in the object
- *
- * @param xnumber the pdf object X number
- * @param contents the form's contents
- * @param resources the resource PDF reference
- */
- public PDFFormXObject(int xnumber, PDFStream contents, PDFReference resources) {
- super(contents.getDictionary());
- put("Name", new PDFName("Form" + xnumber));
- this.contents = contents;
-
- put("Type", new PDFName("XObject"));
- put("Subtype", new PDFName("Form"));
- put("FormType", 1);
- setMatrix(new AffineTransform());
- if (resources != null) {
- put("Resources", resources);
- }
- }
-
- /**
- * Sets the bounding box of the Form XObject.
- * @param bbox the bounding box
- */
- public void setBBox(Rectangle2D bbox) {
- PDFArray array = (PDFArray)get("BBox");
- if (array == null) {
- array = new PDFArray(this);
- array.add(bbox.getX());
- array.add(bbox.getY());
- array.add(bbox.getWidth());
- array.add(bbox.getHeight());
- put("BBox", array);
- } else {
- array.set(0, bbox.getX());
- array.set(1, bbox.getY());
- array.set(2, bbox.getWidth());
- array.set(3, bbox.getHeight());
- }
- }
-
- /**
- * Returns the bounding box.
- * @return the BBox value
- */
- public Rectangle2D getBBox() {
- PDFArray array = (PDFArray)get("BBox");
- if (array != null) {
- Rectangle2D rect = new Rectangle2D.Double();
- double x = ((Number)array.get(0)).doubleValue();
- double y = ((Number)array.get(1)).doubleValue();
- double w = ((Number)array.get(2)).doubleValue();
- double h = ((Number)array.get(3)).doubleValue();
- rect.setFrame(x, y, w, h);
- return rect;
- } else {
- return null;
- }
- }
-
- /**
- * Sets the Matrix value
- * @param at the AffineTransform defining the transformation matrix
- */
- public void setMatrix(AffineTransform at) {
- PDFArray array = (PDFArray)get("Matrix");
- double[] m = new double[6];
- at.getMatrix(m);
- if (array == null) {
- array = new PDFArray(this);
- array.add(m[0]);
- array.add(m[1]);
- array.add(m[2]);
- array.add(m[3]);
- array.add(m[4]);
- array.add(m[5]);
- put("Matrix", array);
- } else {
- array.set(0, m[0]);
- array.set(1, m[1]);
- array.set(2, m[2]);
- array.set(3, m[3]);
- array.set(4, m[4]);
- array.set(5, m[5]);
- }
- }
-
- /**
- * Returns the Matrix value.
- * @return the Matrix
- */
- public AffineTransform getMatrix() {
- PDFArray array = (PDFArray)get("Matrix");
- if (array != null) {
- AffineTransform at = new AffineTransform();
- double m00 = ((Number)array.get(0)).doubleValue();
- double m10 = ((Number)array.get(1)).doubleValue();
- double m01 = ((Number)array.get(2)).doubleValue();
- double m11 = ((Number)array.get(3)).doubleValue();
- double m02 = ((Number)array.get(4)).doubleValue();
- double m12 = ((Number)array.get(5)).doubleValue();
- at.setTransform(m00, m10, m01, m11, m02, m12);
- return at;
- } else {
- return null;
- }
- }
-
- /**
- * Used to set the contents of the PDF stream.
- * @param data the contents as a byte array
- * @throws IOException in case of an I/O problem
- */
- public void setData(byte[] data) throws IOException {
- this.contents.setData(data);
- }
-
- /** {@inheritDoc} */
- protected void outputRawStreamData(OutputStream out) throws IOException {
- contents.outputRawStreamData(out);
- }
-
- /** {@inheritDoc} */
- public int output(OutputStream stream) throws IOException {
- final int len = super.output(stream);
-
- //Now that the data has been written, it can be discarded.
- this.contents = null;
- return len;
- }
-
- /** {@inheritDoc} */
- protected void populateStreamDict(Object lengthEntry) {
- if (get("Matrix") == null) {
- put("Matrix", new PDFArray(this, new int[] {1, 0, 0, 1, 0, 0}));
- }
- super.populateStreamDict(lengthEntry);
- }
-
- }
|