<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GustavoHenrique.net &#187; pdf</title>
	<atom:link href="http://blog.gustavohenrique.net/tag/pdf/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.gustavohenrique.net</link>
	<description>Tecnologia e Software Livre</description>
	<lastBuildDate>Mon, 05 Mar 2012 10:50:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Django usando Pisa para converter HTML para PDF</title>
		<link>http://blog.gustavohenrique.net/2010/02/django-usando-pisa-para-converter-html-para-pdf/</link>
		<comments>http://blog.gustavohenrique.net/2010/02/django-usando-pisa-para-converter-html-para-pdf/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 18:02:49 +0000</pubDate>
		<dc:creator>gustavohenrique</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[pisa]]></category>

		<guid isPermaLink="false">http://www.gustavohenrique.net/brogui/?p=235</guid>
		<description><![CDATA[Pisa é um conversor de HTML/XHTML/CSS para PDF, escrito em Python e baseado nas bibliotecas Reportlab, PyPDF, TechGame Networks CSS e HTML5lib. Seu foco principal não é gerar páginas perfeitas para impressão, mas utilizar HTML e CSS para gerar PDFs dentro de aplicações. A instalação pode ser feita através do código no site do projeto [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.gustavohenrique.net/wp-content/uploads/2010/02/tower_pisa.jpg"><img src="http://blog.gustavohenrique.net/wp-content/uploads/2010/02/tower_pisa.jpg" alt="Torre de Pisa" title="Torre de Pisa" width="130" height="200" class="aligncenter size-full wp-image-236" /></a></p>
<p>Pisa é um conversor de HTML/XHTML/CSS para PDF, escrito em Python e baseado nas bibliotecas Reportlab, PyPDF, TechGame Networks CSS e HTML5lib. Seu foco principal não é gerar páginas perfeitas para impressão, mas utilizar HTML e CSS para gerar PDFs dentro de aplicações.<br />
A instalação pode ser feita através do código no <a href="http://pypi.python.org/pypi/pisa/" target="_blank">site do projeto</a> ou pelo comando <code>easy_install pisa</code>.</p>
<p>Crie um arquivo chamado <code>report.py</code> dentro do diretório do projeto contendo o código abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
<span style="color: #ff7700;font-weight:bold;">from</span> django <span style="color: #ff7700;font-weight:bold;">import</span> http
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span>.<span style="color: black;">loader</span> <span style="color: #ff7700;font-weight:bold;">import</span> get_template
<span style="color: #ff7700;font-weight:bold;">from</span> django.<span style="color: black;">template</span> <span style="color: #ff7700;font-weight:bold;">import</span> Context
<span style="color: #ff7700;font-weight:bold;">import</span> ho.<span style="color: black;">pisa</span> <span style="color: #ff7700;font-weight:bold;">as</span> pisa
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">cStringIO</span> <span style="color: #ff7700;font-weight:bold;">as</span> <span style="color: #dc143c;">StringIO</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">cgi</span>, <span style="color: #dc143c;">os</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> fetch_resources<span style="color: black;">&#40;</span>uri, rel<span style="color: black;">&#41;</span>:
    path = <span style="color: #483d8b;">'/path/para/diretorio/contendo/imagens/a/serem/exibidas'</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> path
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> write_to_pdf<span style="color: black;">&#40;</span>template_src, context_dict, filename<span style="color: black;">&#41;</span>:
    template = get_template<span style="color: black;">&#40;</span>template_src<span style="color: black;">&#41;</span>
    context = Context<span style="color: black;">&#40;</span>context_dict<span style="color: black;">&#41;</span>
    html  = template.<span style="color: black;">render</span><span style="color: black;">&#40;</span>context<span style="color: black;">&#41;</span>
    result = <span style="color: #dc143c;">StringIO</span>.<span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    pdf = pisa.<span style="color: black;">pisaDocument</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">StringIO</span>.<span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span>html.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;UTF-8&quot;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>, result, link_callback=fetch_resources<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> pdf.<span style="color: black;">err</span>:
        response = http.<span style="color: black;">HttpResponse</span><span style="color: black;">&#40;</span>mimetype=<span style="color: #483d8b;">'application/pdf'</span><span style="color: black;">&#41;</span>
        response<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Content-Disposition'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'attachment; filename=%s.pdf'</span> <span style="color: #66cc66;">%</span> filename
        response.<span style="color: black;">write</span><span style="color: black;">&#40;</span>result.<span style="color: black;">getvalue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> response
    <span style="color: #ff7700;font-weight:bold;">return</span> http.<span style="color: black;">HttpResponse</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Problema ao gerar PDF: %s'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">cgi</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>html<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>E agora, dentro de uma <code>view</code>, é preciso importar o arquivo <code>report.py</code> e chamar a função <code>write_to_pdf</code> para fazer a conversão:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># views.py</span>
<span style="color: #ff7700;font-weight:bold;">from</span> report <span style="color: #ff7700;font-weight:bold;">import</span> write_to_pdf
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> listar_clientes_cadastrados<span style="color: black;">&#40;</span>request<span style="color: black;">&#41;</span>:
    clientes = Cliente.<span style="color: black;">objects</span>.<span style="color: #008000;">all</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> write_to_pdf<span style="color: black;">&#40;</span><span style="color: #483d8b;">'relatorio.html'</span>, <span style="color: black;">&#123;</span><span style="color: #483d8b;">'clientes'</span>: clientes<span style="color: black;">&#125;</span>, <span style="color: #483d8b;">'nome_do_arquivo_pdf'</span><span style="color: black;">&#41;</span></pre></div></div>

<p>A função <code>write_to_pdf</code> recebe como parâmetro o nome do arquivo HTML que será convertido, as variáveis que serão tratadas dentro desse arquivo e o nome que o arquivo PDF sem a extensão. Retorna o download do arquivo PDF.</p>
<p>Conforme citado no início do post, a conversão não é perfeita. Por exemplo, às vezes uma tabela apresenta mínimas deformações, não fica igual como na versão HTML. Apesar disso Pisa é uma ótima solução que muitas vezes ajuda bastante e, como puderam ver, é muito fácil de usar.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.gustavohenrique.net/2010/02/django-usando-pisa-para-converter-html-para-pdf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

