/* * 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; import java.awt.geom.Rectangle2D; /** * Class representing a /Page object. * <p> * There is one of these for every page in a PDF document. The object * specifies the dimensions of the page and references a /Resources * object, a contents stream and the page's parent in the page * hierarchy. */ public class PDFPage extends PDFResourceContext { /** the page index (zero-based) */ protected int pageIndex; /** * Create a /Page object * * @param resources the /Resources object * @param pageIndex the page's zero-based index (or -1 if the page number is auto-determined) * @param mediaBox the MediaBox * @param cropBox the CropBox. If null, mediaBox is used. * @param bleedBox the BleedBox. If null, cropBox is used. * @param trimBox the TrimBox. If null, bleedBox is used. */ public PDFPage(PDFResources resources, int pageIndex, Rectangle2D mediaBox, Rectangle2D cropBox, Rectangle2D bleedBox, Rectangle2D trimBox) { /* generic creation of object */ super(resources); put("Type", new PDFName("Page")); /* set fields using parameters */ setSimplePageSize(mediaBox, cropBox, bleedBox, trimBox); this.pageIndex = pageIndex; } private void setSimplePageSize(Rectangle2D mediaBox, Rectangle2D cropBox, Rectangle2D bleedBox, Rectangle2D trimBox) { setMediaBox(mediaBox); if (cropBox == null) { cropBox = mediaBox; } setCropBox(cropBox); if (bleedBox == null) { bleedBox = cropBox; } setBleedBox(bleedBox); //Recommended by PDF/X if (trimBox == null) { trimBox = bleedBox; } setTrimBox(trimBox); //Needed for PDF/X } private PDFArray toPDFArray(Rectangle2D box) { return new PDFArray(this, new double[] { box.getX(), box.getY(), box.getMaxX(), box.getMaxY()}); } /** * Sets the "MediaBox" entry * @param box the media rectangle */ public void setMediaBox(Rectangle2D box) { put("MediaBox", toPDFArray(box)); } /** * Sets the "CropBox" entry * @param box the bleed rectangle */ public void setCropBox(Rectangle2D box) { put("CropBox", toPDFArray(box)); } /** * Sets the "BleedBox" entry * @param box the bleed rectangle */ public void setBleedBox(Rectangle2D box) { put("BleedBox", toPDFArray(box)); } /** * Sets the "TrimBox" entry * @param box the trim rectangle */ public void setTrimBox(Rectangle2D box) { put("TrimBox", toPDFArray(box)); } /** * set this page contents * * @param contents the contents of the page */ public void setContents(PDFReference contents) { if (contents != null) { put("Contents", contents); } } /** * set this page's parent * * @param parent the /Pages object that is this page's parent */ public void setParent(PDFPages parent) { put("Parent", new PDFReference(parent)); } /** * Set the transition dictionary and duration. * This sets the duration of the page and the transition * dictionary used when going to the next page. * * @param dur the duration in seconds * @param tr the transition dictionary */ public void setTransition(int dur, TransitionDictionary tr) { put("Dur", Integer.valueOf(dur)); put("Trans", tr); } /** * @return the page Index of this page (zero-based), -1 if it the page index should * automatically be determined. */ public int getPageIndex() { return this.pageIndex; } /** * Sets the "StructParents" value. * @param structParents the integer key of this object's entry in the structural parent tree. */ public void setStructParents(int structParents) { put("StructParents", structParents); //This is a PDF 1.5 feature. It is set as a work-around for a bug in Adobe Acrobat //which reports this missing even if the PDF file is PDF 1.4. setTabs(new PDFName("S")); } /** * Returns the value of the StructParents entry. * * @return the StructParents value, <code>null</code> if the entry has not been set */ public Integer getStructParents() { return (Integer) get("StructParents"); } /** * Specifies the tab order for annotations on a page. * @param value one of the allowed values (see PDF 1.5) * @since PDF 1.5 */ public void setTabs(PDFName value) { put("Tabs", value); } }