Converta HTML para PDF com 06 linhas de Código

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

Pessoas.
Alguém aí faz idéia de como ler o html que vai ser gerado por um servlet para que eu possa usar no código sugerido no inicio do post?

Cara podes dar uma olhada em alguns exemplos neste link:

http://today.java.net/pub/a/today/2006/10/31/combine-facelets-and-flying-saucer-renderer.html

Valew cara, consegui pegar o html do response e gerar o pdf, mas agora quando tento gerar no buffer do response o navegador não consegue abrir como pdf.

Alguém aí tem alguma idéia? Quando escreve num arquivo em meu sistema de arquivos…funciona, gera o pdf q é uma beleza, mas quando tento enviar pro browser, zoa tudo…

Aqui esta o código:

 resp.setContentType("application/pdf");
        	ContentCaptureServletResponse responseWrapper = new ContentCaptureServletResponse(resp);
        	chain.doFilter(req, responseWrapper);
        	InputStream input = new ByteArrayInputStream(responseWrapper.getContent().getBytes());
        	OutputStream output = responseWrapper.getResponse().getOutputStream();
        	
        	try {
				ReportUtil.parseJspToPdf(input, output);
			} catch (DocumentException e) {
				throw new ServletException(e);
			}
			output.flush();

tenta fazer assim:

[code]
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();
 // fechar o arquivo para liberar a leitura para browser
 writer.close();  [/code]

Neste caso estou usando JSF e o atributo out possui os bytes do pdf gerado, mas creio que a unica linha de codigo que esta faltando no seu code seja o:

 output.close(); 

logo apos o flush.

Testa ae qq coisa avisa 8)

Entaum pessoal,
v6 tem alguma ideia de como posso resolver o problema dos bytes de string para geracao de PDF?

outro problema que encontrei foi quando tentei gerar uma pagina com varias tables ele não quebra a pagina, ele simplesmente n exibi o resto dos htmls. Alguém ja teve um prob desses?

desde ja vlw…

Bom descobri o problema, estava usando o PdfCopy para add novas paginas usando o método addPage, com isso ele entende que vc que apenas add uma pagina, que eh bem lógico.

Substituir e funcionou. Ainda n conseguir para cada pagina ter um cabacalho e rodape, alguem ja fez isso?
Vai o css que estou usando.

@page {
 size: 8.27in 11.69in;
 margin: 0.25in;
 -fs-flow-top: 'header';
 -fs-flow-bottom: 'footer';
 border: thin; 
}

#footer {
font-size: 90%; font-style: italic; 
position: absolute; top: 0; left: 0;
-fs-move-to-flow: "footer";
}

Tem alguma coisa errada?

vlw