Dibujo
Geometría
PDF utiliza la misma geometría que PostScript. Se inicia desde la parte
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 recuperar desde un objeto página:
getWidth();
$height = $pdfPage->getHeight();
]]>
Colores
PDF tiene una poderosa capacidad de representación de colores.
El módulo Zend_Pdf soporta la Escala de Grises,
y los espacios de color RGB y CMYK.
Cualquiera de ellos puede ser usado en cualquier lugar, donde el objeto
Zend_Pdf_Color sea requerido.
Las clases Zend_Pdf_Color_GrayScale,
Zend_Pdf_Color_Rgb y
Zend_Pdf_Color_Cmyk proporcionan esta funcionalidad:
Los estilos de colores HTML también se proporcionan con la clase
Zend_Pdf_Color_Html:
Dibujo de Formas
Todas las operaciones de dibujo se puede hacer en un contexto de página PDF.
La clase Zend_Pdf_Page proporciona un conjunto de
primitivas de dibujo:
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
en la página mediante el suministro de las coordenadas X e Y de la base
de referencia. La fuente y tamaño actual de la letra se utilizan para
operaciones de dibujo de texto (ver descripción detallada más abajo).
Dibujar un string en la página
drawText('Hello world!', 72, 720);
...
]]>
Por defecto, los strings de texto se interpretan usando el método de
codificación de la localización actual. Si tiene un string que utiliza
un método de codificación diferente (como un string UTF-8 a leer desde
un archivo en disco, o un string MacRoman obtenido a partir del legado
de una base de datos), puede indicar la codificación de caracteres a
llamar en tiempo de dibujo y Zend_Pdf se encargará
de la conversión. Puede proporcionar la fuente de cualquier método de
codificación de strings soportados por la función de PHP
iconv():
Dibujar un string codificado en UTF-8 en la página
drawText($unicodeString, 72, 720, 'UTF-8');
...
]]>
Uso de Fuentes
Zend_Pdf_Page::drawText() utiliza la fuente y el
tamaño actual de la fuente de la página, que se establece con el método
Zend_Pdf_Page::setFont():
Los documentos PDF soportan fuentes PostScript Type 1 y TrueType, así
como dos tipos especializados de PDF, Type 3 y fuentes compuestas.
También hay 14 fuentes estándar Tipo 1 incorporadas para cada visor PDF:
Courier (4 estilos), Helvetica (4 estilos), Times (4 estilos), Symbol
y Zapf Dingbats.
Zend_Pdf actualmente soporta el estándar de 14
fuentes PDF, así como sus propias fuentes personalizadas TrueType.
Los objetos Font se obtienen a través de una de los dos métodos de
fábrica: Zend_Pdf_Font::fontWithName($fontName)
para las 14 fuentes estándar PDF o
Zend_Pdf_Font::fontWithPath($filePath) para
fuentes personalizadas.
Crear un tipo de letra normal
setFont($font, 36);
...
]]>
Los nombres de las 14 constantes para el tipo de letra 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 utilizar cualquier fuente individual TrueType
(que generalmente tiene una extensión '.ttf') o bien una fuente OpenType
(con la extensión '.otf') si contiene esquemas TrueType.
Actualmente no están soportadas, pero está previsto para una versión
futura archivos de fuentes .dfont de Mac OS X y de Microsoft TrueType
Collection(extensión '.ttc').
Para utilizar una fuente TrueType, debe proporcionar toda la ruta del
archivo a la fuente del programa. Si la fuente no se puede leer por
alguna razón, o si no es una fuente TrueType, el método de fábrica
arrojará una excepción:
Crear una fuente TrueType
setFont($goodDogCoolFont, 36);
...
]]>
Por defecto, las fuentes personalizadas serán incorporados en el
documento PDF resultante. Esto permite que los destinatarios vean la página
como está previsto, incluso si no tienen los tipos de letra apropiados
instalados en su sistema. Si le preocupa el tamaño del archivo, puede pedir
que la fuente del programa no sea integrada pasando una opción
'do not embed' ("no incluir") al método de fábrica:
Crear una fuente TrueType, pero no incluirla en el documento PDF.
setFont($goodDogCoolFont, 36);
...
]]>
Si el programa no es de fuentes incrustadas, pero el destinatario del
archivo PDF tiene instalada la fuente en su sistema, va a ver el
documento como estaba previsto. Si no tiene la fuente correcta instalada,
la aplicación del visor de PDF hará todo lo posible para sintetizar un sustituto.
Algunas fuentes tienen normas específicas de concesión de licencias que
les impiden ser tenidas en cuenta en documentos PDF. Así que no son
capturados con la "guardia baja" por la presente, si intenta utilizar una
fuente que no puede ser incorporada, el método de fábrica lanzará una excepción.
Puede seguir utilizando esas fuentes, pero debe pasar el flag de no
incluir como se ha descripto anteriormente, o simplemente puede
suprimir la excepción:
No arrojar una excepción para las fuentes que no puedan ser incorporadas.
Esta técnica de supresión se prefiere si va a permitir a un usuario final a
elegir sus propios tipos de letra. Las fuentes que puedan ser embebidas
en el documento PDF, lo harán, aquellos que no puedan, no.
Los de programas de fuentes pueden ser bastante grandes, algunas llegan a
decenas de megabytes. Por defecto, todas las fuentes incorporadas son
comprimidas utilizando el esquema de compresión Flate, lo que resulta en
un ahorro de espacio del 50% en promedio. Si, por alguna razón, no
desea comprimir la fuente del programa, se puede desactivar con una opción:
No comprimir una fuente incrustada.
Por último, en caso necesario, puede combinar las opciones de la
integración mediante el operador binario OR:
La combinación de opciones de la incrustación de fuentes.
Limitaciones de las fuentes PDF estándar.
Las fuentes estándar PDF utilizan internamente varias codificaciones
de un solo byte (véase PDF Reference, Sixth Edition, version 1.7
Apéndice D para más detalles).
Son, en general, igual al conjunto de caracteres Latin1 (excepto
las fuentes ZapfDingbats y Symbol).
Zend_Pdf usa CP1252 (WinLatin1) para dibujar
el texto con las fuentes estándar.
El texto todavía se puede proporcionar en cualquier otra codificación,
que debe ser especificada si ésta es distinto de una fuente local actual.
Realmente, sólo se dibujarán caracteres WinLatin1.
Combinación de opciones de la incrustación de fuentes.
setFont($font, 36)
->drawText('Euro sign - €', 72, 720, 'UTF-8')
->drawText('Text with umlauts - à è ì', 72, 650, 'UTF-8');
...
]]>
Dibujo de Imágenes
La clase Zend_Pdf_Page proporciona el método
drawImage() para dibujar la imagen:
Los objetos imagen deben ser creados con el método
Zend_Pdf_Image::imageWithPath($filePath)
(imágenes JPG, PNG y TIFF ahora son soportadas):
Dibujar una imagen
drawImage($image, 100, 100, 400, 300);
...
]]>
Importante! el soporte a JPEG requiere que se configure
la extensión PHP GD.
Importante! el soporte a PNG requiere que se configure
la extensión ZLIB para trabajar con imágenes 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).
Estilo de Dibujo de Líneas
El estilo del dibujo de líneas está definido por el ancho de línea,
el color de línea y el patrón del tipo de línea. Todo esto parámetros
pueden ser asignados por los métodos de la clase
Zend_Pdf_Page:
Estilo Relleno
Los métodos
Zend_Pdf_Page::drawRectangle(), Zend_Pdf_Page::drawPolygon(),
Zend_Pdf_Page::drawCircle() y Zend_Pdf_Page::drawEllipse()
toman el argumento $fillType como un parámetro opcional.
Puede ser:
Zend_Pdf_Page::SHAPE_DRAW_STROKE - forma del trazo
Zend_Pdf_Page::SHAPE_DRAW_FILL - sólo llenar la forma
Zend_Pdf_Page::SHAPE_DRAW_FILL_AND_STROKE - llenar y trazar (comportamiento por defecto)
El método Zend_Pdf_Page::drawPolygon() también
tiene un parámetro adicional $fillMethod:
Zend_Pdf_Page::FILL_METHOD_NON_ZERO_WINDING (comportamiento por defecto)
PDF reference esta norma se describe como sigue:
La tortuosa regla del número distinto de cero determina
si un punto está dentro de un camino de un rayo conceptual
dibujado a partir de ese punto hasta el infinito en
cualquier dirección y luego de examinar los lugares en
los que un segmento de la ruta atraviesa el rayo.
A partir de la cuenta de 0, la norma agrega 1 cada vez
que un segmento de ruta atraviesa 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 camino;
otra cosa es el interior.
Nota: El método que acabamos de describir no especifica
qué hacer si un segmento de ruta coincide con o es
tangente al rayo elegido. Dado que la dirección de
los rayos es arbitraria, la regla simplemente elige un
rayo que no encuentre problemas con las intersecciones.
Por simples caminos convexos, la regla del tortuoso número
distinto de cero define el dentro y afuera como uno lo
espera intuitivamente. Los casos más interesantes son
aquellos que involucran la complejidad o las rutas
auto-intersectadas como las que se muestran en la Figura 4.10
(en un PDF de referencia).
Para un camino que consiste en una estrella de cinco
puntas, dibujado con cinco segmentos conectados de líneas
rectas intersectándose entre sí, la regla considera que
el interior será toda el área delimitada por la estrella,
incluido el pentágono en el centro.
Para un camino compuesto por dos círculos concéntricos,
las áreas de ambos círculos cerrados se consideran que
están adentro, siempre que ambas se hayan dibujado en
la misma dirección. Si los círculos son dibujados en
direcciones opuestas, sólo la forma de "doughnut" (rosquilla)
formada entre ellos es el interior, de acuerdo a la norma,
el "agujero de la rosquilla" está afuera.
Zend_Pdf_Page::FILL_METHOD_EVEN_ODD
PDF reference describe esta norma como sigue:
Una alternativa al tortuoso número distinto de cero es
la regla par-impar.
Esta norma determina la "interioridad" de un punto por
el dibujo de un rayo desde ese punto en cualquier dirección
y simplemente contando el número de segmentos de ruta
que atraviesan los rayos, independientemente de la dirección.
Si este número es impar, el punto está adentro, si es
par, el punto está afuera. Esto produce los mismos
resultados que la regla del tortuoso número distinto de cero
para caminos con formas simples, pero produce resultados
diferentes para formas más complejas.
La Figura 4.11 (en un PDF de referencia) muestra los
efectos de la aplicación de la regla par-impar
a las rutas complejss. Para la estrella de cinco
puntas, la regla considera que los puntos del triángulo
están dentro de la ruta, pero no el pentágono en el centro.
Para los dos círculos concéntricos, sólo la forma de la
"rosquilla" entre los dos círculo está considerada
adentro, independientemente de las direcciones en las
que se dibujen los círculos.
Transformaciones Lineales
Rotaciones.
La página PDF se puede rotar antes de aplicar cualquier operación
de dibujo. Se puede hacer con el método
Zend_Pdf_Page::rotate():
A partir de ZF 1.8, el escalado.
La escala de transformación es proporcionada por el método:
Zend_Pdf_Page::scale():
A partir de ZF 1.8, traducir.
El desplazamiento del sistema de coordenadas es realizado por el
método Zend_Pdf_Page::translate():
A partir de ZF 1.8, el sesgo.
El sesgo de una página se puede hacer utilizando el método
Zend_Pdf_Page::skew():
Guardar/Restaurar el estado de los gráficos.
En cualquier momento el estado de la página de gráficos
(fuente actual, tamaño de la fuente, color de línea, color de relleno,
estilo de línea, rotación de la página, clip del área) se pueden
guardar y restaurarlos luego.
Guardar la operación pone los datos a un estado de pila de gráficos,
la operación de restauración se recupera a partir de ahí.
Existen dos métodos en la clase Zend_Pdf_Page
para estas operaciones:
Señalar el área de recorte
PDF y el módulo Zend_Pdf dan soporte de recorte
a la zona de dibujo.
La zona actual de Clip límita las regiones de la página de los
operadores afectados por la pintura.
En principio, es la página entera.
La clase Zend_Pdf_Page proporciona un conjunto
de métodos para las operaciones de recorte.
Estilos
La clase Zend_Pdf_Style proporciona la
funcionalidad de los estilos.
Los estilos se pueden utilizar para almacenar un conjunto de
parámetros de estado del gráfico y aplicarlo a un página PDF
por una operación:
La clase Zend_Pdf_Style proporciona un
conjunto de métodos para obtener o configurar diferentes parámetros
de estado de los gráficos:
Transparencia
El módulo Zend_Pdf soporta el manejo de la
transparencia.
La transparencia puede ser el método
Zend_Pdf_Page::setAlpha():