Converta HTML para PDF com 06 linhas de Código

138 respostas
EderBaum

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 :D . 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

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;

/**
 * @Autor 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);        		
	}	

}

Se você contar o numero de linhas do 2º método convert, verá que há apenas 06 linhas como prometido, e para usar esta classe, o código é menor ainda:

OutputStream os = new FileOutputStream("C:\\hello.pdf");;
Html2Pdf.convert("<h1 style=\"color:red\">Hello PDF</h1>", os);        	
os.close();

Os jars que vc precisa são estes
Tidy : http://jtidy.sourceforge.net
XHTMLRenderer : https://xhtmlrenderer.dev.java.net/
Itext: http://www.lowagie.com/iText

Espero que tenham divertido-se.

138 Respostas

Thiago_Ananias

Orra cara!! :lol:

Obrigado por compartilhar! esta função já entrou na minha listinha!

[]s

nadilsons

Valeu EderBaum!!!

Mas pelo que vi o documento deve ser xhtml para funcionar, estou certo?

Document doc = tidy.parseDOM(input, null);

Obrigado,

paulovittor23

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 :smiley:

Exemplo.xhtml

&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;

&lt;p:document xmlns:p="http://jboss.com/products/seam/pdf"
            xmlns:ui="http://java.sun.com/jsf/facelets"&gt;
    
    &lt;p:image value="/img/logo.jpg" scalePercent="80" /&gt;
    
    &lt;p:font family="arial" size="12"&gt;
               
        &lt;p:list style="numbered"&gt;
            &lt;ui:repeat value="#{paisList.resultList}" var="pais"&gt;
                &lt;p:listItem&gt;#{pais.nome} - #{pais.estados.size}&lt;/p:listItem&gt;
            &lt;/ui:repeat&gt;
        &lt;/p:list&gt;
        
        &lt;p:barchart title="Gráfico de Barras" 
                    legend="true"
                    width="500" 
                    height="500"&gt;
            &lt;p:series key="estados"&gt;
                &lt;ui:repeat value="#{paisList.resultList}" var="pais"&gt;
                    &lt;p:data key="#{pais.nome}" columnKey="#{pais.nome}" value="#{pais.estados.size}" /&gt;
                &lt;/ui:repeat&gt;
            &lt;/p:series&gt; 
        &lt;/p:barchart&gt;
        
    &lt;/p:font&gt;
    
&lt;/p:document&gt;

Para apresentar o pdf basta vc chamar a página como se fosse uma página, ex: /Exemplo.seam

EderBaum

Exato. o Jtidy é um “HTML Beautifyer”, ai o que vc mandar pra ele, mesmo tags não fechadas, ou textos tirados de Blogs :lol: vai funfar.

Esta é a beleza do código, você não precisa se preocupar com as coisas baixas, basta mandar HTML em não conformidade que o resto o código cuida.

N

Muito obrigado!

Mas se percebi temos de passar o html linha a linha certo?

um abraço de Portugal

EderBaum

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.

correainfo

EderBaum, bom eu nunca fiz isso como eu passo esse topico para ele escrever no pdf

OutputStream os = new FileOutputStream("C:\\hello.pdf");;  
    Html2Pdf.convert("Coloco aki a url ????????????", os);           
    os.close();

Desde ja agradeço atençao.

correainfo

Bom ja consegui escrever de uma url

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

EderBaum

Bem, eu nunca tentei fazer com uma URL, e também não consigo ver onde isto seria necessário.
Mas mandando uma string tipo:

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();

Isto pra mim funcionou perfeitamente, mas minha aplicação está rodando já num servidor na Web.

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.

N

Eu tambem testei.

No netbeans 6.0 criei a classe Html2Pdf

package javaapplication1;


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;  

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);                   
    }     
  
}

e a main

package javaapplication1;

import java.net.*;
import java.io.*;   
import java.io.InputStream;   
import java.io.OutputStream;   
import javaapplication1.Html2Pdf; 

/**
 *
 * @author Admin
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)throws Exception{

        try{
        URL u = new URL("http://www.guj.com.br/posts/list/77682.java");
//System.out.println (u);   
        URLConnection conn = u.openConnection();
        InputStream is = conn.getInputStream();

        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());
    }


    }
}

e como resultado obtive

Tidy (vers 4th August 2000) Parsing "InputStream"
line 58 column 1 - Warning: <table> repeated attribute
line 58 column 1 - Warning: <table> repeated attribute
line 58 column 1 - Warning: <table> repeated attribute
line 58 column 1 - Warning: <table> lacks "summary" attribute
line 61 column 46 - Warning: img lacks "alt" attribute
line 65 column 111 - Warning: trimming empty <iframe>
line 70 column 1 - Warning: <table> lacks "summary" attribute
line 74 column 13 - Warning: <table> lacks "summary" attribute
line 76 column 34 - Warning: <img> lacks "alt" attribute
line 78 column 1 - Warning: <script> isn't allowed in <table> elements
line 78 column 51 - Warning: </script> isn't allowed in <table> elements
line 78 column 51 - Warning: discarding unexpected </script>
line 117 column 34 - Warning: <img> lacks "alt" attribute
line 131 column 9 - Warning: </td> isn't allowed in <body> elements
line 131 column 9 - Warning: inserting implicit <table>
line 131 column 9 - Warning: discarding unexpected </td>
line 134 column 9 - Warning: missing <tr>
line 137 column 1 - Warning: <table> lacks "summary" attribute
line 190 column 2 - Warning: <table> lacks "summary" attribute
line 193 column 13 - Warning: <table> lacks "summary" attribute
line 202 column 13 - Warning: <table> lacks "summary" attribute
line 217 column 13 - Warning: <table> lacks "summary" attribute
line 275 column 97 - Warning: <img> lacks "alt" attribute
line 330 column 1 - Warning: <table> lacks "summary" attribute
line 421 column 51 - Warning: <img> lacks "alt" attribute
line 436 column 1 - Warning: <table> lacks "summary" attribute
line 528 column 1 - Warning: <table> lacks "summary" attribute
line 601 column 37 - Warning: <img> lacks "alt" attribute
line 656 column 1 - Warning: <table> lacks "summary" attribute
line 729 column 158 - Warning: <img> lacks "alt" attribute
line 743 column 1 - Warning: <table> lacks "summary" attribute
line 829 column 1 - Warning: <table> lacks "summary" attribute
line 899 column 38 - Warning: missing </span> before <blockquote>
line 905 column 148 - Warning: <img> lacks "alt" attribute
line 908 column 29 - Warning: discarding unexpected </span>
line 920 column 1 - Warning: <table> lacks "summary" attribute
line 1.016 column 8 - Warning: img lacks "alt" attribute
line 1.021 column 1 - Warning: <table> lacks "summary" attribute
line 1.125 column 8 - Warning: img lacks "alt" attribute
line 1.130 column 1 - Warning: <table> lacks "summary" attribute
line 1.203 column 38 - Warning: missing </span> before <blockquote>
line 1.216 column 29 - Warning: discarding unexpected </span>
line 1.226 column 1 - Warning: <table> lacks "summary" attribute
line 1.296 column 38 - Warning: missing </span> before <blockquote>
line 1.302 column 29 - Warning: discarding unexpected </span>
line 1.312 column 1 - Warning: <table> lacks "summary" attribute
line 1.337 column 25 - Warning: <table> lacks "summary" attribute
line 1.346 column 13 - Warning: <table> lacks "summary" attribute
line 1.363 column 13 - Warning: <table> lacks "summary" attribute
line 1.366 column 13 - Warning: trimming empty <table>
line 1.368 column 13 - Warning: <table> lacks "summary" attribute
line 1.372 column 41 - Warning: <table> lacks "summary" attribute
line 1.397 column 78 - Warning: unescaped & which should be written as &amp;
line 1.457 column 85 - Warning: trimming empty <iframe>
line 1.468 column 8 - Warning: missing </table>

InputStream: Document content looks like HTML proprietary
55 warnings/errors were found!

plumbing.render INFO:: Using CSS implementation from: org.xhtmlrenderer.context.StyleReference
plumbing.css-parse WARNING:: (null#inline_style_1) Invalid URL, no protocol: null#inline_style_1 at line 1. Skipping @import rule.
plumbing.css-parse WARNING:: (null#inline_style_2) Invalid URL, no protocol: null#inline_style_2 at line 1. Skipping @import rule.
plumbing.css-parse WARNING:: (null#inline_style_3) Invalid URL, no protocol: null#inline_style_3 at line 1. Skipping @import rule.
plumbing.css-parse WARNING:: (null#inline_style_4) Invalid URL, no protocol: null#inline_style_4 at line 1. Skipping @import rule.
plumbing.load INFO:: TIME: parse stylesheets  204ms
plumbing.match INFO:: media = print
plumbing.match INFO:: Matcher created with 118 selectors
plumbing.css-parse WARNING:: (style attribute) colspan/rowspan must be greater than zero at line 1. Skipping declaration.
plumbing.css-parse WARNING:: (style attribute) colspan/rowspan must be greater than zero at line 1. Skipping declaration.
plumbing.exception WARNING:: item at URI file:/img/logo.gif not found
plumbing.exception WARNING:: item at URI file:/img/logo.gif not found
plumbing.exception WARNING:: item at URI file:/img/tltl.gif not found
plumbing.exception WARNING:: item at URI file:/img/tlbl.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/xml_button.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/avatar/c591d12b9dbf597d4e38f56c674ecf0e.jpg not found
plumbing.exception WARNING:: item at URI file:/images/avatar/0676f43ba89ef089f43c6f36ca40fa4a.png not found
plumbing.exception WARNING:: item at URI file:/images/avatar/402cac3dacf2ef35050ca72743ae6ca7.jpg not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/avatar/1b84c4cee2b8b3d823b30e2d604b1878.png not found
plumbing.exception WARNING:: item at URI file:/images/avatar/1b84c4cee2b8b3d823b30e2d604b1878.png not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_msnm.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_email.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_msnm.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_email.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_msnm.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_email.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_msnm.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/xml_button.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/c591d12b9dbf597d4e38f56c674ecf0e.jpg not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_msnm.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/0676f43ba89ef089f43c6f36ca40fa4a.png not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/402cac3dacf2ef35050ca72743ae6ca7.jpg not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_email.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_msnm.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/1b84c4cee2b8b3d823b30e2d604b1878.png not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_email.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_msnm.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/1b84c4cee2b8b3d823b30e2d604b1878.png not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_email.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_msnm.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/icon_minipost_new.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbin
g.exception WARNING:: item at URI file:/templates/default/images/icon_up.gif not found
plumbing.exception WARNING:: item at URI file:/images/avatar/b937384a573b94c4d7cc6004c496f919.jpg not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
plumbing.exception WARNING:: item at URI file:/templates/default/images/spacer.gif not found
plumbing.exception WARNING:: item at URI file:/images/transp.gif not found
BUILD SUCCESSFUL (total time: 5 seconds)

Alguma ideia para resolver o problema?

EderBaum

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();

N

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)

cassio

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)

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.

EderBaum

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();

sergiolpf

Galera,

perguntinha básica…

funciona com CSS??? O PDF vai ter a aparencia do bendito CSS? ou quebra?

Alguem testou?

B

No meu esta dando erro no exato momento em que instancio a classe ITextRenderer,o erro esta na linha 6

public static void convert(InputStream input, OutputStream out)
            throws DocumentException {
        Tidy tidy = new Tidy();
        Document doc = tidy.parseDOM(input, null);
       
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver resolver = renderer.getFontResolver();
        try {
			resolver.addFont("C:\\Windows\\Fonts\\TIMES.TTF",
			        BaseFont.IDENTITY_H,
			        BaseFont.NOT_EMBEDDED
			        );
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
        renderer.setDocument(doc, null);
        renderer.layout();
        renderer.createPDF(out);
    }
       
    
    
   public static void main(String[] args) {

       try {

            InputStream in = new FileInputStream(new File("C:\\teste.html"));

            OutputStream out = new FileOutputStream("C:\\hello.pdf");
            try {
                Html2Pdf.convert(in, out);
            } catch (DocumentException e1) {
                e1.printStackTrace();
            }
            out.close();
        } catch (IOException e) {

            System.out.println(e.getMessage());
        }
  
   
        
    }

StackTrace:

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…

B

Solucionei o problema…retirei todos os outros jars do meu class-path e deixei apenas as responsaveis pela renderização e funcionou sem problemas…

R

Hey Eder me esclaece uma dúvida...

eu estou tentando converter o seguinte codigo...

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...

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

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 =]

Obrigado
Aguardo Respostas
Rodrigo Kerkhoff

Thiago_Ananias

Estou com o mesmo erro do camarada acima!

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

[]s

EderBaum

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

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

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!!

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);        		
	}	

}

Ai vc usa assim, que VAI FUNCIONAR!!

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

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"));
Thiago_Ananias

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):

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)</blockquote>

[]s

EderBaum

Rapaz, tem Jars demais ai nessa coisa.

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

core-renderer.jar
itext-155.jar
Tidy.jar

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

Thiago_Ananias

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?

EderBaum

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

Basta dar uma ajustadinha no ClassPath que vai funcionar.

Thiago_Ananias

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

I

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.

S

Vou tentar ajustar o projeto do eclipse.

heberayresds

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:

/**
 * 
 * @param inputList
 * @throws DocumentException doc
 * @throws IOException io
 */
