TigerZF
🌐Español

55.5. Dibujo

55.5.1. Geometría

PDF utiliza la misma geometría que PostScript. Comienza desde la esquina inferior izquierda de la página y, por defecto, se mide en puntos (1/72 de pulgada).

El tamaño de la página se puede obtener a partir de un objeto de página:

$width  = $pdfPage->getWidth();
$height = $pdfPage->getHeight();

55.5.2. Colores

PDF tiene unas capacidades muy potentes para la representación de colores. El módulo Zend_Pdf admite los espacios de color Gray Scale, RGB y CMYK. Cualquiera de ellos puede usarse en cualquier lugar donde se requiera un objeto Zend_Pdf_Color. Las clases Zend_Pdf_Color_GrayScale, Zend_Pdf_Color_Rgb y Zend_Pdf_Color_Cmyk proporcionan esta funcionalidad:

// $grayLevel (float number). 0.0 (black) - 1.0 (white)
$color1 = new Zend_Pdf_Color_GrayScale($grayLevel);

// $r, $g, $b (float numbers). 0.0 (min intensity) - 1.0 (max intensity)
$color2 = new Zend_Pdf_Color_Rgb($r, $g, $b);

// $c, $m, $y, $k (float numbers). 0.0 (min intensity) - 1.0 (max intensity)
$color3 = new Zend_Pdf_Color_Cmyk($c, $m, $y, $k);

Los colores de estilo HTML también se proporcionan con la clase Zend_Pdf_Color_Html:

$color1 = new Zend_Pdf_Color_Html('#3366FF');
$color2 = new Zend_Pdf_Color_Html('silver');
$color3 = new Zend_Pdf_Color_Html('forestgreen');

55.5.3. Dibujo de formas

Todas las operaciones de dibujo se pueden realizar en el contexto de una página PDF.

La clase Zend_Pdf_Page proporciona un conjunto de primitivas de dibujo:

/**
 * Draw a line from x1,y1 to x2,y2.
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @return Zend_Pdf_Page
 */
public function drawLine($x1, $y1, $x2, $y2);
/**
 * Draw a rectangle.
 *
 * Fill types:
 * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle
 *                                             and stroke (default)
 * Zend_Pdf_Page::SHAPE_DRAW_STROKE          - stroke rectangle
 * Zend_Pdf_Page::SHAPE_DRAW_FILL            - fill rectangle
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param integer $fillType
 * @return Zend_Pdf_Page
 */
