Sempre vejo pessoas procurando por ai como converter HTML para PDF, mas sempre as soluções são obscuras complicadas e não muito “limpas”, as vezes requerendo bibliotecas proprietárias.
Pois então vou lhe dar uma solução com apenas 06 linhas de código que salvará sua alma . Lá vamos nós rápidos e rasteiros. Como o código é mediocremente pequeno vou colocar tudo aqui pra encher linguiça, até os imports
Bem legal…
da pra fazer algo semelhante com xhtml e algumas tags do JBoss Seam…
mas nesse caso vc já escreve o documento utilizando tags que farão com que o documento seja renderizado como pdf…
da até pra colocar gráfico
Não, de forma alguma.
Você pode inclusive entrar um InputStream que aponte para este post aqui neste fórum que possivelmente vai converter este tópico para PDF :-o
Inserção de imagens e tudo mais é tranquilo e simples, porém ele vai usar conexões ai pra “puxar” as imagens.
URL u = new URL ("http://www.lucascorrea.com.br");
//System.out.println (u);
URLConnection conn = u.openConnection();
InputStream is = conn.getInputStream();
OutputStream os = new FileOutputStream("C:\\hello.pdf");
Html2Pdf.convert(is, os);
os.close();
Mais ele não carregar as imagens como vc disse EderBaum
Já sei o que houve. Neste meu exemplo acima eu uso o caminho completo da imagem no “src”, já na sua página é sempre apontado o caminho relativo, e ai não vai mesmo.
OutputStream os = new FileOutputStream(“C:\TEMP\hello.pdf”);
Html2Pdf.convert(is, os);
os.close();
} catch (IOException e) {
// Print out the exception that occurred
System.out.println(e.getMessage());
}
}
}[/code]
e como resultado obtive
[code]Tidy (vers 4th August 2000) Parsing “InputStream”
line 58 column 1 - Warning:
Esqueçam tudo que eu falei sobre converter este POST para PDF.
Veja este erro:
plumbing.exception WARNING:: item at URI file:/img/logo.gif not found
Ele nunca vai achar o arquivo /img/logo.gif pois o programa está rodando em sua máquina, e é nela que este vai ser procurado. Pra funcionar tem que trocar o /img/logo.gif por http://www.guj.com.br/img/logo.gif.
Sacou?
Se testar este exemplo abaixo com imagens, verá que vai dar certo.
OutputStream os = new FileOutputStream("C:\\hello.pdf");
Html2Pdf.convert("<b>Uma Imagem</b>\n\n<br /><img src=\"http://f.i.uol.com.br/folha/informatica/images/0735360.jpg\" />", os);
os.close();
[quote=Nothunt]Eu usei este post titulo de exemplo… :roll:
mas axo que ja estendi…
quer dizer que se se tiver este codigo no servidor logo irá funcionar por inteiro?
e se for uma pagina jsp também funciona? desde que a pagina ja esteja carregada?
obrigado 8)
[/quote]
O retorno de um request HTTP que retorne HTML não tem como saber se esse HTML foi criado através de um JSP, se já era HTML puro, ou qualquer outra coisa. O stream retornado é HTML e pronto. Logo, irá funcionar para JSP também.
O problema aqui é a besteira que eu falei de converter este tópico aqui para PDF.
Não vai dar certo por causa das imagens que usam caminho relativo e não absoluto, portanto:
PELO AMOR DE DEUS NÃO CONVERTA A URL DESTE TÓPICO PARA PDF.
isso pq no final das contas a classe pega o String HTML e nem se dá conta que a imagem que aponta para /img/logo.gif está lá no servidor http://www.guj.com.br, ela “acha” que a coisa tah no seu HD.
Mas repito e repito de novo. Teste isso aqui oh que funciona:
OutputStream os = new FileOutputStream("C:\\hello.pdf");
Html2Pdf.convert("<b>Uma Imagem</b>\n\n<br /><img src=\"http://f.i.uol.com.br/folha/informatica/images/0735360.jpg\" />", os);
os.close();
Exception in thread "main" java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I
at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.setMetricDefaults(ITextFontResolver.java:496)
at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.<init>(ITextFontResolver.java:427)
at org.xhtmlrenderer.pdf.ITextFontResolver.addCourier(ITextFontResolver.java:229)
at org.xhtmlrenderer.pdf.ITextFontResolver.createInitialFontMap(ITextFontResolver.java:209)
at org.xhtmlrenderer.pdf.ITextFontResolver.<init>(ITextFontResolver.java:44)
at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:81)
at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:68)
at br.gov.prodemge.pcnet.pat.comuns.Html2Pdf.convert(Html2Pdf.java:40)
at br.gov.prodemge.pcnet.pat.comuns.Html2Pdf.main(Html2Pdf.java:68)
Isso esta me parecendo algum erro com algum jar…nao sei…as que eu adicionei no projeto são:
core-renderer.jar
iText-2.0.8.jar
itext-paulo-155.jar
minium.jar
Tidy.jar
Se alguem souber…por favor me ajudem…
OutputStream os = new FileOutputStream("C:\\hello.pdf");;
DSHtml2Pdf.convert("<b>AAAAAAAAAAAAAAAA</b>", os);
os.close();
Com o JTidy esta tudo certo, pois quando eu testo o comando tidy.parse() ele me retorna um XHTML correto, sem problemas…
Mais na hora de gerar um PDF ele da o seguinte erro…
[code]
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!
Could not execute action
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at com.opensymphony.xwork.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:353)
at com.opensymphony.xwork.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:208)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:182)
at com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor.intercept(DefaultWorkflowInterceptor.java:125)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.webwork.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:136)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:146)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.AroundInterceptor.intercept(AroundInterceptor.java:32)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:94)
at com.opensymphony.xwork.DefaultActionInvocation.invoke(DefaultActionInvocation.java:180)
at com.opensymphony.xwork.DefaultActionProxy.execute(DefaultActionProxy.java:113)
at com.opensymphony.webwork.dispatcher.DispatcherUtils.serviceAction(DispatcherUtils.java:202)
at com.opensymphony.webwork.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:184)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.NoSuchMethodError: com.lowagie.text.Rectangle.height()F
at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:262)
at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:250)
at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:191)
at br.com.dsystems.util.converter.DSHtml2Pdf.convert(DSHtml2Pdf.java:25)
at br.com.dsystems.util.converter.DSHtml2Pdf.convert(DSHtml2Pdf.java:16)
at br.com.dsystems.ds001.beans.TesteBean.testeVoucher(TesteBean.java:42)
… 50 more[/code]
Não estou entendendo oq está acontecendo…
Outra pergunta…
No seu exemplo vc faz o HTML gerar um arquivo PDF.
O que eu preciso fazer com este conversor é o seguinte.
Pegar uma string com tags HTML, e passar este HTML para PDF e salvar no banco de dados.
Depois disto este codigo em PDF vai ser usado para integrar um relatório q vai ser gerado com o iReport.
Isto é possível com este código q vc deu ?
Se for vai me ajuda muito hehehe =]