public static void createPDF(List<InputStream> 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();
}

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

I

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.

heberayresds

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

Esse inputList contem as paginas…

I

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+

heberayresds

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:

I

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

T+

heberayresds

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

/**
	 * 
	 * @param inputList
	 * @param response
	 * @throws DocumentException doc
	 * @throws IOException io
	 */
	public static void createPDF(List<InputStream> 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();
	}

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

Vlw. Espero que também lhe ajude.

I

Muito bom! :thumbup:

fiaux

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>
I

Dando uma olhada por aí vi isto:

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

Testa pra ver.

T+

fiaux

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

K

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

Basta dar uma ajustadinha no ClassPath que vai funcionar.

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

I

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

T+

I

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

Basta dar uma ajustadinha no ClassPath que vai funcionar.

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

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+

fiaux

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

T+

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

I

Podes colocar um exemplo de como tu ajustou?

Valeu, T+

fiaux
<style type="text/css">
.box .box_divs .box_item {  
    background: #F7FFFF;  
    border: 2px solid #CCCCCC;  
    margin-bottom: 5px;  
    padding: 3px;  
    clear: both;  
    page-break-inside:avoid;
    _width: 100%;  
}  
</style>
K

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

Basta dar uma ajustadinha no ClassPath que vai funcionar.

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

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+

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

heberayresds

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?

zeronos

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)
heberayresds

podes mandar o codigo ou parte do codigo fonte?

zeronos

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

K

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:

<a class="mention" href="/u/page">@page</a> {

size: 15.18in 7.88in;

margin: 0.5in;

}

no css XhtmlNamespaceHandler.

Abraços,
Keldjan Alves

zeronos

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?

heberayresds

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

zeronos

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();
heberayresds

tenta fazer assim:

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();

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)

heberayresds

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

heberayresds

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…

heberayresds

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

heberayresds

Segue o code modificado.

... //parte do codigo que mudou PdfReader reader = new PdfReader(baos.toByteArray()); for (int i = 0; i < reader.getNumberOfPages(); i++) { copy.addPage(copy.getImportedPage(reader, i + 1)); } ...

heberayresds

Boa tarde comu,

estava tentando, a algumas semanas atras, add uma imagem carregada de uma pasta do meu cpu para a geracao do PDF.
Porem utilizando o iText o imagem n eh carreada quando utilizamos a tag: <img> do html, teremos que usar no atributo SRC o seguinte prefixo:

<img src='file:///C:/tmp/temp.jpg' alt='teste imagem iText' />

como estava tentando colocar diretamente o caminho n rolava, pode ateh ser uma falta de conhecimento da tag, mas, caso alguem tenha o mesmo problema, vai ae minha dica.

heberayresds

o que ainda n conseguir fazer foi add o rodape e cabecalho com o CSS?
Some one have any idea?

tnxs

B

Eu estou tendo problemas com a tag FONT, pois é como se a classe ignorasse essa tag. Tentei utilizar o DropFontTag mas nao adiantou. Gostaria de saber se alguem tem uma solução. Abraço.

heberayresds

deves utilizar CSS para definir os stilos de fontes, sizes etc e tal.

B

Era esse o problema mesmo. Colocando a formatação de cores e fontes em CSS e inline ao arquivo html a classe gera com sucesso o pdf. Unico problema parece ser algumas fontes, mas as 3 familias principais que são serif, sans-serif e monospace funcionam perfeitamente.
Obrigado pela ajuda!

franzao

Boa tarde!
Fiz todo o processo de conversão de HTML para PDF, meu problema é tenho de ler algumas imagens apresentados no PDF de um banco de dados.
Alguém tem uma sugestão de como fazer este processo?
Abraço.

