HTML生成PDF文件

package net.poweroak.saas.crm.modules.collection.controller;

import com.itextpdf.text.pdf.BaseFont;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.File;
import java.io.FileOutputStream;
import java.io.StringWriter;
import java.util.Locale;
import java.util.Map;

/**
 * 生成pdf文件工具类
 *
 * @author message
 * @create
 */
@Slf4j
public class PdfExportUtil {

    /**
     * 存放文件模板的地址
     */
    //字体文件名称
    private final static String DEFAULT_FONT = "yahei.ttf";
    //编码格式
    private final static String ENCODING = "UTF-8";
    //模板文件夹相对路径
    public final static String TEMPLATE_PATH = "D:\\BaiduNetdiskDownload\\";

    public static void generate(String templateContent, Map<String, Object> dataMap, File file) {
        FileOutputStream outputStream = null;
        ITextRenderer renderer = new ITextRenderer();
        try {
            Configuration cfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
            StringTemplateLoader stringLoader = new StringTemplateLoader();
            stringLoader.putTemplate("myTemplate", templateContent);
            cfg.setTemplateLoader(stringLoader);
            Template template = cfg.getTemplate("myTemplate", "utf-8");
            String htmlData = FreeMarkerTemplateUtils.processTemplateIntoString(template, dataMap);
            outputStream = new FileOutputStream(file);
            ITextFontResolver fontResolver = renderer.getFontResolver();
            // 解决中文乱码问题,fontPath为中文字体地址
            fontResolver.addFont(TEMPLATE_PATH + DEFAULT_FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            renderer.setDocumentFromString(htmlData);
            renderer.layout();
            renderer.createPDF(outputStream);
        } catch (Exception e) {
            log.error("生成失败", e);
        } finally {
            renderer.finishPDF();
            IOUtils.closeQuietly(outputStream);
        }
    }
}

    public static void main(String[] args) throws IOException, DocumentException {
        Map<String, Object> paramsMap = new HashMap<>(128);
        paramsMap.put("invoice", "发票");
        paramsMap.put("serialNumber", "123456");
        paramsMap.put("orderNumber", "123456");
        paramsMap.put("invoiceDate", "2024/07/12");
        paramsMap.put("deliveryDate", "2024/07/12");
        paramsMap.put("externalOrderNumber", "123456");
        String fileName = "ceshi_" + System.currentTimeMillis() + ".pdf";
        String htmlContent = "";
        PdfExportUtil.generate(htmlContent , paramsMap, new File(PdfExportUtil.TEMPLATE_PATH + fileName));
        System.out.println(new File(PdfExportUtil.TEMPLATE_PATH + fileName).length());
    }

}
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过使用iText库来生成PDF文件,而根据HTML生成PDF文件可以使用iText的XMLWorkerHelper类。 下面是一个简单的示例,可以通过传入一个集合数据来生成PDF文件,并动态判断集合的数量,换行展示。 ```java import java.io.*; import java.util.List; import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import com.itextpdf.tool.xml.XMLWorkerHelper; public class HtmlToPdf { public static void main(String[] args) throws Exception { List<String> dataList = getDataList(); // 获取数据集合 // 创建Document对象 Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("output.pdf")); document.open(); // 将HTML转换为PDF并添加到Document中 for (String data : dataList) { // 处理换行 if (!dataList.get(0).equals(data)) { document.add(new Paragraph("\n")); } String html = "<html><body>" + data + "</body></html>"; InputStream is = new ByteArrayInputStream(html.getBytes("UTF-8")); XMLWorkerHelper.getInstance().parseXHtml(writer, document, is); } document.close(); } private static List<String> getDataList() { // TODO: 获取数据集合 } } ``` 在上面的示例中,我们首先获取了数据集合,然后创建了一个Document对象,并将其打开。接着,我们遍历数据集合,对于每一个数据,我们先处理换行,然后将其包装成HTML,使用iText的XMLWorkerHelper将HTML转换为PDF,并将其添加到Document中。最后,我们关闭Document对象。 需要注意的是,由于PDF是一种固定格式的文档,因此在生成PDF时要尽可能避免出现换行、分页等情况。如果数据量较大,建议采用分页查询的方式,将数据分页展示,以避免出现不可控的换行情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值