Inicio > Programing > Creando archivo pdf, por supuesto desde python

Creando archivo pdf, por supuesto desde python

crearpdf-04
Hoy en día los archivos PDF se ocupan para todo, desde una simple carta, hasta un reporte financiero, o, incluso para tareas más sensuales como proteger información hoooooo lala! (lo de sensuales lo dejaré para otro post, ha y lo de proteger también)

Buscando veo que hay alternativas como o y una gama de resultados que se pueden obtener desde pypi, sin embargo he elegido dos opciones:

  1. xhtml2pdf
  2. pyfpdf que es un fork de un proyecto de php, así que ya tiene trabajo hecho.

xhtml2pdf

Instalación

He buscado las formas posibles de instalación en mi Linuxmint y la única manera es por medio de easy_install, así que a la carga…

$ sudo easy_install xhtml2pdf
[sudo] password for rcorr: 
Searching for xhtml2pdf
Reading http://pypi.python.org/simple/xhtml2pdf/
Best match: xhtml2pdf 0.0.5
Downloading https://pypi.python.org/packages/source/x/xhtml2pdf/xhtml2pdf-0.0.5.zip#md5=8db99aae8536436a2b7b0b3987197b99
Processing xhtml2pdf-0.0.5.zip
Writing /tmp/easy_install-Y0JJZX/xhtml2pdf-0.0.5/setup.cfg
Running xhtml2pdf-0.0.5/setup.py -q bdist_egg --dist-dir /tmp/easy_install-Y0JJZX/xhtml2pdf-0.0.5/egg-dist-tmp-jddufx
zip_safe flag not set; analyzing archive contents...
Adding xhtml2pdf 0.0.5 to easy-install.pth file
Installing pisa script to /usr/local/bin
Installing xhtml2pdf script to /usr/local/bin

Installed /usr/local/lib/python2.7/dist-packages/xhtml2pdf-0.0.5-py2.7.egg
Processing dependencies for xhtml2pdf
Searching for Pillow
Reading http://pypi.python.org/simple/Pillow/
Best match: Pillow 2.3.0
Downloading https://pypi.python.org/packages/source/P/Pillow/Pillow-2.3.0.zip#md5=56b6614499aacb7d6b5983c4914daea7
Processing Pillow-2.3.0.zip
Writing /tmp/easy_install-26D7qX/Pillow-2.3.0/setup.cfg
Running Pillow-2.3.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-26D7qX/Pillow-2.3.0/egg-dist-tmp-yeTnK9
libImaging/Unpack.c:867:1: aviso: se define ‘copy3’ pero no se usa [-Wunused-function]
--------------------------------------------------------------------
PIL SETUP SUMMARY
--------------------------------------------------------------------
version      Pillow 2.3.0
platform     linux2 2.7.3 (default, Apr 10 2013, 05:13:16)
             [GCC 4.7.2]
--------------------------------------------------------------------
*** TKINTER support not available
(Tcl/Tk 8.5 libraries needed)
*** JPEG support not available
--- ZLIB (PNG/ZIP) support available
*** LIBTIFF support not available
--- FREETYPE2 support available
*** LITTLECMS2 support not available
*** WEBP support not available
*** WEBPMUX support not available
--------------------------------------------------------------------
To add a missing option, make sure you have the required
library, and set the corresponding ROOT variable in the
setup.py script.

To check the build, run the selftest.py script.

Adding Pillow 2.3.0 to easy-install.pth file
Installing pilfont.py script to /usr/local/bin
Installing pilfile.py script to /usr/local/bin
Installing pilprint.py script to /usr/local/bin
Installing pilconvert.py script to /usr/local/bin
Installing pildriver.py script to /usr/local/bin

Installed /usr/local/lib/python2.7/dist-packages/Pillow-2.3.0-py2.7-linux-x86_64.egg
Finished processing dependencies for xhtml2pdf

ahora ya está instalado y se puede verificar con un import de la siguiente manera

In [1]: import xhtml2pdf
In [2]: xhtml2pdf.
xhtml2pdf.REPORTLAB22    xhtml2pdf.log            xhtml2pdf.version
xhtml2pdf.REQUIRED_INFO  xhtml2pdf.logging        
xhtml2pdf.VERSION        xhtml2pdf.util           

