Jasper ou iTExt para o meu problema?

8 respostas
Y

Ola a todos! Bom eu não sabia onde colocar esse topico e por isso coloquei em uma area mais proxima do problema.

Bem, meu problema é o seguinte: tem informações no banco de dados que sao gravas com tags HTML. Então eu tenho que resgatar esse texto com tags HTML leva-lo para o JASPER ou ITEXT e exibi-lo com essa formatação, ou seja, com negrito, fonte maior etc etc. Usando o iReport eu nao sejo solução pra isso…alguem sabe como resolver?

Valeu

8 Respostas

M

não existe uma API para fazer este “parse”.
Você pode tentar desta forma:

Eu também estou com este problema. Como meu html não tem CSS e JavaScript, estou criando um parse que interpreta o html e gera o pdf com as mesmas formatações usando o iText.

C

Eu postei há algum tempo sobre o Flying Saucer, um renderizador HTML (inclusive para PDF). Tô usando e curtindo!

https://xhtmlrenderer.dev.java.net/

Y

Pow valeu pela dica!!!

Y

CintiaDR:
Eu postei há algum tempo sobre o Flying Saucer, um renderizador HTML (inclusive para PDF). Tô usando e curtindo!

https://xhtmlrenderer.dev.java.net/

Eu usei o Flying e ele transforma com uma linha de codigo uma pagina HTML em PDF…muito bom. Mas meu problema é mais chato…eu tenho um relatorio que tem 1 ou 2 campos que vao precisar de formatação html…essa formatacao ja vem do banco, ou seja, não é pegar uma pagina HTML e transformar em PDF…serão apenas alguns campos. Então eu tenho que montar meu relatorio na mao…Vc teria algum exemplo disso?

C

Bom, se forem poucas formatações, tipo bold, italic, etc, vc pode procurar pela opção ‘is styled text?’ que tem o Ireport.

No link http://www.jasperforge.org/sf/wiki/do/viewPage/projects.jasperreports/wiki/Samples tem, lá em baixo, o Styled Text Sample; mas para mim não servia prq eu precisava de uma tabela.

Eu quase não usei, pode ser útil para vc. Mas não sei se a formatação pode vir do banco, porque eu mal usei.

Minha dúvida no fórum de jasper: http://www.jasperforge.org/index.php?option=com_joomlaboard&Itemid=215&func=view&catid=8&id=31671#31671

Boa sorte!

R

Então eu estou com o mesmo problema…

Eu usei este IS STYLED TEXT? do iREPORT… quando o PDF é visualizado no JASPER VIEWER não há problemas, fica tudo certo. Mas quando eu visualizo o relatório no Adobe Reader, as tags aparecem como parte do texto, e não como texto estilizado…

Vc conseguiu resolver o seu problema como ?
Fazendo um conversor de HTML para PDF ? ou conseguiu usar o iReport ?

Obrigado, aguardo respostas…
Rodrigo Kerkhoff

C

Bom, juro que não entendi o seu problema, e provavelmente pode ser só um pequeno problema de configuração do Jasper ou falta de fontes no PDF. Sei lá. Mas mesmo assim vou explicar meu problema… Posta aí seus códigos e exemplos, pra facilitar.

Eu tinha um layout (em html), e uns "trechos" dele iam ser recuperados da base. Esses trechos não eram só estilo, e incluiriam tabelas, divs, etc.
Por, exemplo, o layout.

<html>
<body>
<table border="1">
  <tr>
    <td>$conteudo1</td>
  </tr>
  <tr>
    <td>$conteudo2</td>
  </tr>
</table>
</body>
</html>

E eu substituiria o $conteudo1 e o $conteudo2 por coisas HTML vindas do banco. E eu queria que esse "HTMLzão" gerasse um super pdf.

A solução que usei para lidar com o HTML foi o JTidy, e depois pegar o resultado do JTidy e passar pro XHTMLRenderer.

// criando Árvore inicial
Tidy t = new Tidy();
t.setXHTML(true);
t.setQuiet(true); 
Document xmlDoc = t.parseDOM(new ByteArrayInputStream(resultado.getBytes()), null);

Daí eu recursivamente procurava nesta árvore (xmlDoc) por nodos com o value "$conteudo1" e assim por diante, fazia um parseDOM do conteúdo necessário no banco, e inseria esse novo nó como filho no nó que tinha escrito "$conteudo1".

//nodeDescr é o nodo da árvore que contem, por exemplo, o texto "$conteudo1"
//c.getBytes é o troço que vem do banco. 
Document frag = t.parseDOM(new ByteArrayInputStream(c.getBytes()), null);

Node body = frag.getChildNodes().item(1).getChildNodes().item(1);

					
for (int i = body.getChildNodes().getLength() - 1; i >= 0; i--) {
  Node table = body.getChildNodes().item(i);
  nomeDescr.getParentNode().insertBefore(table,
  nomeDescr.getParentNode().getFirstChild());
}

E daí, é só passar pro XHtmlRenderer:

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(xmlDoc, null); 
renderer.layout();
ByteArrayOutputStream os = new ByteArrayOutputStream();
renderer.createPDF(os);
os.close();

Eu senti muita, muita falta da implementação do Document de métodos que procurassem nodos por id e por valor, então tive que criá-los na mão (busca em profundidade, recursiva, básica, usando casamento de padrões).

Bem da verdade, meu layout tem mais alguns complicadores, como nós $demaisConteudos, que seriam repetidos dinamicamente e etc. Mas eu acertei todos estes detalhes com o JTidy. Não foi simples nem trivial, mas consegui e achei uma boa solução.

R

Opa Cintia.

Valeu pelo post, eu comecei a estudar o Jtidy juntamente com o xhtmlrenderer e vi que realmente isto não era o que eu precisava fazer.
Mais foi bom ter estudado pois agora se eu precisar transformar um código HTML em um PDF eu ja sei o que usar.

O meu problema era o seguinte… tome como exemplo este “TextArea” que eu estou escrevendo agora para responder seu post.
Nele eu posso transformar o texto pra negrito, italico, etc… Que por baixo gera um código HTML.
Eu tenho um parecido na minha aplicação, ele gera esse html e envia para o servidor para gravar no banco de dados. Este texto tanto vai ser visualizado em PDF como em um HTML e dentro do OpenLaszlo. No HTML/OpenLaszlo o texto é visualizado normal, formatado.

O problema com o PDF são as fontes, pela minha dedução…
No iReport, quando você vai escolher a fonte de pdf, você encontra fontes como por exemplo:

  • Helvetica
  • HelveticaBold
  • HelveticaBoldOblique
  • HelveticaOblique

Com isso, a tag html por exemplo não tem efeito nenhum sobre o texto, pois a fonte HelveticaBold deve estar selecionada para o texto ficar em negrito. Isso também ocorre com a tag .
Já as tagas

  • e funcionam normalmente, além de algumas outras que também funcionam mais eu não me lembro de cabeça.

    O que eu estou fazendo por enquanto é gerar um RTF em vez de um PDF. Dai ele gera o texto certo, formatado sem exibir as tags.

    Entendeu o meu problema ?

    Valeu pelo post.
    Rodrigo Kerkhoff

  • Criado 16 de outubro de 2007
    Ultima resposta 22 de abr. de 2008
    Respostas 8
    Participantes 4