Converta HTML para PDF com 06 linhas de Código

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+

Boa, funcionou mas com avoid ao invés de never. Valeu :thumbup: CSS é meu bloqueio mental hehe.

[quote=EderBaum]Coloquei o projeto Eclipse todinho aqui: https://dl.getdropbox.com/u/15403/Html2PDF.zip

Basta dar uma ajustadinha no ClassPath que vai funcionar.[/quote]

Eder ou alguém sabe como forçar a criação do pdf em paisagem ao invés de retrato?

Obrigado a todos.

Keldjan Alves

Mas tu já não estava usando o avoid?

T+

[quote=Keldjan][quote=EderBaum]Coloquei o projeto Eclipse todinho aqui: https://dl.getdropbox.com/u/15403/Html2PDF.zip

Basta dar uma ajustadinha no ClassPath que vai funcionar.[/quote]

Eder ou alguém sabe como forçar a criação do pdf em paisagem ao invés de retrato?

Obrigado a todos.

Keldjan Alves[/quote]

Dá um olhada na API do iText pra ver como muda a orientação. Deve ser sobre o ‘Document’ ou no pior dos casos no Renderer. De qualquer forma se descobrir coloca aí.

T+

Mas tu já não estava usando o avoid?

T+[/quote]

Só funcionou ao colocar dentro da class box_item, e antes do _width, que alguns browsers ignoram.

Podes colocar um exemplo de como tu ajustou?

Valeu, T+

[code]

.box .box_divs .box_item { background: #F7FFFF; border: 2px solid #CCCCCC; margin-bottom: 5px; padding: 3px; clear: both; page-break-inside:avoid; _width: 100%; } [/code]

[quote=iktuz][quote=Keldjan][quote=EderBaum]Coloquei o projeto Eclipse todinho aqui: https://dl.getdropbox.com/u/15403/Html2PDF.zip

Basta dar uma ajustadinha no ClassPath que vai funcionar.[/quote]

Eder ou alguém sabe como forçar a criação do pdf em paisagem ao invés de retrato?

Obrigado a todos.

Keldjan Alves[/quote]

Dá um olhada na API do iText pra ver como muda a orientação. Deve ser sobre o ‘Document’ ou no pior dos casos no Renderer. De qualquer forma se descobrir coloca aí.

T+[/quote]

Opa,

Tentei verificar. O Itext possui propriedade de orientação para geração do PDF.
Já no código mostrado por Eder o ITextRenderer, o qual possui o método createPDF(), não possui no seu core nenhum método que dê suporte a essa escolha de geração portrait ou landscape.
Tentei até usar pelo construtor ITextRenderer(float dotsPerPoint, int dotsPerPixel), mas não consegui.

Obrigado pela idéia.
Assim que descobrir esse negocio, eu aviso aqui.

Abraços,
Keldjan Alves

Boa tarde comu.

Estou com outro problema na geracao do PDF, no momento que passo uma string por parametro para o “com.lowagie.text.pdf.PdfReader”, como no exemplo abaixo:

// input sera instanciado utilizando o setInput()
private byte[] input;
...
ByteArrayOutputStream out = new ByteArrayOutputStream();
Document document = new Document();
PdfCopy copy = new PdfCopy(document, out);
document.open();

String str = new String(input)
PdfReader reader = new PdfReader(new ByteArrayInputStream(str.getBytes()));
copy.addPage(copy.getImportedPage(reader, 1));

document.close();
out.flush();
out.close();

Porém qdo executo o codigo acima para gerar um PDF, ele gera um arquivo de PDF em branco, e isso soh ocorre no caso de converter os bytes para String. Alguém sabe o por que?

Galera, sou novo aqui.
To tentando usar o exemplo do inicio do post.
Quando uso numa classe stand alone, eu consigo instanciar o ITextRenderer numa boa, mas quando estou dentro de uma classe no server side, dá um stackoverflow gigante.

Alguém tam alguam idéia do que seja?

Valew

segue o stack do erro:
er.java:288)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:199)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:233)
at java.util.logging.StreamHandler.flush(StreamHandler.java:238)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:101)
at java.util.logging.Logger.log(Logger.java:465)
at com.ibm.ejs.ras.Tr.logToJSR47Logger(Tr.java:1592)
at com.ibm.ejs.ras.Tr.systemErr(Tr.java:910)
at com.ibm.ejs.ras.SystemErrStream.dispatchEvent(SystemErrStream.java:236)
at com.ibm.ejs.ras.SystemStream.write(SystemStream.java:286)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlushBuffer(StreamEncoder.java:282)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlush(StreamEncoder.java:288)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:199)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:233)
at java.util.logging.StreamHandler.flush(StreamHandler.java:238)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:101)
at java.util.logging.Logger.log(Logger.java:465)
at com.ibm.ejs.ras.Tr.logToJSR47Logger(Tr.java:1592)
at com.ibm.ejs.ras.Tr.systemErr(Tr.java:910)
at com.ibm.ejs.ras.SystemErrStream.dispatchEvent(SystemErrStream.java:236)
at com.ibm.ejs.ras.SystemStream.write(SystemStream.java:286)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlushBuffer(StreamEncoder.java:282)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlush(StreamEncoder.java:288)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:199)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:233)
at java.util.logging.StreamHandler.flush(StreamHandler.java:238)
at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:101)
at java.util.logging.Logger.log(Logger.java:465)
at com.ibm.ejs.ras.Tr.logToJSR47Logger(Tr.java:1592)
at com.ibm.ejs.ras.Tr.systemErr(Tr.java:910)
at com.ibm.ejs.ras.SystemErrStream.dispatchEvent(SystemErrStream.java:236)
at com.ibm.ejs.ras.SystemStream.write(SystemStream.java:286)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlushBuffer(StreamEncoder.java:282)
at sun.nio.cs.StreamEncoder$ConverterSE.implFlush(StreamEncoder.java:288)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:199)

podes mandar o codigo ou parte do codigo fonte?

Cara, acho q foi um lance do próprio websphere.
Quando eu instanciava o ITextRenderer, ele usava o Log dele para logar algumas coisas…em alguma parte ele começa a usar o sistema de log do servidor, aí que dava Stack Overflow. Foi só desabilitar o log no arquivo xhtmlrenderer.conf e funcionou.
O código é o mesmo do inicio do post

Pessoal,

para criar o pdf em como eu queria, eu tive de baixar os fontes do core-renderer no flying saucer.
Então, na classe ITextRenderer modifiquei o metodo createPDF() definindo com.lowagie.text.Rectangle firstPageSize = PageSize.A4.rotate();
E para o meu xhtml ficar no tamanho que queria, coloquei:
@page {
size: 15.18in 7.88in;
margin: 0.5in;
}

no css XhtmlNamespaceHandler.

Abraços,
Keldjan Alves