用 Java 把 html 转成 pdf

1。下载iText-2[1].0.8.jar,core-renderer.jar两个包

http://dl.dbank.com/c0qhaq9zct  [core-renderer.jar]

http://dl.dbank.com/c018ppuepa [itext-5.1.2.zip]

2。代码(3种)

package test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.pdf.BaseFont;
public class WordToPdf {
    /**
     * @param args
     */
        public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        String inputFile = "D://test.html";
        String url = new File(inputFile).toURI().toURL().toString();
        String outputFile = "D://test.pdf";
        System.out.println(url);
        OutputStream os = new FileOutputStream(outputFile);
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(url);
        // 解决中文支持问题
        ITextFontResolver fontResolver = renderer.getFontResolver();
        fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC",
                BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        // 解决图片的相对路径问题
        // renderer.getSharedContext().setBaseURL("file:/D:/z/temp/");
        renderer.layout();
        renderer.createPDF(os);
        os.close();
    }
}

第二种:

    import java.io.File;  
    import java.io.FileOutputStream;  
    import java.io.OutputStream;  
      
    import org.xhtmlrenderer.pdf.ITextFontResolver;  
    import org.xhtmlrenderer.pdf.ITextRenderer;  
      
    import com.lowagie.text.pdf.BaseFont;  
      
    public class TestFlyingSauser  
    {  
      
        public static void main( String[] args ) throws Exception  
        {  
    //        demo_1();  
            demo_2();  
        }  
      
        // 不支持中文  
        public static void demo_1() throws Exception  
        {  
            String inputFile = "D:/Test/flying.html";  
            String url = new File( inputFile ).toURI().toURL().toString();  
            String outputFile = "D:/Test/flying.pdf";  
            OutputStream os = new FileOutputStream( outputFile );  
            ITextRenderer renderer = new ITextRenderer();  
            renderer.setDocument( url );  
            renderer.layout();  
            renderer.createPDF( os );  
            os.close();  
        }  
      
        // 支持中文  
        public static void demo_2() throws Exception {    
            String outputFile = "G:/demo_3.pdf";    
            OutputStream os = new FileOutputStream(outputFile);    
            ITextRenderer renderer = new ITextRenderer();    
            ITextFontResolver fontResolver = renderer.getFontResolver();    
            fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);    
            StringBuffer html = new StringBuffer();    
            // DOCTYPE 必需写否则类似于 这样的字符解析会出现错误    
            html.append("<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/" /"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");    
            html.append("<html xmlns=/"http://www.w3.org/1999/xhtml/">").  
                 append("<head>")    
                .append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/" />")  
                .append("<mce:style type=/"text/css/" mce_bogus=/"1/"><!--
body {font-family: SimSun;}
--></mce:style><style type=/"text/css/" mce_bogus=/"1/" mce_bogus="1">body {font-family: SimSun;}</style>")   
                .append("</head>")    
                .append("<body>");    
            html.append("<div>支持中文!</div>");    
            html.append("</body></html>");    
            renderer.setDocumentFromString(html.toString());    
            // 解决图片的相对路径问题    
            // renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");    
            renderer.layout();    
            renderer.createPDF(os);    
            os.close();    
        }}  

第三种:

    import java.io.ByteArrayInputStream;  
    import java.io.ByteArrayOutputStream;  
    import java.io.InputStream;  
    import java.io.OutputStream;  
      
    import javax.xml.parsers.DocumentBuilder;  
    import javax.xml.parsers.DocumentBuilderFactory;  
    import javax.xml.transform.Transformer;  
    import javax.xml.transform.TransformerFactory;  
    import javax.xml.transform.dom.DOMSource;  
    import javax.xml.transform.stream.StreamResult;  
      
    import org.w3c.dom.Document;  
    import org.xhtmlrenderer.pdf.ITextFontResolver;  
    import org.xhtmlrenderer.pdf.ITextRenderer;  
      
    public class HTML2PDF {  
      
    /** 
      * 调用方式 htmlToPDF(response.getOutputStream(), htmlstr, "C:/WINDOWS/Fonts/simfang.ttf", "FangSong_GB2312", "GB2312", "http://xxxx/dtd/xhtml1-transitional.dtd"); 
      *  
      * 相关图片必须使用绝对路径才能显示 如果要下载生成的文件,在此方法上方加上: 
      * response.setHeader("Content-disposition", 
      * "attachment;filename=英文文件名.pdf"); 
      *  
      * @param 参数 
      * @param OutputStream out 输出流 
      * @param String htmlcode html代码。 
      *  
      * @param String fontName 字体名称 如:FangSong_GB2312 
      * @param String fontpath windows 字体路径 如:C:/WINDOWS/Fonts/simfang.ttf 
      * @param String encoding 编码 如:GB2312。 
      * @param String htmlDTDURL  如:http://xxxx/xhtml1-transitional.dtd 
      * version 2009.03.05 
      */  
    public void htmlToPDF(OutputStream out, String htmlcode, String fontpath,  
      String  
      fontName, String encoding, String htmlDTDURL) throws Exception {  
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  
      ByteArrayOutputStream bos = new ByteArrayOutputStream();  
      Transformer transformer = TransformerFactory.newInstance()  
        .newTransformer();  
      ITextRenderer renderer = new ITextRenderer();  
      ITextFontResolver resolver = renderer.getFontResolver();  
      InputStream intream = null;  
      Document doc = null;  
      Document doc2 = null;  
      try {  
      htmlcode = this.filterHeader(htmlcode,  
      
      encoding, fontName, htmlDTDURL);  
        
      intream = new ByteArrayInputStream(htmlcode.getBytes(encoding));  
      doc = (Document) builder.parse(intream);  
      transformer.setOutputProperty("encoding", encoding);  
      new DOMSource(doc);  
      transformer.transform(new DOMSource(doc), new StreamResult(bos));  
      intream = new ByteArrayInputStream(bos.toString().getBytes());  
      doc2 = (Document) builder.parse(intream);  
        
      resolver.addFont(fontpath, BaseFont.IDENTITY_H,  
        BaseFont.NOT_EMBEDDED);  
        
      renderer.setDocument(doc2, null);  
      renderer.layout();  
        
      renderer.createPDF(out, true);  
        
      out.flush();  
      out.close();  
      } catch (Exception ex) {  
        
      throw new Exception(ex.getMessage());  
      }  
    }  
    /** 
      *文件头  
    */  
    private String filterHeader(String htmlcode, String encoding,String fontName,String htmlDTDURL) {  
      htmlcode="<table style="/" mce_style="/""font-family:FangSong_GB2312/" width=/"100%/" height=/"100%/" border=/"0/"><tr><td>"+htmlcode+"</td></tr></table>";  
      htmlcode="<!DOCTYPE html PUBLIC /"-//W3C//DTD XHTML 1.0 Transitional//EN/"  /""+htmlDTDURL+"/" >/n"+htmlcode;  
      htmlcode = "<?xml version=/"1.0/" encoding=/"" + encoding + "/" ?>/n"  
        + htmlcode;  
      return htmlcode;  
    }  
    }  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值