eZ Publish - Un blog

ParadoxPdf, el complemento perfecto para tus pdfs en eZ Publish.

Sábado, 25 de Abril de 2009 - Carlos Revillo

Nota: Este artículo fue escrito antes de la salida de la versión 2.x de esta extensión, la cual añade interesantes funcionalidades, tales como la generación de indices, posibilidad de embeber tus propias fuerntes, etc. Puedes hacerte una idea de los cambios en http://svn.projects.ez.no/paradoxpdf/trunk/paradoxpdf/doc/changelog.txt

Como es lógico, una instalación por defecto de eZ Publish no cubre todas las necesidades de todos los proyectos, y es ahí donde uno tiene que programarse sus extensiones o bien buscar algunas ya hechas. El sitio perfecto para esto está en http://projects.ez.no, en donde se recogen todas las contribuciones realizadas por distintos desarrolladores. Todas ellas disponen de un control de versiones, por lo que uno puede seguir todo el proceso de desarrollo y aportar sus propias ideas a través de los foros.

Hace unas semanas Karnichi Mohamed publicaba su extensión ParadoxPDF. Como él mismo dice, "una extensión que posibilita una forma realmente sencilla de servir tus contenidos en formato PDF". A nuestro juicio, una de las mejores extensiones publicadas en los últimos tiempos.

En Tanta nos hemos tenido que enfrentar con desarollos que implicaban estas generaciones y, teniendo en cuenta que el soporte nativo de eZ Publish para pdfs no está demasiado actualizado, nos veíamos obligados a recurrir a librerías php tipo FPDF. Si bien servían para las necesidades que se nos planteaban, el desarrollo de plantillas más o menos vistosas se volvía tediosa. Una simple factura suponía una buena cantidad de "cuentas de la vieja" ya que uno tenía que posicionar el cursor dentro de la hoja del pdf con el fin de que el texto apareciese correctamente alineado o metido entre dos líneas. Un trabajo arduo.

La gran ventaja de ParadoxPDF es que a partir de ahora vamos a poder simular los diseños de estas "facturas" o de lo qeu necesitemos en formato html. Con ese html nos será fácil construir una plantilla de eZ Publish y esta extensión se encargará de procesar ese html, el cual se puede vestir con css tal y como se hace en cualquier web. Para ello usa un jar, "paradoxpdf.jar", construido sobre Flying Saucer. A través del comando "exec", la extensión se encarga de llamar a este archivo .jar y con ello se produce la salida del pdf. Esto te obliga a que tengas instalada en tu servidor la JRE 1.5 o superior.

Probando la extensión

Para ilustrar las posibilidades de esta extensión, vamos a construir, paso a paso, un pdf en el qeu estarán incluidos los últimos 5 posts de este blog. Tras instalar y activar la extensión, vamos a comprobar que todo funciona correctamente creando una plantilla que simplemente tenga una definicion de tipo y un texto de prueba. Vamos a hacer todo esto a través en una extensión. En primer lugar vamos a crear un nuevo pagelayout para nuestros pdfs. La llamad final al operador paradoxpdf, se encargará de producir el resultado.

{set-block variable=$xhtml}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
xmlns="http://www.w3.org/1999/xhtml"
xml:lang="{$site.http_equiv.Content-language|wash}"
lang="{$site.http_equiv.Content-language|wash}">
 
<head>
    <title>Dummy PDF</title>
</head>
<body>
parece que funciono
</body>
</html>
{/set-block}
 
{def $pdf_file_name  = $module_result.content_info.url_alias|explode('/')|reverse|extract(0)[0]
     $keys           = array($uri_string,$current_user.contentobject_id)
     $subtree_expiry = $module_result.node_id
     $expiry         = 6000
     $ignore_content_expiry=false()
}
 
{paradoxpdf($xhtml,$pdf_file_name, $keys, $subtree_expiry)}

Añadimos un script que haga uso de este layout...

<?php
include_once( "kernel/common/template.php" );
$tpl = templateInit();
$Result['pagelayout'] = 'design:pagelayout_pdf.tpl';
?> 
 

Y este es el resultado.

Añadiendo contenido dinámico.

paradoxPDF está desarrollado al "estilo eZ Publish", y esto es lo que hace verdaderamente potente. podemos usar todas las funciones de plantilla para generar el contenido del pdf. Vamos a crear una plantilla que saque los cinco últimos posts de nuestro blog.

{def $posts = fetch( "content", "list", hash("parent_node_id", 224,
                                                "sort_by", array("published", false()),
                                                "limit", 5) ) }
 
{foreach $posts as $post}
<h2 class="postTitle">{$post.data_map.title.content}</h2>
<div class="postBody">
{$post.data_map.body.content.output.output_text}
</div>
{/foreach}

