Converta HTML para PDF com 06 linhas de Código

Estou com o mesmo erro do camarada acima!

[quote]Tidy (vers 4th August 2000) Parsing “InputStream”
line 1 column 1 - Warning: inserting missing ‘title’ element

InputStream: Document content looks like HTML 3.2
1 warnings/errors were found!

Exception in thread “main” java.lang.NoSuchMethodError: com.lowagie.text.Rectangle.height()F
[/quote]

[]s

Olha, se for executado esse meu código vai aparecer estes [color=red]WARNINGS [/color].

[code]Tidy (vers 4th August 2000) Parsing “InputStream”
line 1 column 1 - Warning: inserting missing ‘title’ element

InputStream: Document content looks like HTML 2.0
1 warnings/errors were found!

plumbing.render INFO:: Using CSS implementation from: org.xhtmlrenderer.context.StyleReference
plumbing.load INFO:: TIME: parse stylesheets 312ms
plumbing.match INFO:: media = print
plumbing.match INFO:: Matcher created with 119 selectors[/code]

Mas são apenas ALERTAS. Se vc for no seu OutPut (C:\teste.pdf) o arquivo vai estar lá sim, pois o Tidy trata de corrigir esses erros sózinho.

Vai ai novamente meu códico completo e FUNCIONANDO!!

[code]package com.ederbaum.pdf;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;

import org.w3c.dom.Document;
import org.w3c.tidy.Tidy;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;

/**

  • @author Eder Baum

*/
public class Html2Pdf {

public static void convert(String input, OutputStream out) throws DocumentException{
    convert(new ByteArrayInputStream(input.getBytes()), out);
}

public static void convert(InputStream input, OutputStream out) throws DocumentException{
	Tidy tidy = new Tidy();        	
	Document doc = tidy.parseDOM(input, null);
    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocument(doc, null);
    renderer.layout();       
    renderer.createPDF(out);        		
}	

}[/code]

Ai vc usa assim, que VAI FUNCIONAR!!

Html2Pdf.convert("<h1>Hello PDF</h1>", new FileOutputStream("C:\\teste.pdf"));

Isso é tipico de alguma biblioteca antiga.
Tá dizendo que o método “height()” não existe na classe “com.lowagie.text.Rectangle”.

Baixe denovo esse Jar que deve funfar.

Ahhh, aceita CSS ai sim, tipo:

Html2Pdf.convert("&lt;h1 style='color:red'&gt;Hello PDF&lt;/h1&gt;", new FileOutputStream("C:\\teste.pdf"));

Ederbaum…eu baixei todos os JARs novamente…estão todos nas últimas versões, olhe a lista de JARs que eu peguei:

  • iText-2.1.1.jar
  • iText-rtf-2.1.1.jar
  • core-renderer.jar
  • core-renderer-minimal.jar
  • itext-paulo-155.jar
  • minium.jar
  • Tidy.jar
  • iText-rups-2.1.1.jar
  • iText-toolbox-2.1.1.jar

A seguinte mensagem de Alerta de de erros foi a seguinte(O código é igual ao seu, copiei e colei):

[quote]Tidy (vers 4th August 2000) Parsing “InputStream”
line 1 column 1 - Warning: inserting missing ‘title’ element

InputStream: Document content looks like HTML 4.01
1 warnings/errors were found!

plumbing.render INFO:: Using CSS implementation from: org.xhtmlrenderer.context.StyleReference
plumbing.load INFO:: TIME: parse stylesheets 344ms
plumbing.match INFO:: media = print
plumbing.match INFO:: Matcher created with 118 selectors
Exception in thread “main” java.lang.NoSuchMethodError: com.lowagie.text.Rectangle.height()F
at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:237)
at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:225)
at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:173)[/quote]

[]s

Rapaz, tem Jars demais ai nessa coisa.

Olhe a abertura deste post, e conte quantos jars eu apresento: 03

[quote]core-renderer.jar
itext-155.jar
Tidy.jar[/quote]

Este seu erro já tive em outros códigos, vai ter que ralar e eliminar tudo de excesso.

Cara, é porque você deu os Links não especificou os JARs exatos para serem colocados no CLASSPATH

Olhando estes JARs está faltando um que eu não consegui encontrar, o “itext-155.jar”, entrei na pagina pra fazer o download http://sourceforge.net/project/showfiles.php?group_id=15255&package_id=12596 mas não encontrei, se não for te encher o saco tem como vc me mandar por email?

Coloquei o projeto Eclipse todinho aqui: https://dl.getdropbox.com/u/15403/Html2PDF.zip

Basta dar uma ajustadinha no ClassPath que vai funcionar.

Cara! Foi só colocar seus JARs no meu CLASSPATH que funfou belezinha!!!

Estranho eu não achar o “itext-155.jar” na lista de links que coloquei…

masss…OBRIGADO, show de bola mesmo!!

[]s

Olá,

Testei a geração com a versão iText-2.1.2u.jar, mas dá erro. Já com a versão itext2.0.4.jar (que é o que temos em produção :D) funciona também.

Vou tentar ajustar o projeto do eclipse.

Boa tarde comu,

estou com um problema na geracao do PDF utilizando o IText. Gostaria de saber como poderia fazer para impirmir em paginas diferentes cada item de minha lista, claro que essa lista é uma lista de string’s HTML’s. Vai abaixo o codigo de como estou fazendo:

