itextpdf 中文不显示问题

简介: # 现象itextpdf 打印时中文字体显示不出来,莫名其妙的消失不见了。具体现象如下图所示。![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/ddc69588-4fc6-46ff-9d33-07f99340c963.png)真正的理想情况如下图。![](https://ata2-img.oss-cn-zhangj

现象

itextpdf 打印时中文字体显示不出来,莫名其妙的消失不见了。具体现象如下图所示。

真正的理想情况如下图。

解决方案

本质原因是因为字体没有加载到,我们直接启动时加载字体,然后在打印时指定字体就好。当然,机器上也要下载字体。
(说明:别听其他地方说啥引入itext-asian就好,没用的,一定要手动加载字体!!)

机器层面

在dockerfile中添加如下部分。

mkdir -p /etc/fonts && \
wget -O /etc/fonts/pingfang.ttf http://taobaodianying.oss-cn-zhangjiakou.aliyuncs.com/cinema-card/font/PingFang-Medium.ttf

代码层面

每个人的代码都不一样,我给个示例大家参考下就好。

代码示例

加载字体相关代码。

static {
    try {
        if (DevelopUtil.isLocal()) {
            BaseFont baseFont = BaseFont.createFont("pingfang.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            TEXT_FONT = new Font(baseFont, 10, Font.NORMAL);
        } else {
            String dirPath = "/etc/fonts";
            BaseFont baseFont = BaseFont.createFont(dirPath + "/pingfang.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            TEXT_FONT = new Font(baseFont, 10, Font.NORMAL);
        }

    } catch (DocumentException | IOException e) {
        log.error("字体加载错误", e);
    }
}

打印时的部分代码。

Document doc = new Document(PageSize.A4, 20, 20, 20, 20);
try {
    PdfWriter.getInstance(doc, new FileOutputStream(mOutputPdfFileName));
    doc.open();
    doc.newPage();
    Image png1 = Image.getInstance(imageUrl);
    doc.add(png1);
    doc.add(new Paragraph("                                                      " + f1Id
            + "        " + colorInfo, TEXT_FONT));
    doc.add(new Paragraph("                                                      " + sellerId
            + "             " + sellerItemCode, TEXT_FONT));
    doc.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (DocumentException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

File mOutputPdfFile = new File(mOutputPdfFileName);
if (!mOutputPdfFile.exists()) {
    mOutputPdfFile.deleteOnExit();
    return null;
}

打印时的代码要注意的是,在Paragraph创建时要指定字体。(缩进这里用的空格代替,代码很丑陋,有知道怎么写的优雅的朋友记得评论或私聊我)

补充说明

在加载字体的时候需要区分本地测试和线上路径的不同。我这里用DevelopUtil来判断是否本地,如果是本地的话直接从工程根目录找字体,不是本地的话到指定目录去找。附带判断是否本地idea启动的代码,如下所示。

 /**
 * 判断当前是否是本地idea启动
 * @return
 */
public static boolean isLocal(){
    try {
        Class.forName("com.intellij.rt.execution.application.AppMainV2");
        return true;
    } catch (ClassNotFoundException e) {
        return false;
    }
}
相关文章
|
缓存 Linux Windows
flyingsaucer进行html文件转图片和pdf
目录 一、前言 二、html转图片 1、添加依赖 2、代码示例 (1)测试html文件 (2)代码示例 3、演示结果 三、html转pdf 1、添加依赖 2、代码示例 3、演示结果 四、注意点 1、html转图片的源url 2、部署到linux上后中文乱码 五、Linux上安装字体 1、拷贝字体 2、赋予权限 3、建立字体缓存 4、查看安装的字体
flyingsaucer进行html文件转图片和pdf
|
Ubuntu Java Linux
在Spring Boot中使用iTextPDF创建动态PDF文档
iTextPDF 是一个用于创建和操作 PDF(Portable Document Format)文档的流行的 Java 库。它提供了一套全面的功能,用于处理 PDF 文件,包括创建新文档、修改现有文档以及提取信息。
1347 1
|
缓存 前端开发 Java
nacos常见问题之开启鉴权后客户端报403升级版本如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
3159 0
|
XML Java API
使用 XDocReport 将 .docx 文件转换为 .pdf 文件
本文介绍如何使用 XDocReport 库在 Java 中将 Word 文件转换为 PDF 文件
6657 0
|
Java Linux Docker
Linux服务器JRE中文字体设置,解决java.awt乱码、显示方块问题
最近因为需要在java应用中合成曲线图,使用了jfreechart库,但是发现图片中的中文全都显示成方块了。Linux机器一般都是没有中文字体的,所以在使用java.awt相关类生成图片时,输出的中文很可能显示乱码或者呈方块状。解决方案就是在服务器启动脚本里,加上安装中文字体的步骤。
2827 0
Linux服务器JRE中文字体设置,解决java.awt乱码、显示方块问题
|
Java Maven
springboot项目--freemarker使用ftl模板文件动态生成图片
springboot项目--freemarker使用ftl模板文件动态生成图片
1939 0
|
存储 API
vue3中如何动态自定义创建组件并挂载
vue3中如何动态自定义创建组件并挂载
1528 90
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
883 0
|
数据采集 移动开发 前端开发
springboot使用html模版导出pdf文档
springboot使用html模版导出pdf文档
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
566 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现

热门文章

最新文章