Modificaremos nuestro nuevo pagelayout para quitar este texto de prueba...

...
<body>
{$module_result.content}
</body>
...
 

le diremos a nuestro script que haga uso de la plantilla que hemos creado...

<?php
include_once( "kernel/common/template.php" );
$tpl = templateInit();
$Result['pagelayout'] = 'design:pagelayout_pdf2.tpl';
$Result['content'] = $tpl->fetch('design:pdfblogs.tpl');
?>

... y tendremos nuestros posts en el pdf.

Dando estilo.

Si habéis descargado el pdf anterior, veréis que los contenidos respetan el estilo que se presentaba en los blogs. Esto es debido a que el resaltador de código que usábamos hasta ahora añade atributos "style" a los elementos. Estos estilos se respetan en el pdf y se presentan de forma más o menos similar. Nosotros podemos añadirle estilo a nuestro pdf a través de otro archivo ".css". Aquí ya entrará en juego nuestra imaginación y nuestras necesidades. Si has preparado alguna hoja de impresión para tus trabajos tendrás algo ganado. En la documentación provista por la extensión podrás encontrar más información y encontrarte con alguna propiedad que solo entiende Flying Saucer, pero que te ayudará a la hora de crear tus cabeceras y pies de página. Nosotros vamos a empezar cambiando el tipo de letra y resaltando los títulos de los posts.

@page {
    size: a4 portrait;
    margin: 0.25in;
    -fs-flow-top: "header";
    -fs-flow-bottom: "footer";
    -fs-flow-left: "left";
    -fs-flow-right: "right";
}
 
body {
    font-family: sans-serif;
    font-size: 8pt;
}
 
h2.postTitle {
    color: #fff;
    background-color: #00B1D8;
    padding: 2pt;
}

Añadiendo una llamada a este css en nuestro pagelayout, obtendremos el siguiente resultado. Es importante que declares tu media como "print".

Añadiendo cabecera y pie.

Es muy común que los pdfs lleven todos una cabecera y un pie. Con esta extensión es muy fácil añadirlos. Simplemente has de añadir dos capas con identificadores especiales y meter en ellas el contenido que tu quieras. En nuestro caso, vamos a añadir nuestro logo en la cabecera y nuestra dirección de contacto en el pie de página, además del número de página en la que estamos y el total de páginas del documento. Para dar cabida al logo, vamos también a darle un poco de margen al texto. Siguiendo la documentación es sencillo llegar a un css como el siguiente.

 @page {
    size: a4 portrait;
    margin: 0.85in 0.75in 0.75in;
    -fs-flow-top: "header";
    -fs-flow-bottom: "footer";
    -fs-flow-left: "left";
    -fs-flow-right: "right";
}
 
body {
    font-family: sans-serif;
    font-size: 8pt;
}
 
h2.postTitle {
    color: #fff;
    background-color: #00B1D8;
    padding: 2pt;
 
}
 
h2.postTitle.newPage{
    page-break-before:always;
 
}
 
#footer {
    color:#666;
    font-size:7pt;
    border-top:thin solid #666;
    padding-top:3pt;
    position: absolute; top: 0; 
    -fs-move-to-flow: "footer";
    width:100%;
}
 
#header {
    -fs-move-to-flow: "header";
    border-bottom:thin solid #666; 
    position: absolute; top: 4;
    padding-bottom:3pt;
    width:100%;
}
 
#pagenumber:before {
content: counter(page);
}
 
#pagecount:before {
content: counter(pages);
}

gracias al cual obtendríamos lo que estábamos buscando.

Por último, comentar que ya que paradoxPDF está desarrollado "al estilo eZ Publish", estos pdfs pueden ser fácilmente cacheados de modo que para generarlos no tengamos que estar llamando una y otra vez a la base de datos.

Las posibilidades de creación de facturas o informes en pdf con eZ Publish aumentan enormemente gracias a esta fantástica extensión.

Entradas relacionadas

3 comentarios para “ParadoxPdf, el complemento perfecto para tus pdfs en eZ Publish.”

  • angel dijo: Sábado, 25 de Abril de 2009

    Muy buen artículo

  • Mohamed Karnichi dijo: Miércoles, 29 de Abril de 2009

    Hi Carlos,

    Nice Article. Please could you just add a note that this sample codes are paradoxpdf V1.x compatible only. In fact some important change have been made on the V2.x release.

    Thank you

  • Carlos dijo: Miércoles, 29 de Abril de 2009

    Hi Mohamed.

    Just added the note at the top of the article. I will check new version asap.

    Regards.

Deja un comentario:

  • eZHumanCAPTCHACode