public function drawRectangle($x1, $y1, $x2, $y2,
                    $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
/**
 * Draw a rounded rectangle.
 *
 * Fill types:
 * Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - fill rectangle
 *                                             and stroke (default)
 * Zend_Pdf_Page::SHAPE_DRAW_STROKE      - stroke rectangle
 * Zend_Pdf_Page::SHAPE_DRAW_FILL        - fill rectangle
 *
 * radius is an integer representing radius of the four corners, or an array
 * of four integers representing the radius starting at top left, going
 * clockwise
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param integer|array $radius
 * @param integer $fillType
 * @return Zend_Pdf_Page
 */
public function drawRoundedRectangle($x1, $y1, $x2, $y2, $radius,
                       $fillType = Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE);
/**
 * Draw a polygon.
 *
 * If $fillType is Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE or
 * Zend_Pdf_Page::SHAPE_DRAW_FILL, then polygon is automatically closed.
 * See detailed description of these methods in a PDF documentation
 * (section 4.4.2 Path painting Operators, Filling)
 *
 * @param array $x  - array of float (the X co-ordinates of the vertices)
 * @param array $y  - array of float (the Y co-ordinates of the vertices)
 * @param integer $fillType
 * @param integer $fillMethod
 * @return Zend_Pdf_Page
 */
public function drawPolygon($x, $y,
                            $fillType =
                                Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE,
                            $fillMethod =
                                Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
/**
 * Draw a circle centered on x, y with a radius of radius.
 *
 * Angles are specified in radians
 *
 * Method signatures:
 * drawCircle($x, $y, $radius);
 * drawCircle($x, $y, $radius, $fillType);
 * drawCircle($x, $y, $radius, $startAngle, $endAngle);
 * drawCircle($x, $y, $radius, $startAngle, $endAngle, $fillType);
 *
 *
 * It's not a really circle, because PDF supports only cubic Bezier
 * curves. But very good approximation.
 * It differs from a real circle on a maximum 0.00026 radiuses (at PI/8,
 * 3*PI/8, 5*PI/8, 7*PI/8, 9*PI/8, 11*PI/8, 13*PI/8 and 15*PI/8 angles).
 * At 0, PI/4, PI/2, 3*PI/4, PI, 5*PI/4, 3*PI/2 and 7*PI/4 it's exactly
 * a tangent to a circle.
 *
 * @param float $x
 * @param float $y
 * @param float $radius
 * @param mixed $param4
 * @param mixed $param5
 * @param mixed $param6
 * @return Zend_Pdf_Page
 */
public function  drawCircle($x,
                            $y,
                            $radius,
                            $param4 = null,
                            $param5 = null,
                            $param6 = null);
/**
 * Draw an ellipse inside the specified rectangle.
 *
 * Method signatures:
 * drawEllipse($x1, $y1, $x2, $y2);
 * drawEllipse($x1, $y1, $x2, $y2, $fillType);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle, $fillType);
 *
 * Angles are specified in radians
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param mixed $param5
 * @param mixed $param6
 * @param mixed $param7
 * @return Zend_Pdf_Page
 */
public function drawEllipse($x1,
                            $y1,
                            $x2,
                            $y2,
                            $param5 = null,
                            $param6 = null,
                            $param7 = null);

55.5.4. Dibujo de texto

Las operaciones de dibujo de texto también existen en el contexto de una página PDF. Puede dibujar una sola línea de texto en cualquier posición de la página proporcionando las coordenadas x e y de la línea base. Para las operaciones de dibujo de texto se utilizan la fuente actual, el tamaño de fuente y el color de relleno de la página (véase la descripción detallada más abajo).

/**
 * Draw a line of text at the specified position.
 *
 * @param string $text
 * @param float $x
 * @param float $y
 * @param string $charEncoding (optional) Character encoding of source
 *               text.Defaults to current locale.
 * @throws Zend_Pdf_Exception
 * @return Zend_Pdf_Page
 */
public function drawText($text, $x, $y, $charEncoding = '');

Ejemplo 55.8. Dibujar una cadena en la página

...
$pdfPage->drawText('Hello world!', 72, 720);
...

Ejemplo 55.9. Establecer el color de la fuente

...
$pdfPage->setFillColor(Zend_Pdf_Color_Html::color('#990000'))
        ->drawText('Hello world (in red)!', 72, 720);
....

Por defecto, las cadenas de texto se interpretan usando el método de codificación de caracteres del locale actual. Si tiene una cadena que usa un método de codificación diferente (como una cadena UTF-8 leída de un archivo en disco, o una cadena MacRoman obtenida de una base de datos heredada), puede indicar el método de codificación de caracteres en el momento de dibujar y Zend_Pdf se encargará de la conversión por usted. Puede proporcionar cadenas de origen en cualquier método de codificación admitido por la función iconv() de PHP:

Ejemplo 55.10. Dibujar una cadena codificada en UTF-8 en la página

...
// Read a UTF-8-encoded string from disk
$unicodeString = fread($fp, 1024);

// Draw the string on the page
$pdfPage->drawText($unicodeString, 72, 720, 'UTF-8');
...

55.5.5. Uso de fuentes

Zend_Pdf_Page::drawText() utiliza la fuente y el tamaño de fuente actuales de la página, que se establecen con el método Zend_Pdf_Page::setFont():

/**
 * Set current font.
 *
 * @param Zend_Pdf_Resource_Font $font
 * @param float $fontSize
 * @return Zend_Pdf_Page
 */
public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);

Los documentos PDF admiten fuentes PostScript Type 1 y TrueType, así como dos tipos especializados de PDF, Type 3 y fuentes compuestas. También hay 14 fuentes Type 1 estándar integradas en todo visor de PDF: Courier (4 estilos), Helvetica (4 estilos), Times (4 estilos), Symbol y Zapf Dingbats.

Zend_Pdf actualmente admite las 14 fuentes estándar de PDF, así como sus propias fuentes TrueType personalizadas. Los objetos de fuente se obtienen mediante uno de dos métodos de fábrica: Zend_Pdf_Font::fontWithName($fontName) para las 14 fuentes estándar de PDF o Zend_Pdf_Font::fontWithPath($filePath) para fuentes personalizadas.

Ejemplo 55.11. Crear una fuente estándar

...
// Create new font
$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);

