java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片



java-使用 flying-saucer 通过 xhtml 生成 pdf 文档支持 css 和 图片


重要说明:
1.使用 xhtml 生成 pdf ,对于 xhtml 的语法要求非常严格;
2.中文支持,需要手动加载中文字体文件,还需要在 css 中指定 body 中指定字体,加载的字体文件和css中指定的字体不对应时,中文不显示;
3.图片路径,需要手动指定图片的相对路径地址,否则图片不显示;
4.路劲格式,使用 uri 路径格式,uri 格式不正确是生成的内容将是空,正确格式为(file:/D:/Temp/pdf/template/about.xhtml);


项目地址:
https://github.com/flyingsaucerproject
用的官网 v9.1.5 版本:
https://github.com/flyingsaucerproject/flyingsaucer/releases/tag/v9.1.5
源码下载:
https://github.com/flyingsaucerproject/flyingsaucer/archive/v9.1.5.zip


提示:在 eclipse 中打开时,建议使用 阿里云 的maven 私服,源码 20M 构建需要下载 20M 的依赖包;


演示内容:通过 xhtml 生成带有中文、图片的 pdf 文档;


一、添加 maven 依赖包


	org.xhtmlrenderer
	flying-saucer-pdf
	9.1.5
	




二、junit 测试代码

import static org.junit.Assert.*;


import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Iterator;


import org.junit.Before;
import org.junit.Test;
import org.springframework.web.bind.annotation.InitBinder;
import org.w3c.dom.Document;
import org.xhtmlrenderer.pdf.ITextOutputDevice;
import org.xhtmlrenderer.pdf.ITextRenderer;
import org.xhtmlrenderer.pdf.ITextUserAgent;
import org.xhtmlrenderer.resource.XMLResource;
import org.xml.sax.InputSource;


import com.lowagie.text.pdf.BaseFont;
import com.sun.xml.internal.xsom.impl.scd.Iterators.Map;


/**
 *
 * @author xxj
 */
public class PdfTest {


	@Before
	public void Init() {
	}


	/**
	 * 指定 xhtml 路径形式
	 * 
	 */	
	@Test
	public void craetePdf() {
		String url="D:/Temp/pdf/template/about.xhtml";
		String pdf="D:/Temp/pdf/craetePdf.pdf";


		
		OutputStream os = null;
		try {
	        if (url.indexOf("://") == -1) {
	            // maybe it's a file
	            File f = new File(url);
	            if (f.exists()) {
	                url = f.toURI().toURL().toString();
	            }
	        }
	        System.err.println("xhtml 地址:"+url);
	        System.err.println("pdf 地址:"+url);
	        
			os = new FileOutputStream(pdf);


			/*
			 * standard approach ITextRenderer renderer = new ITextRenderer();
			 * 
			 * renderer.setDocument(url); renderer.layout();
			 * renderer.createPDF(os);
			 */


			ITextRenderer renderer = new ITextRenderer();
			ResourceLoaderUserAgent callback = new ResourceLoaderUserAgent(renderer.getOutputDevice());
			callback.setSharedContext(renderer.getSharedContext());
			renderer.getSharedContext().setUserAgentCallback(callback);


			Document doc = XMLResource.load(new InputSource(url)).getDocument();
			
			renderer.setDocument(doc, url);
			
			renderer.layout();
			renderer.createPDF(os);


			os.close();
			os = null;
		} catch(Exception ex){
			ex.printStackTrace();
		}
		finally {
			if (os != null) {
				try {
					os.close();
				} catch (IOException e) {
					// ignore
				}
			}
		}
	}


	/**
	 * 将 xhtml 转为 string 形式
	 * 
	 */
	@Test
	public void craetePdfByHtmlStr() {
		String url="D:/Temp/pdf/template/about.xhtml";
		String pdf="D:/Temp/pdf/craetePdfByHtmlStr.pdf";
		String font1 ="C:/Windows/Fonts/simsun.ttc";//宋体(对应css中的 属性 font-family: SimSun; /*宋体*/)


		String html = readFile(url);
		
		OutputStream os = null;
		try {
	        if (url.indexOf("://") == -1) {
	            File f = new File(url);
	            if (f.exists()) {
	                url = f.toURI().toURL().toString();
	            }
	        }
	        System.err.println("xhtml 地址:"+url);
	        System.err.println("pdf 地址:"+pdf);
	        
			os = new FileOutputStream(pdf);


			ITextRenderer renderer = new ITextRenderer();
			ResourceLoaderUserAgent callback = new ResourceLoaderUserAgent(renderer.getOutputDevice());
			renderer.getSharedContext().setUserAgentCallback(callback);
			callback.setSharedContext(renderer.getSharedContext());
			//添加中文字体
			renderer.getFontResolver().addFont(font1, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
			
			
			renderer.setDocumentFromString(html,url);
			
			renderer.layout();
			renderer.createPDF(os);


			os.close();
			os = null;
		} catch(Exception ex){
			ex.printStackTrace();
		}
		finally {
			if (os != null) {
				try {
					os.close();
				} catch (IOException e) {
					// ignore
				}
			}
		}
	}
	/**
	 * 资源加载代理
	 *
	 */
	private static class ResourceLoaderUserAgent extends ITextUserAgent {
		public ResourceLoaderUserAgent(ITextOutputDevice outputDevice) {
			super(outputDevice);
		}


		protected InputStream resolveAndOpenStream(String uri) {
			InputStream is = super.resolveAndOpenStream(uri);
			System.out.println("加载资源文件: " + uri);
			return is;
		}
	}
	/**
	 * 将文件转为 字符串
	 * @param fileName
	 * @return
	 */
	public static String readFile(String fileName) {
        FileInputStream file = null;
        BufferedReader reader = null;
        InputStreamReader inputFileReader = null;
        String content = "";
        String tempString = null;
        try {
            file = new FileInputStream(fileName);
            inputFileReader = new InputStreamReader(file, "utf-8");
            reader = new BufferedReader(inputFileReader);
            // 一次读入一行,直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                content += tempString;
            }
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
        return content;
    }
}




三、编写 xhtml 模板
目录结构:D:\Temp\pdf\template
template
|-images
|-+-flyingsaucer.png
|-about.xhtml


about.xhtml 文件内容





  
    Flying Saucer: CSS List Support
    
    
  
  
    

Browser Application Demo

An example of integrating Flying Saucer in a real application.

(This is not a real web browser)

Licensed under the GNU Lesser General Public License.

hello word!

你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!
你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!
你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!
你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!
你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!
你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!

你好,世界!
你好,世界!


你可能感兴趣的:(java)