根据html页面生成pdf
根据html页面生成pdf
请叫我代码君 发表于1个月前
根据html页面生成pdf
  • 发表于 1个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 十分钟定制你的第一个小程序>>>   

摘要: html页面中可绑定图片

 

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

共有 人打赏支持
粉丝 2
博文 1
码字总数 505
×
请叫我代码君
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: