Quebra de linha em PDF

929 views
Skip to first unread message

Fabiano Almeida

unread,
Oct 22, 2014, 12:45:01 PM10/22/14
to web2py-us...@googlegroups.com
Boa tarde,

Estou gerando tabelas em PDF com pyFPDF segundo o Sample Table Listing que consta em https://code.google.com/p/pyfpdf/wiki/Web2Py#Sample_Table_Listing.

Quando o texto a ser inserido na coluna cabe no tamanho o exemplo funciona perfeitamente, entretanto se precisa colocar um texto grande, ao invés de ter uma quebra de linha na célula, o texto se sobrepõe às demais colunas.

O código é:

def listing():
    response
.title = "web2py sample listing"
   
   
# define header and footers:
    head
= THEAD(TR(TH("Header 1",_width="50%"),
                    TH
("Header 2",_width="30%"),
                    TH
("Header 3",_width="20%"),
                    _bgcolor
="#A0A0A0"))
    foot
= TFOOT(TR(TH("Footer 1",_width="50%"),
                    TH
("Footer 2",_width="30%"),
                    TH
("Footer 3",_width="20%"),
                    _bgcolor
="#E0E0E0"))
   
   
# create several rows:
    rows
= []
   
for i in range(1000):
        col
= i % 2 and "#F0F0F0" or "#FFFFFF"
        rows
.append(TR(TD("Row %s" %i),
                       TD
("Um texto realmente longo provoca a sobreposição de outras colunas", _align="center"),
                       TD
("%s" % i, _align="right"),
                       _bgcolor
=col))

   
# make the table object
    body
= TBODY(*rows)
    table
= TABLE(*[head,foot, body],
                  _border
="1", _align="center", _width="100%")

   
if request.extension=="pdf":
       
from gluon.contrib.pyfpdf import FPDF, HTMLMixin

       
# define our FPDF class (move to modules if it is reused  frequently)
       
class MyFPDF(FPDF, HTMLMixin):
           
def header(self):
               
self.set_font('Arial','B',15)
               
self.cell(0,10, response.title ,1,0,'C')
               
self.ln(20)
               
           
def footer(self):
               
self.set_y(-15)
               
self.set_font('Arial','I',8)
                txt
= 'Page %s of %s' % (self.page_no(), self.alias_nb_pages())
               
self.cell(0,10,txt,0,0,'C')
                   
        pdf
=MyFPDF()
       
# first page:
        pdf
.add_page()
        pdf
.write_html(str(XML(table, sanitize=False)))
        response
.headers['Content-Type']='application/pdf'
       
return pdf.output(dest='S')
   
else:
       
# normal html view:
       
return dict(table=table)}}}
Como fazer para que o texto longo seja quebrado em várias linhas para caber na célula sem sobrepor outras? Já tentei inserir o \n e não funcionou.

Grato pela atenção,

Fabiano

Diogo Munaro

unread,
Oct 22, 2014, 1:00:08 PM10/22/14
to web2py-us...@googlegroups.com
Acabei de fazer isso nesse projeto: https://github.com/dmvieira/web2py-translate/blob/master/applications/web2py_translate/controllers/default.py

```
import textwrap

XML('<br>'.join(textwrap.wrap(text,100)))
```

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo "web2py-users-brazil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Fabiano Almeida

unread,
Oct 22, 2014, 1:13:19 PM10/22/14
to web2py-us...@googlegroups.com
Valeu Diogo,

Vou testar aqui!

Grato,

Fabiano.

Fabiano Almeida

unread,
Oct 22, 2014, 1:54:11 PM10/22/14
to web2py-us...@googlegroups.com
Em 22 de outubro de 2014 14:59, Diogo Munaro <diogo....@gmail.com> escreveu:
XML('<br>'.join(textwrap.wrap(text,100)))

Quase funcionou, faz realmente a quebra de linha, mas quebra o resto da linha inteira, e não apenas dentro da célula. Assim o conteúdo das células sequenciais ficam alinhas com a última linha que foi quebrada.

Screenshot do resultado PDF nesse link: http://pbrd.co/1wapUTv

Se acessar diretamente a tabela em HTML sem gerar o PDF, funciona corretamente, o problema é quando gero o PDF.

Tem como criar a view normalmente (HTML) e depois converter para PDF?

Alguma outra sugestão?


Fabiano Almeida

unread,
Oct 22, 2014, 2:08:01 PM10/22/14
to web2py-us...@googlegroups.com
Esqueci de mostrar o código que testei:

import textwrap


...
    text = ("Um texto realmente longo provoca a sobreposição de outras colunas"
    text = XML('<br>'.join(textwrap.wrap(text,31)))
    rows.append(TR(TD("Row %s" %i),
                   TD(text, _align="center"),
                   TD("%s" % i, _align="right"),
                   _bgcolor=col)) 
...

Grato,

Fabiano.

Ari Sobel

unread,
Oct 22, 2014, 2:31:42 PM10/22/14
to web2py googlegroups
Vc realemnte precisa passar de HTML pra PDF?

Caso nao, o metodo multicell


Fabiano Almeida

unread,
Oct 22, 2014, 2:41:52 PM10/22/14
to web2py-us...@googlegroups.com
Boa tarde Ari,

Não preciso necessariamente converter uma view HTML para PDF, foi apenas uma possibilidade que me ocorreu...

Tem algum exemplo do uso do multicell? estou encontrando eemplos somente em php...

Grato,

Fabiano.

Ari Sobel

unread,
Oct 22, 2014, 3:36:20 PM10/22/14
to web2py googlegroups
Ola 
Tenho sim
Veja esse codigo[1]
São pedaços de uma função minha dentro do projeto.
Pode nao funcionar, pois copiei e colei apenas umas partes. Mas tentei colocar algo que funcionasse. Podem estar faltando Imports, ou a identação nao estar exata, mas é um começo.

Vej a na linha 71 o uso do multi_cell.

Nesse código, importei também a PIL, que é uma Lib pra te permitir adicionar imagens (como na linhas 16/17 - onde ele coloca um Logo no Cabeçalho).

De "lambuja" ainda de coloquei parte do código que permite escrever com "acentos" em portugues. Suei bastante pra chegar nisso. (linha 58 por exemplo).

As fontes Dejavu são um tipo de fonte que te permite escrever com acentos tb - o tal de unicode.

Bom, faça bom proveito qqer dúvida tamos aí.

Ah, conforme escrivi em Post anterior, quando foi apresentado  uma idéia de trabalhar com bibliotecas JS pra gerar PDF. Insisto que vale a pena tentar usar o Fpdf, que, apesar de chatinho, quando pegar o jeito, te permite usar Python, paginação, imagens, gravar a imagem numa pasta (a exemplo desse meu código ali).


veja esses outros links [2][3] tb:

Fabiano Almeida

unread,
Oct 22, 2014, 3:44:53 PM10/22/14
to web2py-us...@googlegroups.com
Obrigado Ari, vou estudar o material q vc me enviou!

Att.,

Fabiano.
Reply all
Reply to author
Forward
0 new messages