文档章节

根据html页面生成pdf

请叫我代码君
 请叫我代码君
发布于 2017/09/07 14:00
字数 505
阅读 13
收藏 0

 

1.生成pdf的工具类代码:

package com.yfore.jfinal.pdf.plugin;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Map;

import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.itextpdf.text.pdf.BaseFont;
import com.jfinal.kit.PathKit;

import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 * PDF工具类
 * 
 * @author OYJ
 *
 */
public class PdfKit {
    private static final String HTML = "/template/template_freemarker_fs.html";
    private static final String FONT = "/simhei.ttf";
    private static final String LOGO_PATH = "file:///" + PathKit.getRootClassPath().replace("\\", "/")
            + "/template/logo.png";
    private static Configuration freemarkerCfg = null;

    static {
        freemarkerCfg = new Configuration();
        // freemarker的模板目录
        try {
            freemarkerCfg.setDirectoryForTemplateLoading(new File(PathKit.getRootClassPath()+"/"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * freemarker渲染html
     */
    public static String freeMarkerRender(Map<String, Object> data) {
        Writer out = new StringWriter();//准备好一个输出的对象
        try {
            // 获取模板,并设置编码方式
            Template template = freemarkerCfg.getTemplate(HTML,"UTF-8");
            // 合并数据模型与模板
            template.process(data, out); // 将合并后的数据和模板写入到流中,这里使用的字符流
            out.flush();//强制性清空缓冲区的内容
            return out.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 生成pdf
     * @param fileOutputStream 
     * @param content
     * @return
     * @throws PdfCreateException
     */
    public static void createPdf(String content) throws PdfCreateException {
        try {
            String pdfUrl = "D:/System Files/Desktop/e-policy.pdf";//生成的pdf保存路径
            File pdfFile = new File(pdfUrl);
            OutputStream os = new FileOutputStream(pdfFile);
            ITextRenderer render = new ITextRenderer();// 将HTML渲染PDF
            ITextFontResolver fontResolver = render.getFontResolver();// 设置渲染的字体
            fontResolver.addFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            // 解析html生成pdf
            render.setDocumentFromString(content);
            // 解决图片相对路径的问题
            render.getSharedContext().setBaseURL(LOGO_PATH);
            render.layout();
            render.createPDF(os);
        } catch (Exception e) {
            throw new PdfCreateException("创建PDF错误!", e);
        }
    }
}

 

2.测试用例方法代码:

package com.yfore.jfinal.pdf.plugin;

import java.util.HashMap;
import java.util.Map;

import junit.framework.TestCase;

/**
 * Unit test for simple App.
 */
public class AppTest extends TestCase {
    /**
     * Rigourous Test :-)
     */
    public void testApp() {

        Map<String, Object> data = new HashMap<String, Object>();
        data.put("name", "欧阳军");
        try {
            String content = PdfKit.freeMarkerRender(data);
            PdfKit.createPdf(content);
        } catch (PdfCreateException e) {
            e.printStackTrace();
        }

        assertTrue(true);
    }
}
 

3.html模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
    <style>
        body{
            font-family:SimHei;
        }
        .color{
            color: green;
        }
        .pos{
            position:absolute;
            left:200px;
            top:5px;
            width: 200px;
            font-size: 10px;
        }
    </style>
</head>
<body>
<img src="logo.png" width="600px"/>
<div class="color pos">
    你好,${name}
</div>
</body>
</html>

模板中<img src="logo.png" width="600px"/> 的logo.png是绑定图片的,与生成pdf的工具类中的render.getSharedContext().setBaseURL(LOGO_PATH);中图片的米命名(logo.png)一致。html模板中可以存在多个img标签,也就是说可以绑定多张图片。

 demo克隆地址:https://git.oschina.net/JuniorCode/ShengChengPDF.git

© 著作权归作者所有

请叫我代码君
粉丝 1
博文 1
码字总数 505
作品 0
深圳
程序员
私信 提问
Javascript将html转成pdf,下载(html2canvas 和 jsPDF)

最近碰到个需求,需要把当前页面生成pdf,并下载。弄了几天,自己整理整理,记录下来,我觉得应该会有人需要 :) 项目源码地址:https://github.com/linwalker/render-html-to-pdf html2ca...

孟飞阳
2018/08/15
253
0
最有效的php生成pdf文件的方法,html转pdf文件方法

之前有个客户需要把一些html页面生成pdf文件,然后我就找一些用php把html页面围成pdf文件的类。方法是可谓是找了很多很多,什么html2pdf,pdflib,FPDF这些都试过了,但是都没有达到我要的求。...

Deacyn
2014/08/13
670
0
PHP HTML 生成 PDF (转)

博客分类: Php / Mysql HTMLPHPFP脚本CSS 有时我们需要使用脚本动态的创建PDF文档,这里介绍一些免费的开源PHP脚本来生成PDF 的方法。 1.FPDF: PDF生成器 FPDF是一个纯粹的通过PHP类来生成P...

77970290
2012/05/24
3.6K
0
flying saucer html转pdf经验分享

对比了很多生成pdf的方案,最终还是决定使用flying saucer,网上能搜出N多相关文章,但是照着做了会出现各种问题,还是得自己一点点摸索,前后花了两天时间才达到自己的目标,下面把过程中的...

shaguofen
2014/05/24
10.6K
2
IOS项目自动生成技术文档很方便实用

Xcode工具本身不具备这样的功能,但是我们通过一些插件和工具来达到这个目的。 生成注释 生成文档之前,我们需要给代码中的方法或者变量写上注释,然后再利用工具根据这些规范的注释自动生成...

田广ly
2016/03/18
217
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 403 问题

添加WebAppConfigurer 配置 @Configuration@EnableAutoConfigurationpublic class WebAppConfigurer extends WebMvcConfigurerAdapter { public WebAppConfigurer() { } ......

布袋和尚_爱吃鱼
4分钟前
1
0
Python自动更换壁纸爬虫与tkinter结合

直接上代码 import ctypesimport timeimport requestsimport osfrom threading import Threadfrom tkinter import Tk, Label, Button,Entry,StringVar,messagebox# '放到AppData\Roami......

物种起源-达尔文
4分钟前
1
0
Postgresql Study 笔记

Postgresql 安装 Windows, MAC Install Postgresql 下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads Linux Install sudo apt-get update sudo apt-get in......

slagga
6分钟前
1
0
layer.open 打开新页面传参问题

如图所示,点击出售,把A页面的数据传到弹框上面,因为弹框比较复杂,所以使用引入一个新页面。 A.html a.js B.html b.js 1、第一种方案 sellInte: function (){ var obj = document.g...

木九天
9分钟前
1
0
沙龙报名 | 区块链数据服务技术应用实践

京东云是国内首家提供区块链数据在线分析服务产品的公司,也是行业内首家对区块链数据服务进行开源的公司。 本次沙龙是京东云BDS开源后,首次在深圳举办线下沙龙,我们将邀请京东云BDS团队核...

京东云技术新知
10分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部