[code]/**
*

  • @param inputList

  • @throws DocumentException doc

  • @throws IOException io
    */
    public static void createPDF(List inputList)
    throws DocumentException, IOException {
    ITextRenderer renderer = new ITextRenderer();
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int initialPage = 1;
    for (InputStream input : inputList) {
    Tidy tidy = new Tidy();
    Document doc = tidy.parseDOM(input, null);

     renderer.setDocument(doc, null);
     renderer.layout();
     if (initialPage > (inputList.size())) {
     	renderer.createPDF(out, false);
     	renderer.writeNextDocument(initialPage - 1);
     } else {
     	renderer.createPDF(out);
     }
     initialPage++;
    

    }
    HttpServletResponse response = (HttpServletResponse) FacesContext
    .getCurrentInstance().getExternalContext().getResponse();
    response.reset();
    response.setContentType(“application/pdf”);

    //escreve no response o PDF gerado
    PrintWriter writer = response.getWriter();
    for (int i = 0; i < out.toByteArray().length; i++) {
    writer.write(out.toByteArray()[i] & 255);
    if ((i % 1000) == 0) {
    out.flush();
    }
    }
    writer.flush();
    writer.close();
    } [/code]

neste código estou retornando para uma pagina em branco, onde será exibido o PDF.
Os jar’s que estou usando:
core-renderer.jar
Tidy.jar
itext-155.jar

Acho que podes ajustar a classe para receber um array de páginas htmls e cada uma delas ser processada separadamente. Eu faço desta forma.

mas ae, ele não geraria em varios PDF’s? Ele atende meu problema?

Esse inputList contem as paginas…

Bem, então não sei se eu é que entendi o teu problema. Se tu tens uma String html e usar a implementação na forma que está no tópico ele vai gerar um único arquivo. Se quiseres separar em vários, então vais ter de refazer a chamada n vezes. É isto?

Acho que agora está um pouco mais claro. Acho que pra conseguir o que tu pretende podes formatar o html para distribuir os elementos espaçados para caber em cada página. Então a cada quebra de página que ele fizer cada elemento será colocada em uma página. Não acho que seja a melhor solução mas é o que me ocorre agora. De qualquer forma fazer este controle dentro da implementação também gostaria de saber se e como é possível.

T+

Testei para cada item da lista chamar o create, porem ele retornou apenas o ultimo item :(.
Mas vou continuar testando, de outras formas de gerar sem a necessidade de gerar com espaços para preencher o PDF. Mas mesmo assim vlw :slight_smile:

Tranqüilo… só não esquece de postar a solução caso tu resolva o problema. Don´t be a leecher! :wink:

T+

iktuz, conseguir encontrar algo bem interesante para resolver tal problema.
Vai abaixo o código para criacao do pdf em várias paginas.

[code]/**
*
* @param inputList
* @param response
* @throws DocumentException doc
* @throws IOException io
*/
public static void createPDF(List inputList)
throws DocumentException, IOException {

	ITextRenderer renderer = new ITextRenderer();
	
	ByteArrayOutputStream out = new ByteArrayOutputStream();

            //cria o document que irah receber a concatenacao dos PDF's
	com.lowagie.text.Document document = new com.lowagie.text.Document();
	PdfCopy copy = new PdfCopy(document, out);
	document.open();
	
	for (InputStream input : inputList) {
		// renderiza e cria o PDF conforme os HTML's
		Tidy tidy = new Tidy();
		Document doc = tidy.parseDOM(input, null);
		renderer.setDocument(doc, null);
		renderer.layout();
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		renderer.createPDF(baos);
		
		// para cada pdf gerado add no PDF principal, que serah mostrado para o user
		PdfReader reader = new PdfReader(baos.toByteArray());
		copy.addPage(copy.getImportedPage(reader, 1));
	}
	
	// fecha o documento para poder o user visualizar
	document.close();
	
	HttpServletResponse response = (HttpServletResponse) FacesContext
			.getCurrentInstance().getExternalContext().getResponse();
	response.reset();
	response.setContentType("application/pdf");
	
	//escreve no response o PDF gerado
	PrintWriter writer = response.getWriter();
	for (int i = 0; i < out.toByteArray().length; i++) {
		writer.write(out.toByteArray()[i] & 255);
		if ((i % 1000) == 0) {
			writer.flush();
		}
	}
	writer.flush();
	writer.close();
}[/code]

fonte: http://www.1t3xt.info/examples/itext-in-action.php

Vlw. Espero que também lhe ajude.

Muito bom! :thumbup:

Eu uso um template velocity para gerar a saída em html para depois gerar o pdf. É uma exportação de uma listagem de uma determinada página do sistema. Tudo funciona bem. O problema é que pode acontecer de uma ocorrência da lista ficar quebrada em duas páginas.
Acho que fica mais fácil vendo o template velocity. Cada

CONTEUDO
é um elemento da lista. Essa div acontece por quebrar em duas páginas, quero evitar isso. Tentei usar css e não consegui. Alguém tem sugestão?

O template velocity:

<style type="text/css">
.box {
    clear: both;
}

.box .box_divs {
    padding: 10px;

}

.box .box_divs .box_item {
    background: #F7FFFF;
    border: 2px solid #CCCCCC;
    margin-bottom: 5px;
    padding: 3px;
    clear: both;
    _width: 100%;
}
</style>

<html>
	<body>
		<div class="box">
			<div class="box_divs" id="search">
				#foreach (\$referenciaBibliografica in \$referenciasBibliograficas)
					<div class="box_item" style="page-break-inside: avoid">
						<table width="100%">
							<tr>
								<td width="100%">
									\$referenciaBibliografica
								</td>
							</tr>
						</table>
					</div>
				#end 
			</div>
		</div>
	</body>
</html>

Dando uma olhada por aí vi isto:

<div style="page-break-inside:never">

Testa pra ver.

T+