roberiomatos

Galera seguinte, os fontes passados neste tópico realmente funcionam, so que quando tento passar uma string para ser gerado o PDF e nessa string tem acentuação, ele não imprime no PFD a acentuação neim caracteres especiais… alguem poderia me ajudar…?

segue o código que estou fazendo:

String relatorio = "";
		
		relatorio  = "&lt;html&gt;";
		relatorio += "&lt;div align='center'&gt;";
		relatorio += "<img   >";
		relatorio += "&lt;/div&gt;";
		relatorio += "<p>";		
		relatorio += "&lt;h2&gt;OFÍCIO n°. 000/2008&lt;/h2&gt;";		
		relatorio += "&lt;/html&gt;"; 	 
	 
	 
		try {
			OutputStream os = new FileOutputStream(new File(
					"/home/roberiomatos/hello.pdf"));

			Html2Pdf.convert(relatorio, os);
			os.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
EderBaum

Use algo pra converter estes caracteres para HTMLEntities

https://htmlentities.dev.java.net/

Não testei, mas deve funcionar.

S

Olá, boa Tarde Pessoal!!
Somos de uma indústria de grande porte, e estamos com vagas em aberto para Programadores Java. Os interessados favor enviarem o currículo para [email removido]
Aguardo um retorno.

alancasagrande

Sobre css externo, alguém conseguiu? Aqui funcionou colocando o css no próprio html, mas ao usar

<link href="file:///C:/estilo.css" rel="stylesheet" type="text/css" />

ou

@import url("file:///C:/estilo.css");

ocorre o erro:
org.xhtmlrenderer.util.XRRuntimeException: Failed on parsing CSS sheet at file:/C:/estilo.css

obs: quando o caminho está errado, dá uma mensagem específica pra isso.

Obrigado!

Passarinho

Como eu faço para transformar HTML com CSS em PDF???

Só o Html eu consigo mas ele com css não consigo me de alguma dica ai pessoal!

VLW!

elugo

como eu faço para pegar esse relatório gerado e gravar em um banco de dados???
quando eu tenho que anexar um arquivo eu sempre utilizo o fileUpload só que no caso o arquivo não vai ser buscado pelo usuário
ao salvar esse relatório terá que criar e automaticamente gravar como um anexo no banco de dados
alguem poderia me dar uma ajudinha ai?
vlw

elugo

Resolvido!!!

a solução era mais simples do que eu imaginava!
quando passamos o caminho em que queremos que seja criado o arquivo

OutputStream os = new FileOutputStream("C:\\Teste.pdf");
Html2Pdf.convert(buffer.toString(), os);

é só utilizar desta outra forma

ByteArrayOutputStream stream = new ByteArrayOutputStream();
Html2Pdf.convert(rel, stream);

e na hora de setar um atributo do tipo byte é só colocar atributo.set(stream.toByteArray());

vabreu

quero chamar um pagina que roda no meu loucalhoot e manda ela vira .pdf
eu chamo o metodo doPost do servlet que está assim:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

Html2Pdf.convert(request.getParameterValues("xxxxxx"));
		request.getParameter("http://localhost:8080/xxxx/xxxx.do?xxx=1");
											
		        		      
	response.sendRedirect("index.do");	
}

O servlet chama o metodo converte que estpa asssim:

public static void convert(StringBuffer requestURL, String localName) {

try{  
           	OutputStream os = new FileOutputStream("/home/vinicius/teste.pdf");   
       	URL u = new URL ("http://localhost:8080/xxxx/xxxxx.do?xxx=1");  
		URLConnection conn = u.openConnection();  
		InputStream is = conn.getInputStream();
		StringBuffer buffer = new StringBuffer();
		Scanner scanner = new Scanner(is);
        while(scanner.hasNextLine()){buffer.append(scanner.nextLine());}  
        String doc = buffer.toString();  
		Html2Pdf.convert(doc, os);             
		os.close();    
    }  
    catch(FileNotFoundException e){System.out.println("[Arquivo não encontrado.]");e.printStackTrace();}  
    catch(IOException e){e.printStackTrace();}  
    catch(DocumentException e){e.printStackTrace();} 		
}

Ta morrendo no metodo, ou seja tá alguma coisa errada, só que tenho certeza que é no doPost, se alguem me puder ajudar, agradeço.

O endereçamento está assim pq é Linux q eu uso !

rverli

Como eu faço para converter uma página jsp da minha aplicação para pdf ??? :frowning:

L

Olá galera, tou conseguindo gerar o PDF beleza. Tenho somente 1 problema que é justamente referente a textos justificados (

). O PDF não está interpretando essa solicitação.
Agradeço caso alguém possa me ajudar.

J

Estou usando este código e está funcionando certinho…Mas to precisando iserir um rodapé e um cabeçalho na página…como faço ???
com o Document do IText puro eu consigo mas preciso usar o Tidy para obter o html processado…

J

Estou usando este código e está funcionando certinho…Mas to precisando iserir um rodapé e um cabeçalho na página…como faço ???
com o Document do IText puro eu consigo mas preciso usar o Tidy para obter o html processado…

samuelcgms

Edder, muito obrigado pelas informações. Realmente solucionaram meus problemas.

Abraços

S

E ai galera!!
To com um template aqui, passo valores pra ele em java e depois gero outro html e to tentando converter pra PDF mas nao to conseguindo, a imagem de fundo não carrega no PDF quando uso o parametro “background” em uma tag “td”. Ja Tentei colocar uma tag img com o parametro “style = position: absolute” e assim tambem nao deu!

Alguem tem alguma ideia,
desde ja agradeço!

Rafael

lindberg713

Pessoal, estou gerando o PDF a partir de um html. Esta gerando blz, mas ta ocorrendo um problema esta gerando o pdf cortando o conteudo verticalmente. O conteudo é um relatorio, uma tabela, e por exmplo a tabela tem 7 colunas ai o pdf corta e só gera até a metade da 5 por ex. Entao baixei os fontes do core-renderer, e estou tentando ver aqui como faço e onde altero pra poder corrigir isso. Ja coloquei para o tamanho da folha ficar na posição de paisagem mas ele exibiu a folha no formato paisagem com o conteudo da mesma forma, cortado. Solicito a ajuda de vcs para que eu possa resolver esse problema.
Desde Ja agradeço a todos.

S

A questão eh o seguinte!!

Essa biblioteca nao resolve o problema de muitas pessoas.

Descobri uma que é simplesmente perfeita! Sem erro algum

http://www.pd4ml.com/

Porem, paga!

lindberg713

Consegui resolver o problema de aumentar a largura da página no pdf de modo a exibir as colunas que antes nao estavam saindo no pdf.

Para resolver o problema eu coloquei no meu HTML o seguinte:

@page { size: 17.18in 15.88in; margin: 0.25in; -fs-flow-top: "header"; -fs-flow-bottom: "footer"; -fs-flow-left: "left"; -fs-flow-right: "right"; border: thin solid black; padding: 1em; }

No atributo size eu configuro a largura e a altura da página. Aumentando o valor desse atributo o pdf foi gerado com uma página maior e o conteudo extra foi adicionado.

Espero ter ajudado.

lindberg713

Agora estou com um problema na geração do pdf atraves de um html usando o itext. Ele nao esta centralizando os textos definidos no html como aling=“center”. Mesmo os textos dentro de uma div com aling=“center” o pdf nao esta com o texto centralizado.

Agradeço!

Metaleiro

[color=darkblue] Como utilizar em um código como esse ? alguém já tentou ?[/color]

&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Tutorial de ExtJs&lt;/title&gt;
        &lt;link rel="stylesheet" type="text/css" href="resources/css/ext-all.css"/&gt;
        &lt;script type="text/javascript" src="adapter/ext/ext-base.js"&gt;&lt;/script&gt;
        &lt;script type="text/javascript" src="ext-all.js"&gt;&lt;/script&gt;
        &lt;style type="text/css"&gt;
            html, body {font: normal 11px verdana;}
            #main-panel td {padding:5px;}

            .add-feed {
             background-image: url(examples/feed-viewer/images/rss_add.gif) !important;
             }
            .remove-feed {
              background-image: url(examples/feed-viewer/images/rss_delete.gif) !important;
            }

[color=darkblue] Não estou conseguindo importar os arquivos dos sources, alguém poderia me ajudar ?

Desde já agradeço ![/color]

lindberg713

tente usar file:/// antes dos nomes dos arquivos. Por exemplo digamos que quero usar uma imagem e esta esta em c:\imgs\img.jpg entao ficaria file:///c:\imgs\img.jpg