// Apply font
$pdfPage->setFont($font, 36);
...

Las constantes para los nombres de las 14 fuentes estándar de PDF se definen en la clase Zend_Pdf_Font:

  • Zend_Pdf_Font::FONT_COURIER

  • Zend_Pdf_Font::FONT_COURIER_BOLD

  • Zend_Pdf_Font::FONT_COURIER_ITALIC

  • Zend_Pdf_Font::FONT_COURIER_BOLD_ITALIC

  • Zend_Pdf_Font::FONT_TIMES

  • Zend_Pdf_Font::FONT_TIMES_BOLD

  • Zend_Pdf_Font::FONT_TIMES_ITALIC

  • Zend_Pdf_Font::FONT_TIMES_BOLD_ITALIC

  • Zend_Pdf_Font::FONT_HELVETICA

  • Zend_Pdf_Font::FONT_HELVETICA_BOLD

  • Zend_Pdf_Font::FONT_HELVETICA_ITALIC

  • Zend_Pdf_Font::FONT_HELVETICA_BOLD_ITALIC

  • Zend_Pdf_Font::FONT_SYMBOL

  • Zend_Pdf_Font::FONT_ZAPFDINGBATS

También puede usar cualquier fuente TrueType individual (que normalmente tiene extensión '.ttf') o una fuente OpenType (extensión '.otf') si contiene contornos TrueType. Actualmente no se admiten, pero están previstos para una futura versión, los archivos Mac OS X .dfont y los archivos de colección TrueType de Microsoft (extensión '.ttc').

Para usar una fuente TrueType, debe proporcionar la ruta completa del archivo al programa de fuente. Si la fuente no se puede leer por algún motivo, o si no es una fuente TrueType, el método de fábrica lanzará una excepción:

Ejemplo 55.12. Crear una fuente TrueType

...
// Create new font
$goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF');

// Apply font
$pdfPage->setFont($goodDogCoolFont, 36);
...

Por defecto, las fuentes personalizadas se incrustarán en el documento PDF resultante. Esto permite a los destinatarios ver la página tal como se pretende, incluso si no tienen las fuentes adecuadas instaladas en su sistema. Si le preocupa el tamaño del archivo, puede solicitar que el programa de fuente no se incruste pasando una opción de "no incrustar" al método de fábrica:

Ejemplo 55.13. Crear una fuente TrueType, pero sin incrustarla en el documento PDF

...
// Create new font
$goodDogCoolFont = Zend_Pdf_Font::fontWithPath('/path/to/GOODDC__.TTF',
                                               Zend_Pdf_Font::EMBED_DONT_EMBED);

// Apply font
$pdfPage->setFont($goodDogCoolFont, 36);
...

Si el programa de fuente no se incrusta pero el destinatario del archivo PDF tiene la fuente instalada en su sistema, verá el documento tal como se pretende. Si no tiene la fuente correcta instalada, la aplicación visor de PDF hará lo posible por sintetizar un reemplazo.

Algunas fuentes tienen reglas de licencia muy específicas que impiden que se incrusten en documentos PDF. Para que esto no le tome desprevenido, si intenta usar una fuente que no se puede incrustar, el método de fábrica lanzará una excepción.

Aún puede usar estas fuentes, pero debe pasar el indicador de no incrustar como se describe arriba, o simplemente puede suprimir la excepción:

Ejemplo 55.14. No lanzar una excepción para fuentes que no se pueden incrustar

...
$font = Zend_Pdf_Font::fontWithPath(
           '/path/to/unEmbeddableFont.ttf',
           Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION
        );
...

Esta técnica de supresión es preferible si permite que un usuario final elija sus propias fuentes. Las fuentes que se pueden incrustar en el documento PDF lo serán; las que no, no lo serán.

Los programas de fuente pueden ser bastante grandes, algunos llegando a decenas de megabytes. Por defecto, todas las fuentes incrustadas se comprimen usando el esquema de compresión Flate, lo que resulta en un ahorro de espacio del 50% en promedio. Si, por algún motivo, no desea comprimir el programa de fuente, puede deshabilitarlo con una opción:

Ejemplo 55.15. No comprimir una fuente incrustada

...
$font = Zend_Pdf_Font::fontWithPath('/path/to/someReallyBigFont.ttf',
                                    Zend_Pdf_Font::EMBED_DONT_COMPRESS);
...

