html转pdf的java实现

  1. import java.io.File;  
  2. import java.io.FileOutputStream;  
  3. import java.io.OutputStream;  
  4.   
  5. import org.xhtmlrenderer.pdf.ITextFontResolver;  
  6. import org.xhtmlrenderer.pdf.ITextRenderer;  
  7.   
  8. import com.lowagie.text.pdf.BaseFont;  
  9.   
  10. public class TestFlyingSauser  
  11. {  
  12.   
  13.     public static void main( String[] args ) throws Exception  
  14.     {  
  15. //        demo_1();  
  16.         demo_2();  
  17.     }  
  18.   
  19.     // 不支持中文  
  20.     public static void demo_1() throws Exception  
  21.     {  
  22.         String inputFile = "D:/Test/flying.html";  
  23.         String url = new File( inputFile ).toURI().toURL().toString();  
  24.         String outputFile = "D:/Test/flying.pdf";  
  25.         OutputStream os = new FileOutputStream( outputFile );  
  26.         ITextRenderer renderer = new ITextRenderer();  
  27.         renderer.setDocument( url );  
  28.         renderer.layout();  
  29.         renderer.createPDF( os );  
  30.         os.close();  
  31.     }  
  32.   
  33.     // 支持中文  
  34.     public static void demo_2() throws Exception {    
  35.         String outputFile = "G:/demo_3.pdf";    
  36.         OutputStream os = new FileOutputStream(outputFile);    
  37.         ITextRenderer renderer = new ITextRenderer();    
  38.         ITextFontResolver fontResolver = renderer.getFontResolver();    
  39.         fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);    
  40.         StringBuffer html = new StringBuffer();    
  41.         // DOCTYPE 必需写否则类似于 这样的字符解析会出现错误    
  42.         html.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">");    
  43.         html.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">").  
  44.              append("<head>")    
  45.             .append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />")  
  46.             .append("<style type=\"text/css\" mce_bogus=\"1\">body {font-family: SimSun;}</style>")   
  47.             .append("</head>")    
  48.             .append("<body>");    
  49.         html.append("<div>支持中文!</div>");    
  50.         html.append("</body></html>");    
  51.         renderer.setDocumentFromString(html.toString());    
  52.         // 解决图片的相对路径问题    
  53.         // renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");    
  54.         renderer.layout();    
  55.         renderer.createPDF(os);    
  56.         os.close();    
  57.     }}  



Java代码   收藏代码
  1. import java.io.ByteArrayInputStream;  
  2. import java.io.ByteArrayOutputStream;  
  3. import java.io.InputStream;  
  4. import java.io.OutputStream;  
  5.   
  6. import javax.xml.parsers.DocumentBuilder;  
  7. import javax.xml.parsers.DocumentBuilderFactory;  
  8. import javax.xml.transform.Transformer;  
  9. import javax.xml.transform.TransformerFactory;  
  10. import javax.xml.transform.dom.DOMSource;  
  11. import javax.xml.transform.stream.StreamResult;  
  12.   
  13. import org.w3c.dom.Document;  
  14. import org.xhtmlrenderer.pdf.ITextFontResolver;  
  15. import org.xhtmlrenderer.pdf.ITextRenderer;  
  16.   
  17. public class HTML2PDF {  
  18.   
  19. /** 
  20.   * 调 用方式 htmlToPDF(response.getOutputStream(), htmlstr, "C:/WINDOWS/Fonts /simfang.ttf", "FangSong_GB2312", "GB2312", "http://xxxx/dtd/xhtml1-transitional.dtd"); 
  21.   *  
  22.   * 相关图片必须使用绝对路径才能显示 如果要下载生成的文件,在此方法上方加上: 
  23.   * response.setHeader("Content-disposition", 
  24.   * "attachment;filename=英文文件名.pdf"); 
  25.   *  
  26.   * @param 参数 
  27.   * @param OutputStream out 输出流 
  28.   * @param String htmlcode html代码。 
  29.   *  
  30.   * @param String fontName 字体名称 如:FangSong_GB2312 
  31.   * @param String fontpath windows 字体路径 如:C:/WINDOWS/Fonts/simfang.ttf 
  32.   * @param String encoding 编码 如:GB2312。 
  33.   * @param String htmlDTDURL  如:http://xxxx/xhtml1-transitional.dtd 
  34.   * version 2009.03.05 
  35.   */  
  36. public void htmlToPDF(OutputStream out, String htmlcode, String fontpath,  
  37.   String  
  38.   fontName, String encoding, String htmlDTDURL) throws Exception {  
  39.   DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();  
  40.   ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  41.   Transformer transformer = TransformerFactory.newInstance()  
  42.     .newTransformer();  
  43.   ITextRenderer renderer = new ITextRenderer();  
  44.   ITextFontResolver resolver = renderer.getFontResolver();  
  45.   InputStream intream = null;  
  46.   Document doc = null;  
  47.   Document doc2 = null;  
  48.   try {  
  49.   htmlcode = this.filterHeader(htmlcode,  
  50.   
  51.   encoding, fontName, htmlDTDURL);  
  52.     
  53.   intream = new ByteArrayInputStream(htmlcode.getBytes(encoding));  
  54.   doc = (Document) builder.parse(intream);  
  55.   transformer.setOutputProperty("encoding", encoding);  
  56.   new DOMSource(doc);  
  57.   transformer.transform(new DOMSource(doc), new StreamResult(bos));  
  58.   intream = new ByteArrayInputStream(bos.toString().getBytes());  
  59.   doc2 = (Document) builder.parse(intream);  
  60.     
  61.   resolver.addFont(fontpath, BaseFont.IDENTITY_H,  
  62.     BaseFont.NOT_EMBEDDED);  
  63.     
  64.   renderer.setDocument(doc2, null);  
  65.   renderer.layout();  
  66.     
  67.   renderer.createPDF(out, true);  
  68.     
  69.   out.flush();  
  70.   out.close();  
  71.   } catch (Exception ex) {  
  72.     
  73.   throw new Exception(ex.getMessage());  
  74.   }  
  75. }  
  76. /** 
  77.   *文件头  
  78. */  
  79. private String filterHeader(String htmlcode, String encoding,String fontName,String htmlDTDURL) {  
  80.   htmlcode="<table style=\"font-family:FangSong_GB2312\" width=\"100%\" height=\"100%\" border=\"0\"><tr><td>"+htmlcode+"</td></tr></table>";  
  81.   htmlcode="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"  \""+htmlDTDURL+"\" >\n"+htmlcode;  
  82.   htmlcode = "<?xml version=\"1.0\" encoding=\"" + encoding + "\" ?>\n"  
  83.     + htmlcode;  
  84.   return htmlcode;  
  85. }  

你可能感兴趣的:(java实现)