nao tenho certeza se são 2 ou 3 barras depois do “file:”. teste ai e veja com qual funciona.

abraço!

lindberg713

só pra completar a minha resposta. Quando digo pra usar file:/// antes dos arquivos digo pra colocar isso dentro do valor do atributo da tag. por exemplo agora isso nao sei se vai funcionar para o contexto relativo. Mas veja ai!

Metaleiro

[color=darkblue] Tentei fazer dessa forma, continua ocorrendo o mesmo erro, obrigado pela resposta :[/color]

&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Tutorial de ExtJs&lt;/title&gt;
        &lt;link rel="stylesheet" type="text/css" href="file:///resources/css/ext-all.css"/&gt;
        &lt;script type="text/javascript" src="file:///adapter/ext/ext-base.js"&gt;&lt;/script&gt;
        &lt;script type="text/javascript" src="file:///ext-all.js"&gt;&lt;/script&gt;
        &lt;style type="text/css"&gt;
            html, body {font: normal 11px verdana;}
            #main-panel td {padding:5px;}

            .add-feed {
             background-image: url(file:///examples/feed-viewer/images/rss_add.gif) !important;
             }
            .remove-feed {
              background-image: url(file:///examples/feed-viewer/images/rss_delete.gif) !important;
            }

[color=darkblue] Segue o erro abaixo, testei com outra página e funcionou, sem os “SRC” e imports:[/color]

java.io.IOException: Stream closed
	at java.io.BufferedInputStream.getInIfOpen(Unknown Source)
	at java.io.BufferedInputStream.read1(Unknown Source)
	at java.io.BufferedInputStream.read(Unknown Source)
	at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
	at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
	at sun.nio.cs.StreamDecoder.read(Unknown Source)
	at java.io.InputStreamReader.read(Unknown Source)
	at org.xhtmlrenderer.css.parser.Lexer.zzRefill(Lexer.java:1634)
	at org.xhtmlrenderer.css.parser.Lexer.yylex(Lexer.java:1865)
	at org.xhtmlrenderer.css.parser.CSSParser.next(CSSParser.java:1798)
	at org.xhtmlrenderer.css.parser.CSSParser.la(CSSParser.java:1810)
	at org.xhtmlrenderer.css.parser.CSSParser.stylesheet(CSSParser.java:159)
	at org.xhtmlrenderer.css.parser.CSSParser.parseStylesheet(CSSParser.java:89)
	at org.xhtmlrenderer.context.StylesheetFactoryImpl.parse(StylesheetFactoryImpl.java:78)
	at org.xhtmlrenderer.context.StylesheetFactoryImpl.parse(StylesheetFactoryImpl.java:95)
	at org.xhtmlrenderer.context.StylesheetFactoryImpl.getStylesheet(StylesheetFactoryImpl.java:174)
	at org.xhtmlrenderer.context.StyleReference.readAndParseAll(StyleReference.java:123)
	at org.xhtmlrenderer.context.StyleReference.setDocumentContext(StyleReference.java:107)
	at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:175)
	at org.xhtmlrenderer.pdf.ITextRenderer.setDocument(ITextRenderer.java:142)
	at Html2Pdf.convert(Html2Pdf.java:41)
	at Html2Pdf.main(Html2Pdf.java:81)
A

Olá galera, sou novo aqui no forum e estou com o mesmo problema do LuisCS . Não consigo justificar o texto apos gerar o pdf .Alguem por acaso descobriu com fazer isso .
Agradeço caso alguém possa me ajudar.

A

luisCS:
Olá galera, tou conseguindo gerar o PDF beleza. Tenho somente 1 problema que é justamente referente a textos justificados (

). O PDF não está interpretando essa solicitação.
Agradeço caso alguém possa me ajudar.

Tenho o mesmo problema alguem tem a solução???

yorgan

Alguém sabe como definir o layout da página (A4,A3, A5, etc…) e também como forçar a quebra de uma página?

[]´s

Daniel

J

Olá pessoal!

Utilizei este ótimo artigo escrito pelo nosso amigo Éder Baum :D. Mas tinha uma dúvida, que segundo ele vários leitores tambem possuem, que é como configurar as margens do arquivo PDF. Ele deu a dica e eu pesquisei e encontrei algo muito interessante.
As margens no arquivo PDF são configuradas através de uma regra CSS que deve ser inserida no corpo do arquivo HTML. A regra @page define alguns pontos referentes a página, e segue abaixo um exemplo do uso da mesma baseado no artigo do Éder:

OutputStream os = new FileOutputStream("C:\\hello.pdf");;  

String corpo = "";
corpo   = "<style>";
corpo += "@page { ";
corpo += "      size: 4.18in 6.88in;"; //Tamanho da folha
corpo += "      margin: 30px 20px 15px 35px;"; //Margem: Cima Direita Baixo Esquerda
corpo += "}";
corpo += "</style>";
corpo += "<h1 style='color: red'>";
corpo += "      Hello PDF";
corpo += "</h1>";

Html2Pdf.convert(corpo, os);          
os.close();
EderBaum:
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 :D . 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
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;

/**
 * @Autor 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);        		
	}	

}

Se você contar o numero de linhas do 2º método convert, verá que há apenas 06 linhas como prometido, e para usar esta classe, o código é menor ainda:

OutputStream os = new FileOutputStream("C:\\hello.pdf");;
Html2Pdf.convert("<h1 style=\"color:red\">Hello PDF</h1>", os);        	
os.close();

Os jars que vc precisa são estes
Tidy : http://jtidy.sourceforge.net
XHTMLRenderer : https://xhtmlrenderer.dev.java.net/
Itext: http://www.lowagie.com/iText

Espero que tenham divertido-se.

murilob

Oi pessoal,
Esta solução funcionou legal. Muito Bom.
Agora, queria perguntar como vocês fazem para manipular imagens que estão no html para converter em pdf. Se puderem mostrar um exemplo será de grande ajuda.

Obrigado!

murilob

Opa, desculpem eu não tinha visto os posts anteriores, achei que estivesse na primeira página. VOu dar uma olhada melhor.

yorgan

Passe a url ou pasta da imagem…
Algo como:

<img src="c:/imagem.jpg"> 
<img src="http://www.seusite.com.br/imagem.jpg">

[]´s
Daniel

murilob

Galera,
Alguém saberia alguma forma de gerar, ao invés de um pdf, um .doc para microsoft word?
Seria fazer essa mesma conversão de HTML só que para .doc. Os usuários do sistema no qual estou trabalhando só utilizam office e precisarão editar o documento gerado.
Se alguém puder me ajudar ou tiver algum exemplo, fico grato.

Obrigado.

B

Pessoal, preciso de uma ajudinha rsrs…
1º gostaria de parabenizar pelo otimo post…

é o seguinte… no meu sistema é gerado um relatorio, onde nesse relatorio existe
um atributo String que neste atributo contem as tags HTML, contudo no meu caso não é gerado um pdf apenas dessa parte…
e sim de varios outros dados do banco…

Gostaria de saber se tem alguma forma de decodificar o html desse atributo, sem q tenha q criar um pdf a parte…

Desde já agradeço

xptavares

ótimo post me ajudou muito.
mas se alguem já conseguiu fazer o redimensionamento de alguma imagem??

ex:

<IMG src="<%=caminhoImagens %>/imagens/imgbrrlrj.jpg" style="height:26px;width:5px;" alt="caixa amarela"/>

onde style=“height:26px;width:5px;” é o tamanho que eu queria para essa imagem…
o problema é que ele cria o espaço para a image desse tamanho mas ela não muda seu tamanho original dai fica um quadrado branco do tamanho que eu queria…

no jsp ele funciona perfeito é no pdf que da esse problema.

Lusyps

Oi Gente! Sou nova no GUj e em java, por isso perdoem-me as gafes…

Bem, meu problema e um pouquinho diferente, ou igual, nao sei ao certo…

Meu HTML e convertido beleza ecxeto por um detalhe, o código de barras fica com todas as barras finas, ou seja todas elas iguais como posso corrigir se no HTML ta legal?

Dese já obrigada

xptavares

amigo eu estava com esse problema, pois o conversor nao muda o tamanho da imganhm por css.
ex: eu usava a mesma imagem e ia redimencionando de 1 para 3 px.
a solucao foi mudar a funcao e botar duas imagens nao é o melhor mas foi como eu fiz.

Lusyps

Muito obrigada parece que deu certo

M

Pessoal, tenho um problema:

  • na página que eu estou tentando converter há uma função javascript que é invocada no evento onLoad (da tag body) que carrega vários dados no corpo da página, mas essa função não está sendo executada. Logo, é gerado o PDF sem esses dados (o que não me adianta de nada). Alguém sabe se tem alguma forma de fazer isto funcionar?
satangoss

Olá tenho duas dúvidas , seguinte:
1º como faço usando esse código gerar um pdf de condeúdo de um <ui:define name=“conteudo”> ?

2º como faço para somente mostrar esse pdf na tela, sem a necessidade de salva-lo em disco(caso o usuário use outro caminho de disco ou memso outro sistema operacional), ou também se caso isso não for possível, abrir uma tela “salvar como” para que o usuário possa escolher o lugar para salvar o pdf gerado?

Abraço

M

Olá pessoal,

Primeiro de tudo, parabens Eder Baum, seu material postado é de muita valia para todos.

Estou tendo uma dificuldade para gerar PDF de uma pagina que as dimensões dela é maior que uma pagina A4, nem em paisagem ela cabe numa A4, tem alguma forma da pagina se redimencionar para que se enquadre numa pagina A4?

Obrigado,

M

Ola,

Estou tentando adicionar a fonte tahoma no pdf, pois nao esta gerando com a fonte que estou informando,
Este codigo esta dando erro, se eu coloco o caminho errado nao da erro.
alguem pode me ajudar?

package com.ederbaum.pdf;

import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;
import org.w3c.dom.Document;

import org.w3c.tidy.Tidy;

import org.xhtmlrenderer.pdf.*;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;

/**

  • @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();
    try {   
        renderer.getFontResolver().addFont( "/com/ederbaum/pdf/util/font/TAHOMA.TTF", BaseFont.IDENTITY_H ,BaseFont.EMBEDDED);
    } catch (IOException e) {   
        e.printStackTrace();   
    }
    renderer.setDocument(doc, null); 
    renderer.layout();
    renderer.createPDF(out);
}

}

faroestecaboclo

Galera… mto legal essa solução.

Mas estou com um problema pra fazer funcionar com minha autenticação padrão do Tomcat…
Pq estou criando um novo URL como no exemplo:

URL u = new URL(serverUrl + url);
URLConnection conn = u.openConnection();
InputStream is = conn.getInputStream();

Html2Pdf.convert(is, resp.getOutputStream());

Mas como é criado uma nova conexão URL, a sessão atual é perdida…
Então oq sai impresso no meu PDF é justamente minha tela de logon, entenderam?

Como resolvo isso?

rbortolon

Ola amigos !!

Obrigado ao autor deste tópico pois foi muito útil para resolver meu problema.

A questão agora é a seguinte: estes jar’s são open source? GPL ?

Pergunto pois eu tive que utilizar aqui no meu trabalho. Teremos que adquirir licensa do iText, por exemplo?

Grato,
Rodrigo

AnjoVingador

Para aqueles que como eu queiram colocar margem, cabeçalho, rodapé no PDF sem muita complicação olham esse link click aqui
Quero falar que esse tópico me ajudou muito, está de parabéns quem o criou.
Falow!

Polverini

To usando esse codigo para converter uma jsp em pdf

import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
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;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

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);
    }

    public static void main(String[] args) throws FileNotFoundException, DocumentException, IOException {
        URL url = new URL("http://localhost:8084/Simulador/servicos/simulador.jsp");
        URLConnection conn = url.openConnection();

        InputStream is = url.openStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);

        String linha = br.readLine();
        String aux ="";

        while (linha != null) {
            aux+=linha+"\n";
            linha = br.readLine();
        }
        System.out.println(aux);
        OutputStream os = new FileOutputStream("C:\\hello.pdf");
        Html2Pdf.convert(aux, os);
        os.close();
    }
}

Mas o ‘input’ nao sai, nenhum deles.

E agora ???

Takeshi91

Quais libs você usou alem da iText?

Nunca tentei este tipo de implementação

Abraços!

T

Galera preciso de uma ajuda…
não estou conseguindo de jeito nenhum fazer aparecer as imagens no pdf…

segue como esta os codigo

String nomeArquivo = "EtqCuidadosEspeciais-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".pdf";

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

HttpServletResponse response = super.getServletResponse();

response.setCharacterEncoding("ISO-8859-1");

response.setContentType("application/pdf");

response.setHeader("Content-Disposition", "attachment; filename=" + nomeArquivo);

response.setHeader("Cache-Control", "no-cache");
StringBuilder html = new StringBuilder();
		html.append("&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\"?&gt;");
		html.append("&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;");
		//html.append("&lt;link rel='stylesheet' type='text/css' href='/static/css/ris.css' /&gt;");
		//html.append("&lt;link rel='stylesheet' type='text/css' href='/static/css/yahoo/menu.css' /&gt;");
		//html.append("&lt;link rel='stylesheet' type='text/css' href='/static/css/displaytag.css' /&gt;");
		html.append("&lt;html&gt;&lt;head&gt;");
		html.append("&lt;style type=\"text/css\"&gt;@page {  size: 210mm 291mm; }&lt;/style&gt;");
		//html.append("&lt;style type=\"text/css\"&gt;"+getCss()+"&lt;/style&gt;");
		html.append("&lt;/head&gt;");
		html.append("&lt;body&gt;");
		html.append("<br/>");
		//html.append(htmlToExport);
		html.append("<br/><br/>");
		html.append("&lt;table width=\"100%\" align=\"center\"&gt;");
		html.append("	&lt;tr&gt;");
		html.append("		&lt;td width=\"50%\" height=\"100%\" align=\"center\" style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;");
		html.append(getText("lbl.modelo"));
		html.append("		&lt;/td&gt;");
		html.append("	&lt;/tr&gt;");
		html.append("	&lt;tr&gt;");
		html.append("		&lt;td width=\"50%\" height=\"100%\" align=\"center\" style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;");
		html.append("			&nbsp");
		html.append("		&lt;/td&gt;");
		html.append("	&lt;/tr&gt;");
		html.append("	&lt;tr&gt;");
		html.append("		&lt;td width=\"50%\" height=\"100%\" align=\"center\"&gt;");
		html.append("				&lt;table cellspacing=\"0\" width=\"30%\" height=\"100%\" style=\"border: 1; border-style: solid;\" align=\"center\"&gt;");
		html.append("					&lt;tr&gt;");
		html.append("						&lt;td align=\"center\"&gt;");
		html.append("							&lt;table width=\"100%\"&gt;");
		for(FiguraEtiquetaVo f: result.getListaComposicao()) {
			
			// mostra o tipo da aplicação
			if (result.isMostraTipoAplicacao() && !f.getDsTipAplFib().equals("")) {
				html.append("						&lt;tr&gt;");
				html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + f.getDsTipAplFib() + "&lt;/td&gt;");
				html.append("						&lt;/tr&gt;");
			}
			if (getIdioma().trim().equals("br")){
				html.append("						&lt;tr&gt;");
				html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + f.getPcFibTxlArt() + "% " +
																												f.getDsFibTxl_prg() + "&lt;/td&gt;");
				html.append("						&lt;/tr&gt;");					
			}else if (getIdioma().trim().equals("es")){
				html.append("						&lt;tr&gt;");
				html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + f.getPcFibTxlArt() + "% " +
																												f.getDsFibTxlSph() + "&lt;/td&gt;");
				html.append("						&lt;/tr&gt;");
			}else if (getIdioma().trim().equals("en")){
				html.append("						&lt;tr&gt;");
				html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + f.getPcFibTxlArt() + "% " +
																												f.getDsFibTxlIgl() + "&lt;/td&gt;");
				html.append("						&lt;/tr&gt;");
			}
		}
		html.append("							&lt;/table&gt;");
		html.append("						&lt;/td&gt;");
		html.append("					&lt;/tr&gt;");
		html.append("					&lt;tr&gt;");
		html.append("						&lt;td align='center'&gt;&nbsp&lt;/td&gt;");
		html.append("					&lt;/tr&gt;");
		html.append("					&lt;tr&gt;");
		html.append("						&lt;td align='center'&gt;");
		html.append("							&lt;table id='tblFiguraLavagem' width='100%'&gt;");
		html.append("								&lt;tr&gt;");
		for(String imgEtiqueta: resultPedido.getImgManutencaoPeca()) {
			html.append("								&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" +
														[size=18][color=red][b]"<img  + imgEtiqueta + "\">&lt;/td&gt;");[/b]	[/color]	[/size]	}
		html.append("								&lt;/tr&gt;");
		html.append("							&lt;/table&gt;");
		html.append("					&lt;/tr&gt;");
		html.append("					&lt;tr&gt;");
		html.append("						&lt;td align='center'&gt;");
		html.append("							&lt;table id='tblGrauInstrucao' width='100%'&gt;");
		for(FiguraEtiquetaVo figuraEtiquetaVo: result.getListaFigLav()) {
			html.append("								&lt;tr&gt;");
			html.append("								&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + figuraEtiquetaVo.getDsGrauInsSph() + "&lt;/td&gt;");
			html.append("								&lt;/tr&gt;");
		}
		html.append("							&lt;/table&gt;");
		html.append("					&lt;/tr&gt;");
		html.append("					&lt;tr&gt;");
		html.append("						&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;&nbsp&lt;/td&gt;");
		html.append("					&lt;/tr&gt;");
		html.append("					&lt;tr&gt;");
		html.append("						&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;&nbsp&lt;/td&gt;");
		html.append("					&lt;/tr&gt;");
		html.append("					&lt;tr&gt;");
		String txtProduzido = "";
		String txtPara="";
		if(result.getTextoPaisProd().trim().equals("BR")){
			txtProduzido = getText("lbl.prod.mexico"); 
			txtPara = getText("lbl.prod.mexico.para");
			html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtProduzido + "&lt;/td&gt;");
			html.append("						&lt;/tr&gt;");
			html.append("						&lt;tr&gt;");
			html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtPara + "&lt;/td&gt;");
			html.append("						&lt;/tr&gt;");
		}else{
			txtProduzido = getText("lbl.prod.mexico.importado") 
							+ " " + infoImportado.getTxtPaisFabPed();
			String txtInsumo="";
			
			if(infoImportado.getTxtPaisOrigemInsumo()!=null 
					&& infoImportado.getTxtPaisOrigemInsumo().trim().equals("")){
				txtInsumo = getText("lbl.prod.mexico.importado.insumo") + " " + infoImportado.getTxtPaisOrigemInsumo();
			}
			html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtProduzido + "&lt;/td&gt;");
			html.append("						&lt;/tr&gt;");
			html.append("						&lt;tr&gt;");
			html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtInsumo + "&lt;/td&gt;");
			html.append("						&lt;/tr&gt;");
		}
		html.append("					&lt;tr&gt;");
		html.append("						&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;&nbsp&lt;/td&gt;");
		html.append("					&lt;/tr&gt;");
		html.append("					&lt;tr&gt;");
		html.append("						&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;&nbsp&lt;/td&gt;");
		html.append("					&lt;/tr&gt;");
		if (resultPedido.getTipoPedidoPrg().trim().equals(TP_IMPORTADO_PRG)){
			String txtImportadoPor = getText("lbl.prod.mexico.importadopor");
			html.append("						&lt;tr&gt;");
			html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtImportadoPor + "&lt;/td&gt;");
			html.append("						&lt;/tr&gt;");
		}
		String txtCeA = getText("lbl.prod.mexico.cea");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtCeA + "&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		String txtEndereco = getText("lbl.prod.mexico.endereco");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtEndereco + "&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		String txtLocalidade = getText("lbl.prod.mexico.localidade");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtLocalidade + "&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		String txtCidadeEstado = getText("lbl.prod.mexico.cidadeestado");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtCidadeEstado + "&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		String txtCpPais = getText("lbl.prod.mexico.caixapostalpais");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtCpPais + "&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		String txtRfc = getText("lbl.prod.mexico.rfc");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtRfc + "&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		String txtTel1 = getText("lbl.prod.mexico.tel1");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtTel1 + "&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		String txtTel2 = getText("lbl.prod.mexico.tel2");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;" + txtTel2 + "&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;&nbsp&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;&nbsp&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		html.append("						&lt;tr&gt;");
		html.append("							&lt;td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\"&gt;&nbsp&lt;/td&gt;");
		html.append("						&lt;/tr&gt;");
		html.append("				&lt;/table&gt;");
		html.append("			&lt;/td&gt;");
		html.append("		&lt;/tr&gt;");
		html.append("	&lt;/table&gt;");
		html.append("	<br/>");
		html.append("&lt;/body&gt;&lt;/html&gt;");

		Html2Pdf.convert(html.toString(), outputStream, 1.5F, 1);
		response.setContentLength( outputStream.size() );
		
		ServletOutputStream sos = response.getOutputStream();
		outputStream.writeTo(sos);
		sos.flush();
T

Galera preciso de uma ajuda...
não estou conseguindo de jeito nenhum fazer aparecer as imagens no pdf...

segue como esta os codigo

String nomeArquivo = "EtqCuidadosEspeciais-" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".pdf";
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
			HttpServletResponse response = super.getServletResponse();
			response.setCharacterEncoding("ISO-8859-1");
			response.setContentType("application/pdf");
			response.setHeader("Content-Disposition", "attachment; filename=" + nomeArquivo); 
			response.setHeader("Cache-Control", "no-cache");

			StringBuilder html = new StringBuilder();
			html.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>");
			html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");
			//html.append("<link rel='stylesheet' type='text/css' href='/static/css/ris.css' />");
			//html.append("<link rel='stylesheet' type='text/css' href='/static/css/yahoo/menu.css' />");
			//html.append("<link rel='stylesheet' type='text/css' href='/static/css/displaytag.css' />");
			html.append("<html><head>");
			html.append("<style type=\"text/css\">@page {  size: 210mm 291mm; }</style>");
			//html.append("<style type=\"text/css\">"+getCss()+"</style>");
			html.append("</head>");
			html.append("<body>");
			html.append("<br/>");
			//html.append(htmlToExport);
			html.append("<br/><br/>");
			html.append("<table width=\"100%\" align=\"center\">");
			html.append("	<tr>");
			html.append("		<td width=\"50%\" height=\"100%\" align=\"center\" style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">");
			html.append(getText("lbl.modelo"));
			html.append("		</td>");
			html.append("	</tr>");
			html.append("	<tr>");
			html.append("		<td width=\"50%\" height=\"100%\" align=\"center\" style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">");
			html.append("			&nbsp");
			html.append("		</td>");
			html.append("	</tr>");
			html.append("	<tr>");
			html.append("		<td width=\"50%\" height=\"100%\" align=\"center\">");
			html.append("				<table cellspacing=\"0\" width=\"30%\" height=\"100%\" style=\"border: 1; border-style: solid;\" align=\"center\">");
			html.append("					<tr>");
			html.append("						<td align=\"center\">");
			html.append("							<table width=\"100%\">");
			for(FiguraEtiquetaVo f: result.getListaComposicao()) {
				
				// mostra o tipo da aplicação
				if (result.isMostraTipoAplicacao() && !f.getDsTipAplFib().equals("")) {
					html.append("						<tr>");
					html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + f.getDsTipAplFib() + "</td>");
					html.append("						</tr>");
				}
				if (getIdioma().trim().equals("br")){
					html.append("						<tr>");
					html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + f.getPcFibTxlArt() + "% " +
																													f.getDsFibTxl_prg() + "</td>");
					html.append("						</tr>");					
				}else if (getIdioma().trim().equals("es")){
					html.append("						<tr>");
					html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + f.getPcFibTxlArt() + "% " +
																													f.getDsFibTxlSph() + "</td>");
					html.append("						</tr>");
				}else if (getIdioma().trim().equals("en")){
					html.append("						<tr>");
					html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + f.getPcFibTxlArt() + "% " +
																													f.getDsFibTxlIgl() + "</td>");
					html.append("						</tr>");
				}
			}
			html.append("							</table>");
			html.append("						</td>");
			html.append("					</tr>");
			html.append("					<tr>");
			html.append("						<td align='center'>&nbsp</td>");
			html.append("					</tr>");
			html.append("					<tr>");
			html.append("						<td align='center'>");
			html.append("							<table id='tblFiguraLavagem' width='100%'>");
			html.append("								<tr>");
			for(String imgEtiqueta: resultPedido.getImgManutencaoPeca()) {
				html.append("								<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" +
															[size=18][color=red][b]"<img src=\"file:///http://localhost:7001/srf/img/etiqueta/" + imgEtiqueta + "\"></td>");[/b]	[/color]	[/size]	}
			html.append("								</tr>");
			html.append("							</table>");
			html.append("					</tr>");
			html.append("					<tr>");
			html.append("						<td align='center'>");
			html.append("							<table id='tblGrauInstrucao' width='100%'>");
			for(FiguraEtiquetaVo figuraEtiquetaVo: result.getListaFigLav()) {
				html.append("								<tr>");
				html.append("								<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + figuraEtiquetaVo.getDsGrauInsSph() + "</td>");
				html.append("								</tr>");
			}
			html.append("							</table>");
			html.append("					</tr>");
			html.append("					<tr>");
			html.append("						<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">&nbsp</td>");
			html.append("					</tr>");
			html.append("					<tr>");
			html.append("						<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">&nbsp</td>");
			html.append("					</tr>");
			html.append("					<tr>");
			String txtProduzido = "";
			String txtPara="";
			if(result.getTextoPaisProd().trim().equals("BR")){
				txtProduzido = getText("lbl.prod.mexico"); 
				txtPara = getText("lbl.prod.mexico.para");
				html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtProduzido + "</td>");
				html.append("						</tr>");
				html.append("						<tr>");
				html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtPara + "</td>");
				html.append("						</tr>");
			}else{
				txtProduzido = getText("lbl.prod.mexico.importado") 
								+ " " + infoImportado.getTxtPaisFabPed();
				String txtInsumo="";
				
				if(infoImportado.getTxtPaisOrigemInsumo()!=null 
						&& infoImportado.getTxtPaisOrigemInsumo().trim().equals("")){
					txtInsumo = getText("lbl.prod.mexico.importado.insumo") + " " + infoImportado.getTxtPaisOrigemInsumo();
				}
				html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtProduzido + "</td>");
				html.append("						</tr>");
				html.append("						<tr>");
				html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtInsumo + "</td>");
				html.append("						</tr>");
			}
			html.append("					<tr>");
			html.append("						<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">&nbsp</td>");
			html.append("					</tr>");
			html.append("					<tr>");
			html.append("						<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">&nbsp</td>");
			html.append("					</tr>");
			if (resultPedido.getTipoPedidoPrg().trim().equals(TP_IMPORTADO_PRG)){
				String txtImportadoPor = getText("lbl.prod.mexico.importadopor");
				html.append("						<tr>");
				html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtImportadoPor + "</td>");
				html.append("						</tr>");
			}
			String txtCeA = getText("lbl.prod.mexico.cea");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtCeA + "</td>");
			html.append("						</tr>");
			String txtEndereco = getText("lbl.prod.mexico.endereco");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtEndereco + "</td>");
			html.append("						</tr>");
			String txtLocalidade = getText("lbl.prod.mexico.localidade");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtLocalidade + "</td>");
			html.append("						</tr>");
			String txtCidadeEstado = getText("lbl.prod.mexico.cidadeestado");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtCidadeEstado + "</td>");
			html.append("						</tr>");
			String txtCpPais = getText("lbl.prod.mexico.caixapostalpais");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtCpPais + "</td>");
			html.append("						</tr>");
			String txtRfc = getText("lbl.prod.mexico.rfc");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtRfc + "</td>");
			html.append("						</tr>");
			String txtTel1 = getText("lbl.prod.mexico.tel1");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtTel1 + "</td>");
			html.append("						</tr>");
			String txtTel2 = getText("lbl.prod.mexico.tel2");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">" + txtTel2 + "</td>");
			html.append("						</tr>");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">&nbsp</td>");
			html.append("						</tr>");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">&nbsp</td>");
			html.append("						</tr>");
			html.append("						<tr>");
			html.append("							<td style=\"color:#000000; font-family:Arial, sans-serif; font-size:15px;\">&nbsp</td>");
			html.append("						</tr>");
			html.append("				</table>");
			html.append("			</td>");
			html.append("		</tr>");
			html.append("	</table>");
			html.append("	<br/>");
			html.append("</body></html>");

			Html2Pdf.convert(html.toString(), outputStream, 1.5F, 1);
			response.setContentLength( outputStream.size() );
			
			ServletOutputStream sos = response.getOutputStream();
			outputStream.writeTo(sos);
			sos.flush();
Takeshi91

Use a tag code quando colocar seu codigo fonte, senão fica ilegível para os outros membros.

T

foi mal esqueci denovo

T

E ai galera…

entao fiz um teste com meu codigo fonte para pegar uma imagem do C: e rolou legal…
mas como faço para fazer pegar uma imagem do contexto?
alguem ja passou por alguma experiencia e funcionou?

Att,
tiago

Takeshi91

a imagem está como atributo do context?

preguiça de ler codigo

T

Está com o caminho do context
http://localhost:7001/srf/img/etiqueta/

Takeshi91

pra pegar do contexto só usar /srf/img/etiqueta/ como path.

T

Já tentei também,
porém a imagem não aparece no pdf…
quando pego uma imagem do C e passo o caminho completo funciona…
porém não estou conseguindo fazer aparecer imagem no pdf qunado se trata de uma imagem que está na aplicação…

CintiaDR

Tiago:

<img src=“file:///http://localhost:7001/srf/img/etiqueta/” + imgEtiqueta + “”>

FILE NÃO, NÉ? Tenta:

<img src=“http://localhost:7001/srf/img/etiqueta/” + imgEtiqueta + “”>

T

Já tentei também, porém sem sucesso…
aliás já tentei de tudo quanté jeito, mas nada…
alguém pode me ajudar?

Att,
Tiago

bcruz

Faz um HttpGet para testar a url

HttpClient client = new HttpClient(); HttpMethod method = new GetMethod("URI_DA_IMAGEM"); client.executeMethod(method); method.getStatusCode();

Nesse caso quem tenta recuperar a imagem é o servidor.


Estou tendo um problema com essa biblioteca.

Preciso colocar as páginas em um esquema 2/5 e um rodapé em cada uma delas.

Meu conteúdo é dinâmico e não tenho como gerar um HTML com as informações.

O iText tem PdfPageEventHelper para tal.

CintiaDR

bcruz,

Eu não tive problema nenhum em manipular HTML dinâmico, usei o Jtidy. Não recomendo muito, me parece uma versão meio antiga, mas tenho certeza que existem outras ferramentas para manipular HTML.

Quanto ao cabeçalho e rodapé, é um diferente para cada página? Ou o que muda é só a numeração? Novamente, eu fiz o rodapé e cabeçalho em HTML, foi só anotar corretamente e gerou o PDF com cabeçalhos e rodapés de acordo.

bcruz

Também estou usando o Jtidy. Só mencionei o iText porque foi o que achei referente a paginação.

Você teria algum exemplo de anotação para gerar as páginas?

O rodapé é único para cada página sim…

Eu também não estou tendo problemas em gerar HTML dinamicamente, só comentei porque não tem como eu colocar a página e rodapé no meu HTML.

O que eu preciso é que após eu ter colocado o inputstream do meu HTML ele tivesse como “injetar” o rodapé e as páginas.

Att
Bruno

CintiaDR

Pra cabeçalho e rodapé, tem no link:

http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html

Pra inserir depois, eu fazia com JTidy (ou direto com replace no string, não lembro bem). Mas o meu cabeçalho e meu rodapé eram IGUAIS para todas as páginas, exceto a parte de numeração.

bcruz

Obrigado pela ajuda…

Eu já tinha visto esse link e o meu problema é que tenho que colocar na página.

<div id=\"footer\">  Page <span id=\"pagenumber\"/> of <span id=\"pagecount\"/> </div>

Preciso colocar o código acima na página … E no meu caso o HTML quem gera é o usuário, podendo alterar tamanho e tipo da fonte por exemplo.

Não tenho como prever onde a página vai quebrar.

CintiaDR

Meu HTML também era gerado pelo usuário.

As únicas restrições que pedia é que não existisse um elemento com nome ‘footer’, e inseria logo antes/depois de uma tag como ‘head’ ou ‘html’.

bcruz

Para mim funcionou, mas somente para a primeira página.

Nas demais a paginação não apareceu, não atende a paginação em cada página nem o rodapé

W

eae pessoal estou com um problema,como eu faço pra usar JAVASCRIPT em uma pagina html q é renderizada pelo ITEXT ?ja tentei de quase tudo que achei na net mais o ITEXT não reconhece o JAVASCRIPT =/

bcruz

Assim eu nunca tentei fazer, mas na teoria não deveria funcionar.

Quem executa o javascript é o browser e cada um o faz de uma maneira diferente.

W

Cara o problema que eu estou tendo é o seguinte,eu tenho que pegar o tamanho das primeiras duas linha de uma tabela e comparar com o resto da folha que não esta sendo ocupada,no caso se o tamanho das duas primeiras linhas couber no espaço não usado eu imprimo na mesma folha caso contrario eu vo imprimi numa proxima folha !
Eu ja consegui fazer tudo isso mais em javaScript, e não sei como fazer de outro jeito que o iText entenda !

S

Bom dia / Boa Tarde / Boa noite

Revivendo este tópico

Estou com o seguinte problema: utilizei em meu projeto aqui na empresa esta implementação que o nosso amigo EderBaum compartilhou conosco, porém exitem um problema quando utilizado junto com o JasperReports pois o jasper usa a lib itext 2.1.7 e quando tento executar esta linha ITextRenderer renderer = new ITextRenderer(); no código eu tomo um Exception na cabeça " NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox©[I " enfim quando troco a Lib do iText para a 2.0.8 ,que é a utilizada no codigo mostrador pelo EderBaum, o Japer é que da o erro NoSuchMethodError: com.lowagie.text.pdf.PdfWriter.setRgbTransparencyBlending(Z)V

como pode uma versão mais atual não conter o metodo anterior!

Alguém ja passou por isso? estou pesquisando ja faz um tempo uma solução para este problema.

Obrigado

A

Boa noite pessoal,

Alguém sabe como eu faria para converter uma página jsp da minha aplicação para pdf ???

Obrigado

B

sciuba:
Bom dia / Boa Tarde / Boa noite

Revivendo este tópico

Estou com o seguinte problema: utilizei em meu projeto aqui na empresa esta implementação que o nosso amigo EderBaum compartilhou conosco, porém exitem um problema quando utilizado junto com o JasperReports pois o jasper usa a lib itext 2.1.7 e quando tento executar esta linha ITextRenderer renderer = new ITextRenderer(); no código eu tomo um Exception na cabeça " NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox©[I " enfim quando troco a Lib do iText para a 2.0.8 ,que é a utilizada no codigo mostrador pelo EderBaum, o Japer é que da o erro NoSuchMethodError: com.lowagie.text.pdf.PdfWriter.setRgbTransparencyBlending(Z)V

como pode uma versão mais atual não conter o metodo anterior!

Alguém ja passou por isso? estou pesquisando ja faz um tempo uma solução para este problema.

Obrigado

caso alguém encontrou o mesmo problema é só substituir a lib do iText por uma da versão iText 2.1.0 …
vlws

W

Pessoal, bom dia!

Estou tendo problemas ao criar um pdf.
Dependendo da quantidade de dados que tenho, sempre esta vindo uma página em branco no final.
Há alguma forma de eu evitar isso? Tem como eu limitar o numero de informações a ser colocadas em cada página?

L

Consegui fazer o pdf perfeitamente como gostaria, todo alinhado, unico problema é no momento que tenho um texto que deve ficar na vertical , pelo que entendi a função não esta reconhecendo os comando :

-webkit-transform
-o-transform
-ms-transform
filter
writing-mode;

plumbing.render INFO:: Using CSS implementation from: org.xhtmlrenderer.context.StyleReference plumbing.css-parse WARNING:: (null#inline_style_1) margim-left is an unrecognized CSS property at line 202. Ignoring declarat ion. plumbing.css-parse WARNING:: (null#inline_style_1) word-break is an unrecognized CSS property at line 213. Ignoring declarati on. plumbing.css-parse WARNING:: (null#inline_style_1) Value opx is not a recognized identifier at line 220. Skipping declaration . plumbing.css-parse WARNING:: (null#inline_style_1) word-break is an unrecognized CSS property at line 219. Ignoring declarati on. plumbing.css-parse WARNING:: (null#inline_style_1) word-break is an unrecognized CSS property at line 228. Ignoring declarati on. plumbing.css-parse WARNING:: (null#inline_style_1) margim-left is an unrecognized CSS property at line 229. Ignoring declarat ion. plumbing.css-parse WARNING:: (null#inline_style_1) writing-mode is an unrecognized CSS property at line 256. Ignoring declara tion. plumbing.css-parse WARNING:: (null#inline_style_1) filter is an unrecognized CSS property at line 256. Ignoring declaration. plumbing.css-parse WARNING:: (null#inline_style_1) Found ) where one of a number, a percentage, a pixel value, an em value, a n ex value, a pica value, a millimeter value, a centimeter value, an inch value, a point value, an angle value, a time value, a freq value, a string, an identifier, a URI, a hex color, or function was expected at line 257. Skipping declaration. plumbing.css-parse WARNING:: (null#inline_style_1) writing-mode is an unrecognized CSS property at line 257. Ignoring declara tion. plumbing.css-parse WARNING:: (null#inline_style_1) -webkit-transform is an unrecognized CSS property at line 257. Ignoring de claration. plumbing.css-parse WARNING:: (null#inline_style_1) Unsupported CSS unit deg at line 258. Skipping declaration. plumbing.css-parse WARNING:: (null#inline_style_1) Unsupported CSS unit deg at line 258. Skipping declaration property at line 258. Ignoring declara tion. plumbing.css-parse WARNING:: (null#inline_style_1) -webkit-transform is an unrecognized CSS property at line 258. Ignoring de claration. plumbing.css-parse WARNING:: (null#inline_style_1) Unsupported CSS unit deg at line 259. Skipping declaration. plumbing.css-parse WARNING:: (null#inline_style_1) -moz-transform is an unrecognized CSS property at line 258. Ignoring decla ration. plumbing.css-parse WARNING:: (null#inline_style_1) Unsupported CSS unit deg at line 259. Skipping declaration. plumbing.css-parse WARNING:: (null#inline_style_1) -o-transform is an unrecognized CSS property at line 258. Ignoring declara tion. plumbing.css-parse WARNING:: (null#inline_style_1) Unsupported CSS unit deg at line 259. Skipping declaration. plumbing.css-parse WARNING:: (null#inline_style_1) Value for width must be an identifier, length, or percentage at line 260. Skipping declaration. plumbing.css-parse WARNING:: (null#inline_style_1) Value for height must be an identifier, length, or percentage at line 260. Skipping declaration.

alguem ai conhece outro comando q possa usar ?

M

Olá!

Primeiramente queria agradecer ao @EderBaum pelo código fornecido lá no primeiro tópico, me ajudou muuito! :)

Depois tive que apanhar um pouco pois o código de barras que estava sendo gerado no PDF não refletia o que estava no HTML de geração de boletos Braspag.
No HTML original o código de barras é formado por uma sequencia de gifs brancos e pretos intercalados, mudando-se o width para ficar mais fino ou grosso. Por alguma razão, ao transformar para PDF esse resize não era capturado.
A solução que achei, talvez não seja a melhor, mas funcionou para mim, foi criar e substituir por uma série de tables em HTML simulando esses gifs.
Segue o código para quem interessar.

....
String replaceString = sb.toString(); // no meu caso está recebendo de um StringBuffer o HTML que foi gerado a partir da URL

replaceString = replaceString.replace("<img      >", "&lt;table style=\"background-color:white; height:50px;float: left; border:0 !important;\"&gt;&lt;tr&gt;&lt;td style=\"padding:0.5px; border:0 !important;\"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;");
			replaceString = replaceString.replace("<img      >", "&lt;table style=\"background-color:white; height:50px;float: left; border:0 !important;\"&gt;&lt;tr&gt;&lt;td style=\"padding:1.5px; border:0 !important;\"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;");
			replaceString = replaceString.replace("<img      >", "&lt;table style=\"background-color:black; height:50px;float: left; border:0 !important;\"&gt;&lt;tr&gt;&lt;td style=\"padding:0.5px; border:0 !important;\"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;");
			replaceString = replaceString.replace("<img      >", "&lt;table style=\"background-color:black; height:50px;float: left; border:0 !important;\"&gt;&lt;tr&gt;&lt;td style=\"padding:1.5px; border:0 !important;\"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;");

O img src não está aparecendo no código, então coloquei aqui:
img src=\"/images/boleto/barcode/b.gif\" alt=\"image\" width=\"1\" height=\"50\" style=\"border:0;\" //representa o gif branco, pode ter tamanho 1 ou 3
img src=\"/images/boleto/barcode/p.gif\" alt=\"image\" width=\"1\" height=\"50\" style=\"border:0;\" //representa o gif preto, pode ter tamanho 1 ou 3

K

kkkkkkkkkkkk que divertido! :3 Da para fazer um ótimo editor de livros… Emboras que o word e até o Google Docs que é equivalente ao word ja estão vindo com a opção de conversão… Está virando uma extensão corriqueira. Em fim vlw :3

Criado 19 de dezembro de 2007
Ultima resposta 26 de fev. de 2014
Respostas 138
Participantes 57