Java html转pdf 且解决中文不显示问题

记录一下利用freemarker 将html转换pdf的教程

pom.xml引入包

<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker -->
        <dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.11</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf -->
        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>flying-saucer-pdf</artifactId>
            <version>9.1.5</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf-itext5 -->
        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>flying-saucer-pdf-itext5</artifactId>
            <version>9.1.5</version>
        </dependency>


        <!-- 解决中文字体问题 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.19</version>
        </dependency>

解决中文不显示问题

package com.express.excms.enroll.config;

import com.itextpdf.text.Font;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;

/**
 * Created by IntelliJ IDEA.
 * User: 贝先 [ Cason mo ]
 * Date: 2021/11/12
 * Time: 14:46
 */
public class AsianFontProvider extends XMLWorkerFontProvider {
    @Override
    public Font getFont(String fontname, String encoding, float size, final int style) {
        try {
            BaseFont bfChinese =BaseFont.createFont( "STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
            return new Font(bfChinese, size, style);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.getFont(fontname, encoding, size, style);
    }
}

html转pdf

package com.express.excms.enroll.utils;

import com.express.excms.enroll.config.AsianFontProvider;
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.nio.charset.StandardCharsets;

/**
 * Created by IntelliJ IDEA.
 * User: 贝先 [ Cason mo ]
 * Date: 2021/10/18
 * Time: 10:54
 */
@Slf4j
public class PDFUtils {
    /**
     * ByteArrayOutputStream pdf文件流
     * @param htmlContent 通过freemarker生成的html
     * @return
     * @throws Exception
     */
    public static ByteArrayOutputStream htmlToPdf(String htmlContent) throws Exception {
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        Document document = new Document();
        PdfWriter pdfWriter = PdfWriter.getInstance(document, output);
        document.open();
        XMLWorkerHelper.getInstance().parseXHtml(pdfWriter,document,new ByteArrayInputStream(htmlContent.getBytes(StandardCharsets.UTF_8)),null, StandardCharsets.UTF_8,new AsianFontProvider());
        document.close();
        return output;
    }

    /**
     * 写入到文件
     * @param htmlContent 通过freemarker生成的html
     * @param filePath 要写入的pdf文件地址
     * @throws Exception
     */
    public static void htmlToPdf(String htmlContent,String filePath) throws Exception {
        Document document = new Document();
        PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(filePath));
        document.open();
        XMLWorkerHelper.getInstance().parseXHtml(pdfWriter,document,new ByteArrayInputStream(htmlContent.getBytes(StandardCharsets.UTF_8)),null, StandardCharsets.UTF_8,new AsianFontProvider());
        document.close();
    }
}

freemarker 解析并获取生成的html

        @Autowired
        private Configuration configuration;


......省略



        Configuration cfg = (Configuration) configuration.clone();
        cfg.clearTemplateCache();
        Template t = new Template(templateInDB.getName(), new StringReader(未渲染的html), configuration);
        String html = FreeMarkerTemplateUtils.processTemplateIntoString(t, 要渲染的数据);
        try {
            ByteArrayOutputStream byteArrayOutputStream = PDFUtils.htmlToPdf(html);
            //获取pdf的base64
            byte[] bytes = byteArrayOutputStream.toByteArray();
       
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseResult.defaultFailed(e.getMessage());
        }
    

效果图

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用iTextPDF将静态HTML换为PDF时,可能会遇到显示不全的问题。这可能是由于以下原因导致的: 1. HTML中的内容超出了PDF页面的边界。请确保PDF页面的大小适合HTML内容,可以尝试调整PDF页面的大小或缩放HTML内容来适应页面。 2. iTextPDF对某些HTML样式或标签的支持有限。如果在HTML中使用了iTextPDF不支持的样式或标签,可能会导致部分内容无法正确显示。在这种情况下,您可以尝试使用其他样式替代或调整HTML内容,以使其与iTextPDF兼容。 3. 可能存在字体缺失或字体格式不支持的情况。iTextPDF在处理字体时可能会遇到问题,特别是对于非标准字体或特殊字体格式。确保您使用的字体在iTextPDF中可用,并且字体文件正确配置。 解决这些问题的方法包括: - 确保PDF页面大小适合HTML内容。 - 调整HTML内容以适应PDF页面或更换不受支持的样式。 - 确保使用的字体在iTextPDF中可用,并且字体文件正确配置。 如果问题仍然存在,您可以检查iTextPDF的文档和社区支持资源,寻找更多关于解决显示不全问题的帮助。同时,您还可以尝试使用其他的HTMLPDF工具或库来解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [itext 将htmlpdf中文显示换行以及字体问题](https://download.csdn.net/download/qq_38616723/85585479)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JAVA使用itextpdf实现HTMLPDF](https://download.csdn.net/download/qq_33235020/13072574)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Java与C语言混合开发技术](https://download.csdn.net/download/milk416666/88249349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值