Imprimindo páginas Plone (HTML) em PDF
Neste artigo iremos aprender a converter qualquer página em HTML para PDF dentro do Plone.
O que iremos fazer?
Iremos instalar todos os plugins e eggs necessários para ter o método que realmente imprimi uma página em PDF.
Mãos a obra!
Na instalação da instância entre em Python 2.4/bin
Instale os módulos a seguir:
sudo ./easy_install pisa Searching for pisa Reading http://pypi.python.org/simple/pisa/ Reading http://www.xhtml2pdf.com Reading http://www.htmltopdf.org/ Reading http://www.htmltopdf.org/download.html Reading http://pisa.spirito.de/ Reading http://pisa.spirito.de/download.html Best match: pisa 3.0.33 Downloading http://pypi.python.org/packages/source/p/pisa/pisa-3.0.33.zip#md5=2a6e9ddba828caf9d97d4d1c0bb889e1 sudo ./easy_install reportlab Searching for reportlab Reading http://pypi.python.org/simple/reportlab/ Reading http://www.reportlab.com/ Best match: reportlab 2.5 Downloading http://pypi.python.org/packages/source/r/reportlab/reportlab-2.5.tar.gz#md5=cdf8b87a6cf1501de1b0a8d341a217d3 sudo ./easy_install html5lib Searching for html5lib Reading http://pypi.python.org/simple/html5lib/ Reading http://code.google.com/p/html5lib/ Best match: html5lib 0.90 Downloading http://html5lib.googlecode.com/files/html5lib-0.90.zip sudo ./easy_install pyPdf Searching for pyPdf Reading http://pypi.python.org/simple/pyPdf/ Reading http://pybrary.net/pyPdf/ Reading http://stompstompstomp.com/pyPdf/ Download error: (-2, 'Name or service not known') -- Some packages may not be found! Best match: pyPdf 1.13 Downloading http://pybrary.net/pyPdf/pyPdf-1.13.zip sudo ./easy_install pil Searching for pil Reading http://pypi.python.org/simple/pil/ Reading http://www.pythonware.com/products/pil Reading http://effbot.org/zone/pil-changes-115.htm Reading http://effbot.org/downloads/#Imaging Best match: PIL 1.1.7 Downloading http://effbot.org/media/downloads/PIL-1.1.7.tar.gz
Geralmente o módulo pisa dá problemas na instalação caso isso ocorra faça o seguinte:
Baixe o módulo do pisa em uma pasta dentro do bin do Python
mkdir dirpisa cd dirpisa sudo wget http://pypi.python.org/packages/source/p/pisa/pisa-3.0.33.tar.gz#md5=e2040b12211303d065bc4ae2470d2700
Descompacte o módulo pisa e entre na pasta:
tar -zxvf pisa-3.0.33.tar.gz cd pisa-3.0.33/
Agora instale o módulo no python (?):
sudo ../../python setup.py install
Agora precisamos criar os métodos para a geração do PDF
para mais informações sobre a lib pisa veja isso.
Este método exige do sistema operacional e por segurança não pode ser implementado em um Script Python, utilize uma view (inglês) ou uma tool (inglês).
def html_to_pdf(self, html, pdfname=None): """Usa PISA para gera um pdf""" import random if not pdfname: pdfname = str(random.random()).split('.')[1] filename = '/tmp/'+pdfname+'.pdf' try: pdf = self.pdf_file(html, filename) if pdf: self.REQUEST.RESPONSE.setHeader('Content-Type', 'application/pdf') self.REQUEST.RESPONSE.setHeader('Content-Disposition','attachment; filename=%s.pdf'%(pdfname)) self.REQUEST.RESPONSE.write(file(filename,"r").read()) except Exception, erro: return 'erro|Não possível gerar o arquivo, Detalhes %s'%(erro) return 'ok|Arquivo gerado com sucesso.' def pdf_file(self, html, filename): """Cria um arquivo temporario no filesystem""" import ho.pisa as pisa from StringIO import StringIO fopen = file(filename,"wb") pdf = pisa.CreatePDF(StringIO(html), fopen, encoding='utf-8') fopen.close() if not pdf.err: #pisa.startViewer(filename) return True else: return False
Para testarmos pode criar um Script Python:
html = """ <style> .red{ color:red; } .blue{ color:blue; } </style> <div>Este é um <h1>arquivo</h1> em <span class='blue'>HTML</span> convertido em <span class='red'>PDF</span> Gerado <div> """ context.portal_mreutils.html_to_pdf(html)
Se tudo deu certo você verá uma caixa de download para baixar, até a próxima.
Plone - HTML -> PDF
Fala Herson, estou com uma duvida, instalei plone aqui na empresa e preciso o botao download em PDF porem nao sei onde colocar os codigos
"Este método exige do sistema operacional e por segurança não pode ser implementado em um Script Python, utilize uma view (inglês) ou uma tool (inglês)." (links quebrados)
e o outro tbm! poderia detalhar melhor?
Obrigado