Php & gs: Modificar una imágen, guardarla como Pdf y unirla a otro archivo

admin

September 11, 2018

PHP

No Comment

Estaba actualizando mi libro “Correteando la Chuleta“, disponible de forma gratuita aqui, me parece buena idea mandar ediciones personalizadas con un reconocimiento a los lectores, y me di a la tarea de automatizar este proceso.
Mi intención es tener un script que mande llamar con solamente el nombre como parámetro y que el resultado sea una edición de mi libro con el nombre del lector en el reconocimiento que pongo al final.

Para esto utilizaremos Php y GhostScript (gs) para el proceso final de unir los archivos. Existen otras formas de lograr esto solo con Php, pero no son estables o están aún en desarrollo, por ello me decidí por usar GhostScript.

Lo primero que tenemos que hacer es que se escriba el nombre del lector en el reconocimiento, para esto necesitaremos, claro esta, la imágen del reconocimiento y una fuente true type adecuada, yo descargué Signatra de Dafont.com, y utilice Google Drive Draw para hacer el reconocimiento.

Lo primero que hará el script será: Abrir la imágen del reconocimiento, escribir el nombre, rotar la imágen 270 grados y guardarla con otro nombre. Para ello utilizamos la libreria GD de Php.

//  Creamos el objeto manipulador de la imágen
$im = imagecreatefrompng('reconocimiento.png');

//  Este es el ancho de la letra
$tw = 20;

//  Este es el ancho total de la imagen, en pixeles
$w = 1056;

//  Tomamos el texto de los parámetros enviados al script, lo ejecutaremos desde consola
$text = $argv[1];

//  Obtenemos la cantidad de letras
$letters = strlen($text);

//  Esta es la fuente, la puse en el mismo lugar que el script
$font = 'Signatra.ttf';

//  Aqui formamos un color negro
$black = imagecolorallocate($im, 0, 0, 0);

//  Este será el ancho del texto, los 20 de cada letra por el número de letras
$tw = ($letters  * $tw);

//  Esta será la coordenada x, le resto el ancho del texto al ancho total y divido entre dos
$x = (($w - $tw) / 2);

//  Aqui escribo el texto, le paso los parámetros:
//    imagen, tamaño de la fuente, angulo, x, y, color, fuente y texto
imagettftext($im, 60, 0, $x, 380, $black, $font, $text);

//  Aqui roto toda la imágen 270 grados
$imgr = imagerotate($im, 270, 0);

//  La guardo como png
imagepng($imgr, 'reco.png');

//  Limpio los recursos
//    La imagen original
imagedestroy($im);

//    La imagen rotada
imagedestroy($imgr);

La segunda parte del script lo que tiene que hacer es pasar a PDF la imágen recién creada. Para ello utilizo la librería FPDF, disponible aqui:

//  Leemos la librería fpdf
require('fpdf.php');

//  Creamos un objeto pdf
$pdf = new FPDF();

//  Agregamos una página
$pdf->AddPage();

//  Aqui ponemos la imágen que acabamos de hacer
$pdf->Image('reco.png', 20, 10, 180, 280);

//  Guardamos el pdf
$pdf->Output('reco.pdf', 'F');

Por ultimo, tenemos que unir dos pdfs en uno solo, y guardarlo con el nombre correcto. Para ellos utilizaremos Ghostscript, ejecutando un comando de consola desde php con shell_exec().
Ya tengo preparado el libro (faltando solo la última pagina de reconocimiento) con el nombre clc.pdf. El script unirá este archivo y el nuevo que acabamos de generar en uno solo.

En mi caso, para mayor comodidad, puse todos los archivos en la misma carpeta, el script de php, la imágen, los pdf’s y el ejecutable de Ghostscript, pero desde linux u otra configuración con acceso global a Ghostscript, no sería necesario este último.

//  Reemplazamos los espacios en el nombre por guiones
$name = str_replace(" ", "-", $text);

//  Creamos el nombre del archivo
$file = "correteando-la-chuleta-$name.pdf";

//  Si existe, lo borramos
if (file_exists($file)) {
    unlink(file);
}

//  Preparamos el comando
//    Usamos gswin64c.exe, que es el Ghostscript para windows 64, pero bien desde linux podríamos llamar solo con gs
//    Las opciones importantes son -sDEVICE=pdfwrite para que nos escriba un pdf
//    -sOutputFile donde viene el nombre del archivo destino
//    Y al final ponemos los dos archivos PDF que queremos unir.
$command = "gswin64c.exe -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=$file clc.pdf reco.pdf";

//  Ejecutamos la instrucción
shell_exec($command);

El script completo queda (ya sin comentarios) como sigue:

#!/usr/bin/env php
<?php
require('fpdf.php');

$im = imagecreatefrompng('reconocimiento.png');
$tw = 20;
$w = 1056;

$text = $argv&#91;1&#93;;
$letters = strlen($text);

$font = 'Signatra.ttf';
$black = imagecolorallocate($im, 0, 0, 0);
$tw = ($letters  * $tw);

$x = (($w - $tw) / 2);
imagettftext($im, 60, 0, $x, 380, $black, $font, $text);
$imgr = imagerotate($im, 270, 0);

imagepng($imgr, 'reco.png');
imagedestroy($im);
imagedestroy($imgr);

$pdf = new FPDF();
$pdf->AddPage();
$pdf->Image('reco.png', 20, 10, 180, 280);
$pdf->Output('reco.pdf', 'F');

$name = str_replace(" ", "-", $text);
$file = "correteando-la-chuleta-$name.pdf";

if (file_exists($file)) {
    unlink(file);
}

$command = "gswin64c.exe -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=$file clc.pdf reco.pdf";
shell_exec($command);

Espero que de verdad les sirva 🙂

Related Posts

Empezar con Php

admin

April 14, 2018

PHP

No Comment

Lo primero que debes saber antes de empezar con Php es que NO es un lenguaje multipropósito, un día si y otro también leo gente quejandose en grupos y foros que para programar para Windows y mobile tienen que aprender otro lenguaje de programación. Bien, si quieres aprender un solo lenguaje de programación – que […]

Read More

Reinventando la Rueda o Porqué Desrrollé RSPhp

admin

July 2, 2017

PHP

No Comment

¿Por que desarrollar un web framework para Php? Si ya existe Laravel, Symphony, Code Igniter. “No reinventes la rueda”, es una frase que escucharás muy seguido si te propones escribir un framework desde cero u otro proyecto similar. Estas personas quieren lo mejor para ti, no lo dudes, pero no siempre tienen la razón. Si […]

Read More

Leave a Reply

Your email address will not be published. Required fields are marked *

Busca en el blog aqui

Herramientas Útiles

Suscribete al blog

Recibe en tu correo las últimas publicaciones

Publicidad

Sígueme en Twitter