Finalmente, cuando sea necesario, puede combinar las opciones de incrustación usando el operador OR bit a bit:

Ejemplo 55.16. Combinar opciones de incrustación de fuentes

...
$font = Zend_Pdf_Font::fontWithPath(
            $someUserSelectedFontPath,
            (Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION |
            Zend_Pdf_Font::EMBED_DONT_COMPRESS));
...

55.5.6. Limitaciones de las fuentes PDF estándar

Las fuentes PDF estándar usan internamente varias codificaciones de un solo byte (véase PDF Reference, Sixth Edition, version 1.7, apéndice D, para más detalles). En general son equivalentes al conjunto de caracteres Latin1 (excepto las fuentes Symbol y ZapfDingbats).

Zend_Pdf usa CP1252 (WinLatin1) para dibujar texto con fuentes estándar.

El texto todavía se puede proporcionar en cualquier otra codificación, la cual debe especificarse si difiere del locale actual. Solo se dibujarán realmente los caracteres WinLatin1.

Ejemplo 55.17. Combinar opciones de incrustación de fuentes

...
$font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_COURIER);
$pdfPage->setFont($font, 36)
        ->drawText('Euro sign - €', 72, 720, 'UTF-8')
        ->drawText('Text with umlauts - à è ì', 72, 650, 'UTF-8');
...

55.5.7. Extracción de fuentes

El módulo Zend_Pdf ofrece la posibilidad de extraer fuentes de documentos cargados.

Puede ser útil para actualizaciones incrementales de documentos. Sin esta funcionalidad, tendría que adjuntar y posiblemente incrustar la fuente en un documento cada vez que desee actualizarlo.

Los objetos Zend_Pdf y Zend_Pdf_Page proporcionan métodos especiales para extraer todas las fuentes mencionadas dentro de un documento o una página:

Ejemplo 55.18. Extracción de fuentes de un documento cargado

...
$pdf = Zend_Pdf::load($documentPath);
...
// Get all document fonts
$fontList = $pdf->extractFonts();
$pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));
$yPosition = 700;
foreach ($fontList as $font) {
    $page->setFont($font, 15);
    $fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT,
                                   'en',
                                   'UTF-8');
    $page->drawText($fontName . ': The quick brown fox jumps over the lazy dog',
                    100,
                    $yPosition,
                    'UTF-8');
    $yPosition -= 30;
}
...
// Get fonts referenced within the first document page
$firstPage = reset($pdf->pages);
$firstPageFonts = $firstPage->extractFonts();
...

Ejemplo 55.19. Extracción de una fuente de un documento cargado especificando el nombre de la fuente

...
$pdf = new Zend_Pdf();
...
$pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));

$font = Zend_Pdf_Font::fontWithPath($fontPath);
$page->setFont($font, $fontSize);
$page->drawText($text, $x, $y);
...
// This font name should be stored somewhere...
$fontName = $font->getFontName(Zend_Pdf_Font::NAME_POSTSCRIPT,
                               'en',
                               'UTF-8');
...
$pdf->save($docPath);
...
...
$pdf = Zend_Pdf::load($docPath);
...
$pdf->pages[] = ($page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4));

/* $srcPage->extractFont($fontName) can also be used here */
$font = $pdf->extractFont($fontName);

$page->setFont($font, $fontSize);
$page->drawText($text, $x, $y);
...
$pdf->save($docPath, true /* incremental update mode */);
...

Las fuentes extraídas se pueden usar en lugar de cualquier otra fuente con las siguientes limitaciones:

  • La fuente extraída solo puede usarse en el contexto del documento del cual fue extraída.

  • El programa de fuente posiblemente incrustado en realidad no se extrae. Por lo tanto, la fuente extraída no puede proporcionar métricas de fuente correctas y debe usarse la fuente original para los cálculos de ancho de texto:

    ...
    $font = $pdf->extractFont($fontName);
    $originalFont = Zend_Pdf_Font::fontWithPath($fontPath);
    
    $page->setFont($font /* use extracted font for drawing */, $fontSize);
    $xPosition = $x;
    for ($charIndex = 0; $charIndex < strlen($text); $charIndex++) {
        $page->drawText($text[$charIndex], xPosition, $y);
    
        // Use original font for text width calculation
        $width = $originalFont->widthForGlyph(
                     $originalFont->glyphNumberForCharacter($text[$charIndex])
                 );
        $xPosition += $width/$originalFont->getUnitsPerEm()*$fontSize;
    }
    ...
    

