springboot+Thymeleaf生成PDF

springboot项目创建以后,pom添加


        
            org.xhtmlrenderer
            flying-saucer-pdf
            9.0.7
        

pdf工具类

package com.ydrx.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;

public class PDFGenerator {
	private Logger logger = LoggerFactory.getLogger(PDFGenerator.class);
	private AbstractConfigurableTemplateResolver templateResolver;
	private TemplateEngine templateEngine;

	public PDFGenerator(final String templatePrefix, final String templateSuffix) {

		this(templatePrefix, templateSuffix, "HTML5", "UTF-8");
	}

	public PDFGenerator(final String templatePrefix, final String templateSuffix, final String templateMode,
			final String templateEncoding) {

		this(new ClassLoaderTemplateResolver());

		this.templateResolver.setPrefix(templatePrefix);
		this.templateResolver.setSuffix(templateSuffix);
		this.templateResolver.setTemplateMode(templateMode);
		this.templateResolver.setCharacterEncoding(templateEncoding);
	}

	public PDFGenerator(AbstractConfigurableTemplateResolver templateResolver) {
		this.templateResolver = templateResolver;
	}

	public PDFGenerator(TemplateEngine templateEngine) {
		this.templateEngine = templateEngine;
	}

	private TemplateEngine getTemplateEngine() {
		if (templateEngine == null) {
			templateEngine = new TemplateEngine();
			templateEngine.setTemplateResolver(templateResolver);
		}

		return templateEngine;
	}

	/**
	 * 根据模板生成一个PDF
	 *
	 * @param ouputPDF
	 *            Target pdf file.
	 * @param template
	 *            Source template.
	 * @param model
	 *            The data for the template.
	 * @throws FileNotFoundException
	 * @throws DocumentException
	 */
	public void generate(File ouputPDF, String template, Map model)
			throws FileNotFoundException, DocumentException {
		final Context ctx = new Context();
		ctx.setVariables(model);

		final TemplateEngine templateEngine = getTemplateEngine();
		String htmlContent = templateEngine.process(template, ctx);

		ITextRenderer renderer = new ITextRenderer();
		ITextFontResolver fontResolver = renderer.getFontResolver();
		try {
			//避免中文为空设置系统字体
			fontResolver.addFont("C:/Windows/Fonts/SIMHEI.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
			fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			logger.error(e.getMessage(), e);
			e.printStackTrace();
		}

		// 解决图片的相对路径问题
		// renderer.getSharedContext().setBaseURL("file:/C:/Users/Administrator.WIN7-1610080938/Desktop/word2pdf/");

		renderer.setDocumentFromString(htmlContent);
		renderer.layout();
		renderer.createPDF(new FileOutputStream(ouputPDF));
	}

}

如果你发现汉字打印没有添加可能是因为没有引用字体。记得更改Linux和windows不同的位置

html页面好多只能使用table排版




    
    
    
    
    回执单
    


回执单






交易流水号:151003
终端设备号:1222132 交易机构号:24 开户机构号:24
交易日期: 授权员编号: 授权员姓名:
姓名: 性别: 民族:
证件类型: 证件号码: 出生日期:
住址:
签发机关: 电话号码:
有效期限: 职业: 月收入:
联系住址:
联网核查结果 :号码与姓名一致且照片存在
业务类型 :
账户类型: 卡号:
身份证头像: 现场采集照片
联网核查头像:
客户确认
本人确认以上打印资料准确无误,并与本人提出的申请一致。 客户签字
  2018年6月15日

如果要打印的最好把@page样式加上

使用

PDFGenerator pdfGenerator = new PDFGenerator("templates/",".html");
Map model = new HashMap<>();
        filePath = Base64Utils.getUrl(filepath,personInfo.getCardNo());
        model.put("front",Base64Utils.ImageToBase64ByLocal(filePath+"front.jpg"));
        model.put("back",Base64Utils.ImageToBase64ByLocal(filePath+"back.jpg"));
        File file = new File(filePath+personInfo.getCardNo()+"_id.pdf");

        try {
//file是要生成的文件名
//中间为modlViewName
//model传到页面的参数
            pdfGenerator.generate(file,"card/voucher3",model);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }

 

你可能感兴趣的:(java)