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;
    }
}
相关文章
|
Java API Apache
使用 Apache PDFBox 操作PDF文件
Apache PDFBox库是一个开源的Java工具,专门用于处理PDF文档。它允许用户创建全新的PDF文件,编辑现有的PDF文档,以及从PDF文件中提取内容。此外,Apache PDFBox还提供了一些命令行实用工具。
1799 6
|
Ubuntu Java Linux
在Spring Boot中使用iTextPDF创建动态PDF文档
iTextPDF 是一个用于创建和操作 PDF(Portable Document Format)文档的流行的 Java 库。它提供了一套全面的功能,用于处理 PDF 文件,包括创建新文档、修改现有文档以及提取信息。
906 1
POI生成EXCEL,公式不自动执行的有关问题
POI生成EXCEL,公式不自动执行的问题 场景:POI读取Excel模板。 当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行, 而事先手工写入Excel模板文件的公式则不自动被调用,必须手动双击该Cell才能生效。
1828 0
|
12月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
2526 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
12月前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
3580 1
|
12月前
|
IDE 开发者 iOS开发
京东开源的 JD-Hotkey:高效热键管理的技术巅峰
【10月更文挑战第5天】在快节奏的工作与学习中,提高操作效率是每位技术爱好者不懈追求的目标。今天,我们将深入探讨京东开源的 JD-Hotkey 项目,它不仅是一个强大的热键管理工具,更是我们在日常工作中提升生产力的秘密武器。通过本文,你将了解到 JD-Hotkey 的核心功能、技术亮点以及在实际应用中的卓越表现,一同感受其带来的高效与便捷。
651 4
|
自然语言处理 Java 关系型数据库
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
384 1
|
Java Apache
Java将word、excel文件转成pdf文件
【5月更文挑战第26天】Java将word、excel文件转成pdf文件
2621 1
关于导出PDF文件,自己设置导出字体为中文不显示问题
关于导出PDF文件,自己设置导出字体为中文不显示问题
1174 3
|
前端开发 Java Maven
使用itext7在PDF中实现多种文字水印效果
现在网络上能搜到的itext pdf水印效果,绝大部分都是itext5的,很少有itext7的,本文就将介绍一下新版本的效果
1211 1
使用itext7在PDF中实现多种文字水印效果