123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- /*
- * 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.pcl;
-
- import java.awt.Dimension;
- import java.awt.Rectangle;
- import java.util.List;
-
- import org.apache.xmlgraphics.util.UnitConv;
-
- /**
- * This class represents a page format with PCL-specific properties.
- */
- public class PCLPageDefinition {
-
- private static List pageDefinitions;
- private static PCLPageDefinition defaultPageDefinition;
-
- private final String name;
- private final int selector;
- private final Dimension physicalPageSize;
- private final Rectangle logicalPageRect;
- private final boolean landscape;
-
- static {
- createPageDefinitions();
- }
-
- /**
- * Main constructor
- * @param name the name of the page definition
- * @param selector the selector used by the <ESC> command (page size)
- * @param physicalPageSize the physical page size
- * @param logicalPageRect the rectangle defining the logical page
- * @param landscape true if it is a landscape format
- */
- public PCLPageDefinition(String name, int selector, Dimension physicalPageSize,
- Rectangle logicalPageRect, boolean landscape) {
- this.name = name;
- this.selector = selector;
- this.physicalPageSize = physicalPageSize;
- this.logicalPageRect = logicalPageRect;
- this.landscape = landscape;
- }
-
- /** @return the name of the page definition */
- public String getName() {
- return this.name;
- }
-
- /** @return the selector used by the <ESC> command (page size) */
- public int getSelector() {
- return this.selector;
- }
-
- /** @return true if it is a landscape format */
- public boolean isLandscapeFormat() {
- return this.landscape;
- }
-
- /** @return the physical page size */
- public Dimension getPhysicalPageSize() {
- return this.physicalPageSize;
- }
-
- /** @return the rectangle defining the logical page */
- public Rectangle getLogicalPageRect() {
- return this.logicalPageRect;
- }
-
- private boolean matches(long width, long height, int errorMargin) {
- return (Math.abs(this.physicalPageSize.width - width) < errorMargin)
- && (Math.abs(this.physicalPageSize.height - height) < errorMargin);
- }
-
- /** {@inheritDoc} */
- public String toString() {
- return getName();
- }
-
- /**
- * Tries to determine a matching page definition.
- * @param width the physical page width (in mpt)
- * @param height the physical page height (in mpt)
- * @param errorMargin the error margin for detecting the right page definition
- * @return the page definition or null if no match was found
- */
- public static PCLPageDefinition getPageDefinition(long width, long height, int errorMargin) {
- for (Object pageDefinition : pageDefinitions) {
- PCLPageDefinition def = (PCLPageDefinition) pageDefinition;
- if (def.matches(width, height, errorMargin)) {
- return def;
- }
- }
- return null;
- }
-
- /**
- * Returns a page definition based on a page format.
- * @param name the name of the page format (ex. "A4" or "Letter")
- * @return the page definition or null if no match was found
- */
- public static PCLPageDefinition getPageDefinition(String name) {
- for (Object pageDefinition : pageDefinitions) {
- PCLPageDefinition def = (PCLPageDefinition) pageDefinition;
- if (def.getName().equalsIgnoreCase(name)) {
- return def;
- }
- }
- return null;
- }
-
- /** @return the default page definition (letter) */
- public static PCLPageDefinition getDefaultPageDefinition() {
- return defaultPageDefinition;
- }
-
- /**
- * Converts an offset values for logical pages to millipoints. The values are given as pixels
- * in a 300dpi environment.
- * @param offset the offset as given in the PCL 5 specification (under "Printable Area")
- * @return the converted value in millipoints
- */
- private static int convert300dpiDotsToMpt(int offset) {
- return (int)Math.round(((double)offset) * 72000 / 300);
- }
-
- private static Dimension createPhysicalPageSizeInch(float width, float height) {
- return new Dimension(
- (int)Math.round(UnitConv.in2mpt(width)),
- (int)Math.round(UnitConv.in2mpt(height)));
- }
-
- private static Dimension createPhysicalPageSizeMm(float width, float height) {
- return new Dimension(
- (int)Math.round(UnitConv.mm2mpt(width)),
- (int)Math.round(UnitConv.mm2mpt(height)));
- }
-
- private static Rectangle createLogicalPageRect(int x, int y, int width, int height) {
- return new Rectangle(convert300dpiDotsToMpt(x), convert300dpiDotsToMpt(y),
- convert300dpiDotsToMpt(width), convert300dpiDotsToMpt(height));
- }
-
- private static void createPageDefinitions() {
- pageDefinitions = new java.util.ArrayList();
- pageDefinitions.add(new PCLPageDefinition("Letter", 2,
- createPhysicalPageSizeInch(8.5f, 11),
- createLogicalPageRect(75, 0, 2400, 3300), false));
- defaultPageDefinition = new PCLPageDefinition("Legal", 3,
- createPhysicalPageSizeInch(8.5f, 14),
- createLogicalPageRect(75, 0, 2400, 4200), false);
- pageDefinitions.add(defaultPageDefinition);
- pageDefinitions.add(new PCLPageDefinition("Executive", 1,
- createPhysicalPageSizeInch(7.25f, 10.5f),
- createLogicalPageRect(75, 0, 2025, 3150), false));
- pageDefinitions.add(new PCLPageDefinition("Ledger", 6,
- createPhysicalPageSizeInch(11, 17),
- createLogicalPageRect(75, 0, 3150, 5100), false));
- pageDefinitions.add(new PCLPageDefinition("A5", 25,
- createPhysicalPageSizeMm(148, 210),
- createLogicalPageRect(71, 0, 1745, 2480), false));
- pageDefinitions.add(new PCLPageDefinition("A4", 26,
- createPhysicalPageSizeMm(210, 297),
- createLogicalPageRect(71, 0, 2338, 3507), false));
- pageDefinitions.add(new PCLPageDefinition("A3", 27,
- createPhysicalPageSizeMm(297, 420),
- createLogicalPageRect(71, 0, 3365, 4960), false));
-
- //TODO Add envelope definitions
-
- pageDefinitions.add(new PCLPageDefinition("LetterL", 2,
- createPhysicalPageSizeInch(11, 8.5f),
- createLogicalPageRect(60, 0, 3180, 2550), true));
- pageDefinitions.add(new PCLPageDefinition("LegalL", 3,
- createPhysicalPageSizeInch(14, 8.5f),
- createLogicalPageRect(60, 0, 4080, 2550), true));
- pageDefinitions.add(new PCLPageDefinition("ExecutiveL", 1,
- createPhysicalPageSizeInch(10.5f, 7.25f),
- createLogicalPageRect(60, 0, 3030, 2175), true));
- pageDefinitions.add(new PCLPageDefinition("LedgerL", 6,
- createPhysicalPageSizeInch(17, 11),
- createLogicalPageRect(60, 0, 4980, 3300), true));
- pageDefinitions.add(new PCLPageDefinition("A5L", 25,
- createPhysicalPageSizeMm(210, 148),
- createLogicalPageRect(59, 0, 2362, 1747), true));
- pageDefinitions.add(new PCLPageDefinition("A4L", 26,
- createPhysicalPageSizeMm(297, 210),
- createLogicalPageRect(59, 0, 3389, 2480), true));
- pageDefinitions.add(new PCLPageDefinition("A3L", 27,
- createPhysicalPageSizeMm(420, 297),
- createLogicalPageRect(59, 0, 4842, 3507), true));
- }
-
- }
|