`
ol_beta
  • 浏览: 282279 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

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

    博客分类:
  • 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();
	}
}
 
结果如下:


 

用Fly生成内容

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

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();
    }
}
 效果如下:


在服务端创建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
  • 大小: 12.1 KB
  • 大小: 34.5 KB
分享到:
评论

相关推荐

    flyingsaucer

    Flying Saucer和iText介绍: A. iText是一个生成PDF文档的开源java库,能够动态从XML或者数据库生成PDF,同时它具备PDF文档的绝大多数属性(比如加密……),支持java,C#等。官网:http://www.itextpdf.com/ B. ...

    flying-saucer-pdf-itext5-9.0.3.jar

    flying-saucer-pdf-itext5-9.0.3.jar

    flying-saucer-pdf-9.0.9转pdf相关包

    flying-saucer-pdf-9.0.9.jar; flying-saucer-core-9.0.9.jar; freemarker.jar; itext-2.1.7.jar;

    flying-saucer-pdf-9.0.3.jar

    基于iText 和 flying saucer结合freemark java 生成 pdf

    Java实现HTML页面转PDF解决方案

    而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片转成PDF或者自己写了Velocity或者FreeMarker模板生成了HTML是非常推荐直接用Itext来进行的。而如果,大家像我这样已经有前人写好了HTML...

    flying-saucer-core-9.0.3.jar

    基于iText 和 flying saucer 结合 freemark java 生成 pdf

    flying sauser生成PDF所需jar包

    flying sauser,基于iText自身的问题,让我们开始寻求可以真正意义上模版技术,那么flying sauser就是为了这个问题出现的产品,能解析HTML和CSS,而且能输出成image,PDF等格式。具体使用,请访问:...

    修改core-render.jar源码让itext中文换行

    但是导出一篇文章到pdf里面,就需要借助core-render.jar包,但是一行中文过长,不会自动换行,在pdf文件里面把过长的字符给截取,这样很不友好,修改Flying Saucer的源码,解决了这个中文不换行问题。希望能给大家...

    java 根据html生成PDF

    flying saucer把html生成PDF,感觉还不错,支持css样式,itext 和 pd4ml好像对于复杂样式不能支持

    java生成pdf需要的包(支持中文,表格换行亲测)

    java生成pdf需要的包(支持中文,表格换行亲测),支持css,用到的是freemarker ,flying-saucer,itext

    java动态导出PDF文件(含jar包)

    java语言动态生成html串,通过flying saucer动态生成PDF文件;处理图片大小及坐标等信息...

    java pdf方案测试

    java html生成pdf的解决方案,包括常见错误的处理,如中文问题、css路径、图片,内有测试例子等。是java中pdf方案的好帮手哦

    Java报表生成解决方案

    该代码提供了word、excel、pdf三种类型的文档生成方案,其中word文档使用“freemarker + xml + 模板”技术;excel使用“POI + 模板”技术;pdf使用“freemarker + itext + flying saucer”技术

    word源码java-acp:ApplicationConstructionPlatform应用构建平台。该项目是用Kotlin和Java语言

    word源码java acp v6.5.4 ...flying-saucer-pdf-itext5 knife4j junit5 nacos sentinel spring-cloud-alibaba spring-cloud spring-boot spring-aop spring-data-jpa spring-security spring-security-oa

Global site tag (gtag.js) - Google Analytics