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 Zend Framework 1.8, el escalado
La escala de transformación es proporcionada por el método:
Zend_Pdf_Page::scale()
:
A partir de Zend Framework 1.8, traducir
El desplazamiento del sistema de coordenadas es realizado por
el método
Zend_Pdf_Page::translate()
:
A partir de Zend Framework 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()
: