Ver índice
Gráficos e imágenes en PDF

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


Dibujar segmentos y líneas

Segmentos

Para dibujar segmentos rectilíneos TCPDF dispone del método:

$objeto->Line ( x0, y0, x1, y1, $estilo_segmento )

donde x0, y0, x1 e y1 son la coordenadas de los extremos del segmento y donde $estilo_segmento es un array que incluye los valores requeridos por el método SetLineStyle. Si no se especifica este valor la línea utilizará el estilo por defecto o el último que haya sido definido en el script.

En este ejemplo, además de aplicar el dibujo de segmentos, procuraremos ver las diferentes opciones de definición y modificación de los estilos tal como hemos señalado en la página anterior al referirnos a los bordes de las celdas.

ejemplo339.php Ver código fuente

Líneas poligonales

El dibujo de líneas poligonales puede hacerse mediante el método:

$objeto->Polyline ( poligonal, tipo_de_trazado, estilo*, color_fondo )

donde poligonal es un array que contiene las coordenadas de los puntos de la misma. El parámetro tipo_de_trazado es uno de los valores que comentamos en la tabla de siguiente y que permiten establecer eventuales rellenos, bordes y cierres en la poligonal.

ValorUtilidad
D  Traza la línea sin cerrar la poligonal
d  Cierra la poligonal (agregando un segmento que une el primer punto y el último) y dibuja la línea
F  Rellena el trazado sin dibujar la línea. Utiliza la regla del número distinto (nonzero winding number) para determinar la región a rellenar.
F*  Rellena el trazado sin dibujar la línea. Utiliza la regla del par - impar (even-odd) para determinar la región a rellenar.
DF  Traza la línea (sin cerrarla) y rellena el trazado usando lla regla del número distinto (nonzero winding number) para determinar la región a rellenar
DF*  Traza la línea (sin cerrarla) y rellena el trazado, usando la regla del par - impar (even-odd) para determinar la región a rellenar.
df  Cierra el trazado, dibuja la línea y rellena usando lla regla del número distinto (nonzero winding number)
df*  Cierra el trazado, dibuja la línea y rellena usando la regla par-impar (even-odd) para determinar la región a rellenar
CNZ  Esta opción permite utilizar elementos gráficos cerrados (rectángulos, circulos, etcétera) para recortar imágenes.

Mediante el array estilo* puede definirse el modo de trazar la polilínea que puede aplicar un estilo_segmento distinto para cada uno de los segmentos que componen la poligonal. Si no se establece aplicará a todos los segmentos el último de los definidos en el documento.

El array estilo* puede tener una de estas formas:

$estilo=array ( 'all'=>estilo_segmento) aplicará el estilo_segmento a todos los segmentos del trazado. Recuerda que lo hemos comentado en la página anterior al referirnos al método SetLineStyle y podría tener una forma similar a esta: $estilo_segmento =array('width' => 0.5,'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(255, 0, 255))

$estilo=array ( estilo_segmento1, estilo_segmento2, ...) iría aplicando los sucesivos estilos incluidos en el array a cada uno de los segmentos que conforman la polínea. Si el número de segmentos fuera mayor que el número de elementos del array de estilos aplicará a los no indicados el último de los indicados en el array. Si el array de estilos contuviera valores igual a cero se entendería que los segmentos afectados no serían trazados.

Para el caso de trazados cerrados y con un color_de_fondo podremos especificar como cuarto parámetro del método un array que contenga los valores RGB del color de fondo aplicable.

ejemplo340.php Ver código fuente

Curvas de Bezier

Mediante el método:

$objeto->Curve(x0, y0, x1, y1, x2, y2, x3, y0, tipo_de_trazado, estilo_segmento, color_fondo)

dónde x0 e y0 son las coordenadas del punto inicial, x3 e y3 las del punto final los puntos x1, y1, x2 e y2 son las respectivas coordenadas de los puntos de control (manejadores de las curvas de Bezier) de los puntos inicial o final se consigue dibujar una porción de curva entre ambos extemos. En la imagen pueden verse con más detalle la posición de los puntos. El resto de los valores, tipo_de_trazado, estilo_segmento y color_de_fondo son exactamente los mismos definidos anteriormente para el caso de las polilíneas.


Las curvas obtenidas mediante este método son susceptibles de ser modificadas utilizando la funciones de transformación que hemos comentado en la página anterior.

ejemplo341.php Ver código fuente

Rectángulos, círculos y elipses

Para representar estas figuras planas se dispone de los siguientes métodos:

$objeto->Rect ( x,y,ancho,alto,tipo_de_trazado, estilo*, color_fondo )

Dibuja un rectángulo cuyo vértice superior izquierdo está situado en el punto señalado por las coordenadas x e y con dimensiones ancho y alto. Los parámetros tipo_de_trazado y color_fondo son los mismos señalados para curvas y poligonales y , estilo* define el estilo de cada uno de los lados mediante array asociativo que puede tener la forma array('all'=>estilo_segmento) si se trata de aplicar un estilo único a los cuatro lados. Si pretendemos que cada lado tenga un estilo diferente debemos utilizar una forma del tipo: array('L'=>estilo_izquierda, 'R'=>estilo_derecha,'T'=>estilo_superior,'B'=>estilo_inferior) donde los diferentes estilos incluidos como valores de los elementos del array asociativo son a su vez arrays que definen los estilo_segmento respectivos. Cuando se incluye un cero como valor de una o varias de las posiciones estas no serán dibujadas.

$objeto->Circle(x, y, radio, inicio,final, tipo_de_trazado, estilo_segmento, color_fondo )

Dubuja un círculo con las líneas y rellenos indicados en los parámetros tipo_de_trazado, estilo_segmento y color_fondo con su centro situado en el punto de coordenadas x e y y con el radio especificado. Si se especifican valores para inicio y final (sus valores por defecto son 0 y 360) se representaría únicamente el sector circular delimitado por los radios que forman angulos inicio y inicio con el eje horizontal.

$objeto->Ellipse(x, y, semieje_horizontal, semieje_vertical, inclinacion, inicio, final, tipo_de_trazado, estilo_segmento, color_fondo)

Dibuja una elipse (o una porción de ella) siguiendo idénticos criterios a los indicados para el círculo. La única diferencia en cuanto a parámetros es que se incluyen semieje_horizontal y semieje_vertical (medida de los semiejes de la elipse) e inclinacion que indica el angulo que forma con la horizontal el eje de la elipse.

$objeto->RoundedRect(x,y,ancho,alto,radio_esquina,forma_esquinas,tipo_de_trazado, estilo_segmento, color_fondo )

Dibuja un rectángulo del ancho y alto especificados con sus esquinas redondeadas y con un radio_esquina, cuyo vértice superior izquierdo viene especificados por los valores de x e y. El parámetro forma_esquinas es una cadena del tipo "1011" que indica cuales de las esquinas (las señaladas con 1) han de ser redondeas y cuales no (las marcadas con 0). El primer valor corresponde a la esquina superior derecha continuando por las siguientes en el sentido de avance de las agujas del reloj. Los parámetros tipo_de_trazado, estilo_segmento, color_fondo son los mismos comentados anteriormente.

El rectángulo redondeado debe utilizar el mismo estilo de línea para todo su contorno y tanto los rectángulos de todo tipo como los círculos, elipse y también los polígonos soportan las funciones de transformación que hemos comentado en la página anterior.

ejemplo342.php Ver código fuente

Polígonos regulares y estrellados

Polígonos regulares

Para dibujar polígonos regulares podemos utilizar el método:

$objeto->RegularPolygon ( Xc, Yc, radio, lados, angulo_inicial, circunferencia, tipo_de_trazado, estilo*, color_fondo , tipo_circunferencia, estilo_circunferencia, relleno_circulo)

dónde Xc e Yc son las coordenadas del centro de la circunferencia circunscrita, radio es el radio, lados el número de lados, angulo_inicial el ángulo (medido en sentido trigonómetrico) que forma con la parte negativa del eje vertical el radio correspondiente al primer vértice del polígono, circunferencia es un valor booleano que indica si debe representarse o no la circunferencia circunscrita, tipo_de_trazado las opciones de relleno y trazado del polígono siguiendo el criterio de la tabla ya comentada en métodos anteriores, estilo* un array especificando los estilos de línea del polígono (igual que ocurría con las poligonales puede aplicarse un estilo distinto a cada uno de los lados), color_fondo el color de relleno del polígono, siendo tipo_circunferencia, estilo_circunferencia y relleno_circulo los parámetros ya conocidos aplicados esta vez a la circunferencia circunscrita en el caso de que sea representada.

Polígonos estrellados

Cuando se trata de polígonos estrellados puede utilizarse el método:

$objeto->StarPolygon(Xc, Yc, radio, lados, ng, angulo_inicial, circunferencia, tipo_de_trazado, estilo*, color_fondo , tipo_circunferencia, estilo_circunferencia, relleno_circulo)

cuyos parámetros coinciden exactamente con los descritos para el caso del polígono regular con la única salvedad de que añade uno nuevo, ng, cuya funcionalidad puede verse en esta imagen.


El método StarPolygon lo que hace es determinar las posiciones de los vértices de un polígono regular y trazar una poligonal cerrada (el trazado acaba al llegar al punto de partida) formada por las diagonales que unen dos vértices separados ng posiciones. Obviamente cuando el valor de ng es 1 los vértices a unir serán consecutivos y por lo tanto dibujará un polígono regular.

ejemplo343.php Ver código fuente

Imágenes

Insertar imágenes

La integración de imágenes en un documento PDF puede hacerse mediante el método:

$objeto->Image ( imagen, x, y, ancho, alto, tipo, enlace, punto_insercion, remuestreo, resolucion, alineacion, imk, imgk, borde, proporcionalidad, ocultar, encajar)

dónde: imagen es la ruta y nombre de la imagen, x e y las coordenadas donde se posicionará la esquina superior izquierda de la misma, ancho y alto sus dimensiones después de ser insertada en el documento. Si se omitiera una de las dos dimensiones (o se asignara el valor cero) redimensionaria a la medida especificada manteniendo la otra un valor proporcional a sus dimensiones originales. Si especificamos ambos valores iguales a cero el resultado dependerá del valor que asignemos al parámetro booleano encajar. Si ese valor fuera false la imagen se incluiría según sus dimensiones originales y si su altura fuera mayor que el espacio disponible en la página actual produciría un salto de página de forma automática. Cuando encajar tuviera el valor true la imagen se redimensionaría manteniendo la proporcionalidad y limitando su tamaño de forma que no sobrepase los márgenes del documento.

Mediante el parámetro tipo se puede especificar el tipo de imagen que puede ser, entre otros: GIF, JPG, PNG ó BMP. Si no se especifica lo tomará de la extensión de fichero que contiene la imagen. El parámetro enlace permite incluir una cadena conteniendo el destino de un eventual hiperenlace. Mediante la propiedad punto_insercion se puede especificar la posición en la que quedará el punto de inserción después de haber incluido la imagen. Admite uno de estos valores: T (arriba a la derecha de la imagen), M (en el centro a la derecha de la imagen), B (en la parte inferior de la imagen a la derecha de la misma) o N (en una nueva línea debajo de la imagen).

El parámetro remuestreo es un valor booleano que está íntimamente relacionado con resolucion que es el que le sigue en la llamada al método. Cuando remuestreo toma el valor false la imagen no será remuestreada y mantendrá su resolución original. Cuando se le asigna el valor true o 1 remuestreará la imagen para ajustarla a la resolución especificada en resolucion siempre que el valor de esta (expresada en puntos por pulgada) sea superior al de la imagen original. En el caso de que remuestreo tuviera valor 2 el proceso se efectuaría tanto si aumente como si disminuye la resolución original. La visualización en pantalla no se afecta por estos parámetros sin embargo si puede tener gran importancia a la hora de producir un documento impreso. En esos casos lo aconsejable será ajustar la resolución de la imagen al valor que vaya a ser utilizado por la impresora.

Mediante el parámetro alineacion es posible alinear una imagen dentro de la línea en la se encuentre el punto de inserción. Admite como valores L, C o R dependiendo si pretendemos alinear a la izquierda, centro o derecha del documento.

El parámetro imk parece estar obsoleto y se refieren a la creación de áreas de transparencia en imágenes. Tienen bastantes restricciones de uso y es absolutamente prescindible. Bastaría con utilizar imágenes en formato PNG ó GIF que permiten directamente esas transparencias. Por el contrario, la opción imgk si tiene gran utilidad cuando se trata de recortar imágenes siguiendo el borde de una figura cerrada tal como veremos cuando comentemos el proceso de este tipo de transformaciones.

  ¡Cuidado!  

Cuando al invocar el método Image sea necesario incluir las opciones imk, imgk utiliza siempre false como valores. Hemos comprobado que si ponemos una cadena vacia '' (aparentemente podría parecer los mismo) aparecen mensajes de error en la visualización con algunas imágenes.

El parámetro borde permite asignarle un borde a la imagen. Los valores posibles son: 0 (sin bordes); 1 (borde por defecto) o un array idéntico al descrito para el caso de los rectángulos que permite configurar las características específicas de los bordes de cada uno de los lados de la imagen.

Cuando el valor de proporcionalidad es false la imagen se acomodaría a las dimensiones especificadas en ancho y alto provocando distorsiones en la misma. Por el contrario, cuando su valor no es false la imagen se acomoda a la caja manteniendo la proporcionalidad. Como consecuencia de ello pueden quedar espacios sobrantes que podrían distribuirse a nuestra voluntad dependiendo del valor que asignemos a proporcionalidad. Ese parámetro es una cadena formada por dos caracteres de los cuales el primero ha de ser L (izquierda), C (centro) ó R (derecha), mientras que para el segundo se requiere T (arriba), M (en medio) ó B (abajo). Dependiendo de esta configuración la imagen se acomodará de una u otra forma al marco delimitado por los parámetros ancho y alto.

Por último, valor booleano ocultar establece la no visualización de la imagen en caso de asignarle el valor true. Cuando su valor es false (valor por defecto) la imagen se visualiza normalmente.

En el ejemplo siguiente hemos desarrollado y comentado ejemplos con imágenes que utilizan las diferentes opciones aquí comentadas.

ejemplo344.php Ver código fuente

Recortar imágenes

Una de las posibilidades gráficas de la clase TCPDF es la de recortar imágenes siguiendo el perímetro de una figura cerrada. El procedimiento para ello es el siguiente:

Como resultado del proceso solo se visualizará la parte de la imagen situada dentro del contorno de la figura cerrada que hace función de máscara. Si la figura tiene definidas bordes estos aparecerán delimitando la imagen.

También es posible efectuar recordes de imágenes delimitándolas por los bordes de las letras que componen un texto. El proceso es bastante similar al anterior. Comienza como aquel con:

$objeto->StartTransform(). A continuación hay que utilizar este nuevo método:
$objeto->setTextRenderingMode(borde, relleno, recorte)

dónde borde es un valor numérico que indica el espesor de la línea que dibuje el borde de las letras. Si se especifica cero no se visualizarán esos bordes. La opción relleno es un valor booleano que permite especificar si la letra aparecerá rellena en color negro o no. Por último el paramétro recorte, también booleano, ha de configurarse con valor true para que permita recortar la imagen.

Después de aplicar el método anterior hemos de escribir el texto. Para hacerlo utilizaremos el método Write de una forma similar a esta:

$objeto->Write(interlinea, texto)

El paso siguiente sería insertar la imagen con la posición y dimensiones que permitan que texto e imagen se superpongan.

$objeto->Image(imagenb, x, y, ancho, alto, tipo)

Por último, tendríamos que incluir el final de la transformación mediante el ya conocido: $objeto->StopTransform()

En este ejemplo pueden verse la diferentes posibilidades de utilizar elementos gráficos como rutas para el recorte de imágenes tal como acabamos de describir.

ejemplo345.php Ver código fuente

Transparencias y modos de superposición

La clase TCPDF dispone del método

$objeto->SetAlpha(opacidad,modo)

en el que opacidad es un valor comprendido entre 0 y 1 que indica el grado de opacidad de la imagen o texto. Por defecto su valor es 1 (opacidad total). El segundo parámetro de la función, modo (permite uno de los valores descritos aquí debajo) se comporta de forma muy similar a la utilizada por los programas de retoque fotográfico en la forma de combinar elementos gráficos superpuestos (imágenes, textos, trazados).

Normal: No hay interaccion entre las imágenes superpuestas. El resultado será la consecuencia del grado de opacidad de cada una de ellas.
Multiply: El valor de los píxeles de la imagen de fondo se multiplica por el valor de los píxeles de la capa superpuesta y el resultado se divide entre 255. Generalmente se obtiene un oscurecimiento de la imagen.
Screen: Realiza el efecto contrario a Multiplicar (usa el inverso de todos los valores para realizar la operación) por lo que obtenemos una imagen mucho más clara que la original.
Overlay: Los colores brillantes de la imagen de fondo se dividen entre los de la capa superpuesta mientras que los colores oscuros se multiplican. El resultado será una superposición de los colores de ambas capas, conservándose las luces y las sombras de la imagen de fondo.
Darken: Producirá una imagen más oscura como resultado de la comparación que realiza el programa entre los píxeles de cada imagen, mostrando los más oscuros de cada una.
Lighten: Se comporta de forma idéntica a la anterior pero ahora mostrando los colores más claros de cada imagen.
Color Dodge: Este efecto es similar al que se produciría si en fotografía tradicional diésemos un tiempo de exposición prologando a la fotografía.
Color Burn: Produce un efecto similar a la subexposición de la fotografía tradicional
Soft Light: Produce un efecto similar a iluminar la imagen con un foco de luz difusa y suave.
Hard Light: Igual que el anterior pero iluminando con una luz más dura.
Difference: Rellena parte de la imagen inferior con partes de la superpuesta. Generalmente se sustraerá color de la capa con el color más brillante en el punto que se examine
Exclusion: Produce efectos similares que Diferencia pero con un contraste menor.
Hue: Mezcla el valor de Tono de la imagen con el de saturación y brillo de la imagen inferior.
Saturation: Mezcla el valor de saturación del color de la imagen superpuesta con los valores de brillo y tono de la imagen de fondo.
Color: Mezcla el valor de saturación de color de la imagen superpuesta con el valor de brillo de la imagen inferior.
Luminosity: Produce el efecto inverso que Color. Mezcla los valores de saturación y tono de la imagen inferior con el valor de brillo de la imagen superpuesta.

ejemplo346.php Ver código fuente

Calidad de las imágenes

En el caso de incluir imágenes en formato JPG es posible establecer el grado de compresión de las mismas. Por defecto la clase establece un valor del 75%. Si pretendemos modificarlo podremos utilizar el método:

$objeto->setJPEGQuality(porcentaje)