55.5.8. Dibujo de imágenes

La clase Zend_Pdf_Page proporciona el método drawImage() para dibujar una imagen:

/**
 * Draw an image at the specified position on the page.
 *
 * @param Zend_Pdf_Resource_Image $image
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @return Zend_Pdf_Page
 */
public function drawImage(Zend_Pdf_Resource_Image $image, $x1, $y1, $x2, $y2);

Los objetos de imagen deben crearse con el método Zend_Pdf_Image::imageWithPath($filePath) (actualmente se admiten imágenes JPG, PNG y TIFF):

Ejemplo 55.20. Dibujo de imagen

...
// load image
$image = Zend_Pdf_Image::imageWithPath('my_image.jpg');

$pdfPage->drawImage($image, 100, 100, 400, 300);
...

¡Importante! El soporte de JPEG requiere que la extensión GD de PHP esté configurada.¡Importante! El soporte de PNG requiere que la extensión ZLIB esté configurada para trabajar con imágenes de canal Alfa.

Consulte la documentación de PHP para obtener información detallada (http://www.php.net/manual/en/ref.image.php). (http://www.php.net/manual/en/ref.zlib.php).

55.5.9. Estilo de dibujo de líneas

El estilo de dibujo de líneas se define por el ancho de línea, el color de línea y el patrón de trazos de línea. Todos estos parámetros se pueden asignar mediante métodos de la clase Zend_Pdf_Page:

/** Set line color. */
public function setLineColor(Zend_Pdf_Color $color);

/** Set line width. */
public function setLineWidth(float $width);

/**
 * Set line dashing pattern.
 *
 * Pattern is an array of floats:
 *     array(on_length, off_length, on_length, off_length, ...)
 * Phase is shift from the beginning of line.
 *
 * @param array $pattern
 * @param array $phase
 * @return Zend_Pdf_Page
 */
public function setLineDashingPattern($pattern, $phase = 0);

55.5.10. Estilo de relleno

Los métodos Zend_Pdf_Page::drawRectangle(), Zend_Pdf_Page::drawPolygon(), Zend_Pdf_Page::drawCircle() y Zend_Pdf_Page::drawEllipse() reciben el argumento $fillType como parámetro opcional. Puede ser:

  • Zend_Pdf_Page::SHAPE_DRAW_STROKE - trazar la forma

  • Zend_Pdf_Page::SHAPE_DRAW_FILL - solo rellenar la forma

  • Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - rellenar y trazar (comportamiento por defecto)

El método Zend_Pdf_Page::drawPolygon() también recibe un parámetro adicional $fillMethod:

  • Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (comportamiento por defecto)

    PDF reference describe esta regla de la siguiente manera:

    La regla del número de vueltas distinto de cero determina si un punto dado está dentro de un trazado dibujando conceptualmente un rayo desde ese punto hasta el infinito en cualquier dirección y examinando luego los lugares donde un segmento del trazado cruza el rayo. Comenzando con un recuento de 0, la regla suma 1 cada vez que un segmento del trazado cruza el rayo de izquierda a derecha y resta 1 cada vez que un segmento cruza de derecha a izquierda. Después de contar todos los cruces, si el resultado es 0, entonces el punto está fuera del trazado; en caso contrario está dentro. Nota: el método descrito no especifica qué hacer si un segmento del trazado coincide con el rayo elegido o es tangente a él. Dado que la dirección del rayo es arbitraria, la regla simplemente elige un rayo que no encuentre tales intersecciones problemáticas. Para trazados convexos simples, la regla del número de vueltas distinto de cero define el interior y el exterior tal como uno esperaría intuitivamente. Los casos más interesantes son los que involucran trazados complejos o autointersectantes como los mostrados en la Figura 4.10 (en una PDF Reference). Para un trazado formado por una estrella de cinco puntas, dibujada con cinco segmentos de línea recta conectados que se intersecan entre sí, la regla considera que el interior es toda el área encerrada por la estrella, incluyendo el pentágono central. Para un trazado compuesto por dos círculos concéntricos, las áreas encerradas por ambos círculos se consideran interiores, siempre que ambos estén dibujados en la misma dirección. Si los círculos se dibujan en direcciones opuestas, solo la forma de "dona" entre ellos está dentro, según la regla; el "agujero de la dona" está fuera.

  • Zend_Pdf_Page::FILL_METHOD_EVEN_ODD

    PDF reference describe esta regla de la siguiente manera:

    Una alternativa a la regla del número de vueltas distinto de cero es la regla par-impar. Esta regla determina si un punto está "dentro" dibujando un rayo desde ese punto en cualquier dirección y simplemente contando el número de segmentos del trazado que cruzan el rayo, sin importar la dirección. Si este número es impar, el punto está dentro; si es par, el punto está fuera. Esto produce los mismos resultados que la regla del número de vueltas distinto de cero para trazados con formas simples, pero produce resultados diferentes para formas más complejas. La Figura 4.11 (en una PDF Reference) muestra los efectos de aplicar la regla par-impar a trazados complejos. Para la estrella de cinco puntas, la regla considera que las puntas triangulares están dentro del trazado, pero no el pentágono central. Para los dos círculos concéntricos, solo la forma de "dona" entre los dos círculos se considera interior, independientemente de las direcciones en que se dibujen los círculos.

55.5.11. Transformaciones lineales

55.5.11.1. Rotaciones

Una página PDF puede rotarse antes de aplicar cualquier operación de dibujo. Esto se puede hacer con el método Zend_Pdf_Page::rotate():

/**
 * Rotate the page.
 *
 * @param float $x  - the X co-ordinate of rotation point
 * @param float $y  - the Y co-ordinate of rotation point
 * @param float $angle - rotation angle
 * @return Zend_Pdf_Page
 */
public function rotate($x, $y, $angle);

55.5.11.2. A partir de ZF 1.8, escalado

La transformación de escalado se proporciona mediante el método Zend_Pdf_Page::scale():

/**
 * Scale coordination system.
 *
 * @param float $xScale - X dimention scale factor
 * @param float $yScale - Y dimention scale factor
 * @return Zend_Pdf_Page
 */
public function scale($xScale, $yScale);

55.5.11.3. A partir de ZF 1.8, traslación

El desplazamiento del sistema de coordenadas se realiza mediante el método Zend_Pdf_Page::translate():

/**
 * Translate coordination system.
 *
 * @param float $xShift - X coordinate shift
 * @param float $yShift - Y coordinate shift
 * @return Zend_Pdf_Page
 */
public function translate($xShift, $yShift);

55.5.11.4. A partir de ZF 1.8, inclinación

La inclinación de la página se puede realizar usando el método Zend_Pdf_Page::skew():

/**
 * Translate coordination system.
 *
 * @param float $x  - the X co-ordinate of axis skew point
 * @param float $y  - the Y co-ordinate of axis skew point
 * @param float $xAngle - X axis skew angle
 * @param float $yAngle - Y axis skew angle
 * @return Zend_Pdf_Page
 */
public function skew($x, $y, $xAngle, $yAngle);

55.5.12. Guardar/restaurar el estado gráfico

En cualquier momento, el estado gráfico de la página (fuente actual, tamaño de fuente, color de línea, color de relleno, estilo de línea, rotación de página, área de recorte) se puede guardar y luego restaurar. La operación de guardado coloca los datos en una pila de estados gráficos, la operación de restauración los recupera de allí.

Hay dos métodos en la clase Zend_Pdf_Page para estas operaciones:

/**
 * Save the graphics state of this page.
 * This takes a snapshot of the currently applied style, position,
 * clipping area and any rotation/translation/scaling that has been
 * applied.
 *
 * @return Zend_Pdf_Page
 */
public function saveGS();

/**
 * Restore the graphics state that was saved with the last call to
 * saveGS().
 *
 * @return Zend_Pdf_Page
 */
public function restoreGS();

55.5.13. Recorte del área de dibujo

PDF y el módulo Zend_Pdf admiten el recorte del área de dibujo. El área de recorte actual limita las regiones de la página afectadas por los operadores de pintura. Inicialmente es la página completa.

La clase Zend_Pdf_Page proporciona un conjunto de métodos para operaciones de recorte.

/**
 * Intersect current clipping area with a rectangle.
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @return Zend_Pdf_Page
 */
public function clipRectangle($x1, $y1, $x2, $y2);
/**
 * Intersect current clipping area with a polygon.
 *
 * @param array $x  - array of float (the X co-ordinates of the vertices)
 * @param array $y  - array of float (the Y co-ordinates of the vertices)
 * @param integer $fillMethod
 * @return Zend_Pdf_Page
 */
public function clipPolygon($x,
                            $y,
                            $fillMethod =
                                Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING);
/**
 * Intersect current clipping area with a circle.
 *
 * @param float $x
 * @param float $y
 * @param float $radius
 * @param float $startAngle
 * @param float $endAngle
 * @return Zend_Pdf_Page
 */
public function clipCircle($x,
                           $y,
                           $radius,
                           $startAngle = null,
                           $endAngle = null);
/**
 * Intersect current clipping area with an ellipse.
 *
 * Method signatures:
 * drawEllipse($x1, $y1, $x2, $y2);
 * drawEllipse($x1, $y1, $x2, $y2, $startAngle, $endAngle);
 *
 * @todo process special cases with $x2-$x1 == 0 or $y2-$y1 == 0
 *
 * @param float $x1
 * @param float $y1
 * @param float $x2
 * @param float $y2
 * @param float $startAngle
 * @param float $endAngle
 * @return Zend_Pdf_Page
 */
public function clipEllipse($x1,
                            $y1,
                            $x2,
                            $y2,
                            $startAngle = null,
                            $endAngle = null);

55.5.14. Estilos

La clase Zend_Pdf_Style proporciona funcionalidad de estilos.

Los estilos se pueden usar para almacenar un conjunto de parámetros de estado gráfico y aplicarlo a una página PDF mediante una sola operación:

/**
 * Set the style to use for future drawing operations on this page
 *
 * @param Zend_Pdf_Style $style
 * @return Zend_Pdf_Page
 */
public function setStyle(Zend_Pdf_Style $style);

/**
 * Return the style, applied to the page.
 *
 * @return Zend_Pdf_Style|null
 */
public function getStyle();

La clase Zend_Pdf_Style proporciona un conjunto de métodos para establecer u obtener diferentes parámetros de estado gráfico:

/**
 * Set line color.
 *
 * @param Zend_Pdf_Color $color
 * @return Zend_Pdf_Page
 */
public function setLineColor(Zend_Pdf_Color $color);
/**
 * Get line color.
 *
 * @return Zend_Pdf_Color|null
 */
public function getLineColor();
/**
 * Set line width.
 *
 * @param float $width
 * @return Zend_Pdf_Page
 */
public function setLineWidth($width);
/**
 * Get line width.
 *
 * @return float
 */
public function getLineWidth();
/**
 * Set line dashing pattern
 *
 * @param array $pattern
 * @param float $phase
 * @return Zend_Pdf_Page
 */
public function setLineDashingPattern($pattern, $phase = 0);
/**
 * Get line dashing pattern
 *
 * @return array
 */
public function getLineDashingPattern();
/**
 * Get line dashing phase
 *
 * @return float
 */
public function getLineDashingPhase();
/**
 * Set fill color.
 *
 * @param Zend_Pdf_Color $color
 * @return Zend_Pdf_Page
 */
public function setFillColor(Zend_Pdf_Color $color);
/**
 * Get fill color.
 *
 * @return Zend_Pdf_Color|null
 */
public function getFillColor();
/**
 * Set current font.
 *
 * @param Zend_Pdf_Resource_Font $font
 * @param float $fontSize
 * @return Zend_Pdf_Page
 */
public function setFont(Zend_Pdf_Resource_Font $font, $fontSize);
/**
 * Modify current font size
 *
 * @param float $fontSize
 * @return Zend_Pdf_Page
 */
public function setFontSize($fontSize);
/**
 * Get current font.
 *
 * @return Zend_Pdf_Resource_Font $font
 */
public function getFont();
/**
 * Get current font size
 *
 * @return float $fontSize
 */
public function getFontSize();

55.5.15. Transparencia

El módulo Zend_Pdf admite el manejo de transparencia.

La transparencia se puede establecer usando el método Zend_Pdf_Page::setAlpha():

/**
 * Set the transparency
 *
 * $alpha == 0  - transparent
 * $alpha == 1  - opaque
 *
 * Transparency modes, supported by PDF:
 * Normal (default), Multiply, Screen, Overlay, Darken, Lighten,
 * ColorDodge, ColorBurn, HardLight, SoftLight, Difference, Exclusion
 *
 * @param float $alpha
 * @param string $mode
 * @throws Zend_Pdf_Exception
 * @return Zend_Pdf_Page
 */
public function setAlpha($alpha, $mode = 'Normal');