利用Flying Saucer 和 iText 实现HTMl转PDF(java)

PDF是目前为止最流行的文档格式之一。通常情况下,想要创建一个PDF文档,需要使用Adobe的API来生成,但这非常麻烦。为了能方便的将HTML(XHTML)生成PDF文档,下面介绍两个开源的java库:Flying Saucer和iText。

Flying Saucer和iText介绍:

Flying Saucer(或者叫xhtmlrender project on java.net)是一个基于iText的开源java库,能够轻松的将html(带css2.1)生成pdf。

iText是一个生成PDF文档的开源java库,能够动态从XML或者数据库生成PDF,同时它具备PDF文档的绝大多数属性(比如加密……),支持java,C#等。

生成简单的PDF

下面我们首先创建一个简单的带css的html,代码如下:

<?xml version="1.0
" encoding="UTF-8
"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title>My First Document</title>
        <style type="text/css"> b { color: green; } </style>
    </head>
    <body>
        <p>
            <b>Greetings Earthlings!</b>
            We've come for your Java.
        </p>
    </body>
</html>

接下来生成一个pdf
package oliver.itext.html2pdf;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;

public class FirstDoc

{

    public static void main(String[] args) throws DocumentException, IOException

    {

        String path = System.getProperty("user.dir") + "/src/";

        String inputFile = path + "samples/firstdoc.html";

        String url = new File(inputFile).toURI().toURL().toString();

        String outputFile = path + "outputs/fistdoc.pdf";

        OutputStream os = new FileOutputStream(outputFile);

        ITextRenderer render = new ITextRenderer();

        render.setDocument(url);

        render.layout();

        render.createPDF(os);

        os.close();

    }

}


结果如下:
image

用Fly生成内容

下面的我们先用StringBuilder生成一个HTML的字符串,然后用DOM解析,生成PDF。

package com.sankuai.meituan.ct.doamin;



import java.io.FileOutputStream;

import java.io.OutputStream;

import java.io.StringBufferInputStream;



import javax.xml.parsers.DocumentBuilder;

import
 javax.xml.parsers.DocumentBuilderFactory;



import org.w3c.dom.Document;

import  org.xhtmlrenderer.pdf.ITextRenderer;





@SuppressWarnings("deprecation")

public class OneHundredBottles{

    public static void main(String[] args) throws Exception
    {
        String path =System.getProperty("user.dir")+"/src/";

        StringBuffer buf = new StringBuffer();

        buf.append("<html>");

        // put in some style
        buf.append("<head><style language='text/css'>");

        buf.append("h3 { border: 1px solid #aaaaff; background: #ccccff; ");

        buf.append("padding: 1em; text-transform: capitalize; font-family: sansserif; font-weight: normal;}");

        buf.append("p { margin: 1em 1em 4em 3em; } p:first-letter { color: red; font-size: 150%; }");

        buf.append("h2 { background: #5555ff; color: white; border: 10px solid black; padding: 3em; font-size: 200%; }");

        buf.append("</style></head>");

        // generate the body


        buf.append("<body>");

        buf.append("<p><img src='"+path+"samples/100bottles.jpg'/></p>");

        for(int i=99; i>0; i--) {

            buf.append("<h3>"+i+" bottles of beer on the wall, "

                    + i + " bottles of beer!</h3>");

            buf.append("<p>Take one down and pass it around, "

                    + (i-1) + " bottles of beer on the wall</p>/n");

        }

        buf.append("<h2>No more bottles of beer on the wall, no more bottles of beer. ");

        buf.append("Go to the store and buy some more, 99 bottles of beer on the wall.</h2>");

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

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

        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

        Document doc = builder.parse(new StringBufferInputStream(buf.toString()));

        ITextRenderer renderer = new ITextRenderer();

        renderer.setDocument(doc, null);

        String outputFile = path+"outputs/100bottles.pdf";

        OutputStream os = new FileOutputStream(outputFile);

        renderer.layout();

        renderer.createPDF(os);

        os.close();

    }

}


效果如下:


image

在服务端创建PDF

下面展示在servlet里面创建pdf

public
 class
 PDFServlet extends
 HttpServlet {

    

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("application/pdf");
        StringBuffer buf = newStringBuffer();
        buf.append("<html>");
        String css = getServletContext().getRealPath("/PDFservlet.css");
       // put in some style
        buf.append("<head><link rel='stylesheet' type='text/css' "+"href='"+css+"' media='print'/></head>");
       ... //generate the rest of the HTML
       // parse our markup into an xml Document
        try{
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = builder.parse(new StringBufferInputStream(buf.toString()));
            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocument(doc, null);
            renderer.layout();
            OutputStream os = response.getOutputStream();
            renderer.createPDF(os);
            os.close();
        } catch(Exception ex) {
            ex.printStackTrace();
        }

    }

原文地址:http://today.java.net/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值