您的位置:首页 > Web前端 > HTML

Java实现HTML代码生成PDF文档

2016-05-16 07:11 911 查看
1、IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源。

2、Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),开源。

3、PD4ML实现html2pdf,速度快,纠错能力强,支持多种中文字体,商业。

(一)IText

         测试案例:TestIText.java 

         依赖jar包下载 :iText-2.0.8.jar、iTextAsian.jar(支持中文)

         下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能!

         

[c-sharp] view plain copy

import java.io.FileOutputStream;  

import java.io.FileReader;  

import java.util.ArrayList;  

import com.lowagie.text.Document;  

import com.lowagie.text.Element;  

import com.lowagie.text.Font;  

import com.lowagie.text.PageSize;  

import com.lowagie.text.Paragraph;  

import com.lowagie.text.html.simpleparser.HTMLWorker;  

import com.lowagie.text.html.simpleparser.StyleSheet;  

import com.lowagie.text.pdf.BaseFont;  

import com.lowagie.text.pdf.PdfWriter;  

public class TestIText{  

    public static void main(String[] args) {  

        TestIText ih = new TestIText();  

        ih.htmlCodeComeFromFile("D://Test//iText.html", "D://Test//iText_1.pdf");  

        ih.htmlCodeComeString("Hello中文", "D://Test//iText_2.pdf");  

    }  

      

    public void htmlCodeComeFromFile(String filePath, String pdfPath) {  

        Document document = new Document();  

        try {  

            StyleSheet st = new StyleSheet();  

            st.loadTagStyle("body", "leading", "16,0");  

            PdfWriter.getInstance(document, new FileOutputStream(pdfPath));  

            document.open();  

            ArrayList p = HTMLWorker.parseToList(new FileReader(filePath), st);  

            for(int k = 0; k < p.size(); ++k) {  

                document.add((Element)p.get(k));  

            }  

            document.close();  

            System.out.println("文档创建成功");  

        }catch(Exception e) {  

            e.printStackTrace();  

        }  

    }  

  

    public void htmlCodeComeString(String htmlCode, String pdfPath) {  

        Document doc = new Document(PageSize.A4);  

        try {  

            PdfWriter.getInstance(doc, new FileOutputStream(pdfPath));  

            doc.open();  

            // 解决中文问题  

            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);  

            Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);  

            Paragraph t = new Paragraph(htmlCode, FontChinese);  

            doc.add(t);  

            doc.close();  

            System.out.println("文档创建成功");  

        }catch(Exception e) {  

            e.printStackTrace();  

        }  

    }  

}  

 

 (二)Flying Sauser

         依赖jar包下载 :iText-2.0.8.jar、iTextAsian.jar、core-renderer.jar

         默认情况下,core-renderer.jar对中文是不能进行换行的

        下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能!

        

[c-sharp] view plain copy

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 = "D:/Test/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/"><!--  

body {font-family: SimSun;}  

--></mce:style><style type=/"text/css/" 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();  

    }  

}  

        

(三)PD4ML

        依赖jar包下载 :pd4ml_demo.jar、pd4ml__css2.jar、fonts.jar

       下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能!

      

[java] view plain copy

import java.awt.Insets;  

import java.io.File;  

import java.io.FileOutputStream;  

import java.io.StringReader;  

  

import org.zefer.pd4ml.PD4Constants;  

import org.zefer.pd4ml.PD4ML;  

  

public class Converter {  

    public static void main(String[] args) throws Exception {  

        Converter converter = new Converter();  

        converter.generatePDF_2(new File("D:/Test/demo_ch_pd4ml_a.pdf"), "D:/Test/a.htm");  

        File pdfFile = new File("D:/Test/demo_ch_pd4ml.pdf");  

        StringBuffer html = new StringBuffer();  

        html.append("<html>")  

            .append("<head>")  

            .append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=UTF-8/" />")  

            .append("</head>")  

            .append("<body>")  

            .append("<font face=/"KaiTi_GB2312/">")  

            .append("<font color='red' size=22>显示中文</font>")  

            .append("</font>")  

            .append("</body></html>");  

        StringReader strReader = new StringReader(html.toString());  

        converter.generatePDF_1(pdfFile, strReader);  

    }  

    // 手动构造HTML代码  

    public void generatePDF_1(File outputPDFFile, StringReader strReader) throws Exception {  

        FileOutputStream fos = new FileOutputStream(outputPDFFile);  

        PD4ML pd4ml = new PD4ML();  

        pd4ml.setPageInsets(new Insets(20, 10, 10, 10));  

        pd4ml.setHtmlWidth(950);  

        pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));  

        pd4ml.useTTF("java:fonts", true);  

        pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312", "KaiTi_GB2312");  

        pd4ml.enableDebugInfo();  

        pd4ml.render(strReader, fos);  

    }  

  

    // HTML代码来自于HTML文件  

    public void generatePDF_2(File outputPDFFile, String inputHTMLFileName) throws Exception {  

        FileOutputStream fos = new FileOutputStream(outputPDFFile);  

        PD4ML pd4ml = new PD4ML();  

        pd4ml.setPageInsets(new Insets(20, 10, 10, 10));  

        pd4ml.setHtmlWidth(950);  

        pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));  

        pd4ml.useTTF("java:fonts", true);  

        pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312", "KaiTi_GB2312");  

        pd4ml.enableDebugInfo();  

        pd4ml.render("file:" + inputHTMLFileName, fos);  

    }  

}  

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 生成PDF html