In [2]: xhtml2pdf.

Uso básico

Tras la instalación se puede crear el siguiente script

#!/usr/bin/python
#-*- coding: utf-8 -*-

from xhtml2pdf import pisa

sourceHTML = """
<!DOCTYPE html>
<html>
<body>
    <h2>A quién corresponda</h2>
    <h3>H. Consejo</h3>
    <p>Estimados creadores de xhtml2pdf, si esto funciona les doy un tiro
    ya que han creado una herramienta maravillosa y no conviene que caiga
    en manos poco trabajadoras, mientras nosotros seguiremos promoviendo
    la creación de ésta y otras herramientas similares.</p>
    </body>
</html>
"""

outFilename = "test.pdf"
outFile = open(outFilename, "w+b")
pisaStatus = pisa.CreatePDF(sourceHTML, dest=outFile)
outFile.close()
print pisaStatus.err

Ahora para ejecutarlo

$ python crearpdf-basic.py 
0
$ ls -lF
total 8
-rw-r--r-- 1 rctorr rctorr  634 ene 12 17:45 crearpdf-basic.py
-rw-r--r-- 1 rctorr rctorr 3505 ene 12 17:45 test.pdf
$

El resultado se observa en la siguiente imagen
crearpdf-01

Sin embargo algo notorio es que no se están aplicando los estilos para las etiquetas de encabezados (ver siguiente imagen).
crearpdf-02

Posiblemente se puedan asignar más estilos de forma diferente, pero si a partir de un archivo html básico no se logra obtener el pdf correspondiente, entonces para éste propósito esta herramienta no será adecuada, o no en esta versión.

pyfpdf

Instalación

Al igual que con el anterior módulo, para la instalación se hace uso de easy_install

$ sudo easy_install pyfpdf
...
$ 

la instalación se logra sin problema

Uso básico

Aquí el script básico y bien documentado😉

#-*- coding: utf-8 -*-

from fpdf import FPDF

# Definimos portraito vertical, unidades en milímetros y tamaño de página
# carta
pdf = FPDF('P', 'mm', 'Letter')

# Se adiciona una página
pdf.add_page()

# Indispensable seleccionar una tipografía
# Arial, Bold, 16pts
pdf.set_font('Arial', 'B', 16)

# Se crea una celda que es en sí un área rectangular
# La esquina superior izquierda es el origen y está ubicada a 1cm de los
# bordes.
pdf.cell(50, 10, "Hola mundo PDF!", 1)

# Se agrega otra celda próxima a la anterior pero con texto centrado
pdf.cell(80, 10, "Muy cerca de ti!", 1, 1, "C")

# Se cierra el documento y se escribe
pdf.output("crearpdf-pyfpdf-basic-test.pdf","F")

Para su ejecutación (vaya palabrita!) se hace con:

$ python crearpdf-pyfpdf-basic.py
$

Ahora el resultado es un poco más vistoso
crearpdf-03

Conclusiones

Parece ser que FPDF tiene un poco más de trabajo hecho, sin embargo XHTML2PDF puede ser si se parte de una plantilla HTML me parece que no hace su trabajo, se tendría que construir desde cero como el caso de FPDF, pero la sintaxis de FPDF me pareció más simple.

Así que habría que hacer otro post con uso un poco más avanzado de FPDF y crear un PDF ya sea de un archivo cvs o xls o de una tabla de una base de datos, hummm!! Tentador!!

Categorías:Programing Etiquetas: , , , , ,
  1. 1berto
    19 agosto, 2014 a las 18:34

    que version de python es ??

    • 20 agosto, 2014 a las 19:28

      Hola 1berto

      es Python 2.7

      Salu2+

  2. Omar Cardona
    26 septiembre, 2014 a las 15:52

    Muy buen tutorial. Es corto, pero preciso. Me sirvió mucho. Gracias

    • 26 septiembre, 2014 a las 15:54

      Hi Omar!

      genial! gracias por comentar!

      Salu2+

  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

PiKon

3D Printing + Raspberry Pi Camera = PiKon Telescope

gvSIG blog

gvSIG project blog

Python Adventures

Welcome to the Jungle!

A %d blogueros les gusta esto: