在linux环境下使用itext生成pdf

转载请注明出处 https://www.cnblogs.com/majianming/p/9537173.html 项目中须要对订单生成pdf文件,在不断的尝试以后,终于生成了比较满意的pdf文档。 简单介绍一下背景:项目是一个erp项目,docker容器化CentOS 7运行环境,应用打包方式jar,使用itext生成pdfhtml

咱们从后面的三个背景来分析linux

  1. 首先是使用itext库,须要明确的是itext是默认不支持中文显示的,这个问题很容易找到的方法是添加itext-asin库,一个解决中日韩文字问题的拓展,而在这个拓展天然也是须要另外添加中文字体支持的,因此咱们为了支持中文,在itext的基础上须要itext-asin库和字体文件。
  2. 第二个背景,也就是jar打包方式,许多博客在介绍这一段时,会把字体文件添加到项目文件下,这样本地开发是没有问题的,可是一旦部署到了linux(CentOS)环境下,就会有中文字没法显示的问题(这时候若是你将应用的jar包在windows环境下跑,通常是能够正常显示的,为何?等会看看第三个背景你就会明白了),这是由于在itext中,并非用文件流(fileinputstream)的形式去读取字体,天然没法读取到jar包中的文件,那么咱们换一个思路,把字体文件移动到项目外的一个路径下,而后指定itext去读取这个路径。
  3. 第三个背景CentOS,通常的服务器环境天然不会带中文字体的,那么咱们须要将添加字体到哪里?随便加一个地方?且慢,咱们先看一个地方 在com.itextpdf.text.FontFactoryImp#registerDirectories()下,咱们发现了这样一段代码
String windir = System.getenv("windir");
String fileseparator = System.getProperty("file.separator");
if (windir != null && fileSeparator != null) {
fontResolver.addFontDirectory(windir + fileseparator + "fonts", BaseFont.NOT_EMBEDDED);
}
fontResolver.addFontDirectory("/usr/share/X11/fonts", BaseFont.EMBEDDED);
fontResolver.addFontDirectory("/usr/X/lib/X11/fonts", BaseFont.EMBEDDED);
fontResolver.addFontDirectory("/usr/openwin/lib/X11/fonts", BaseFont.EMBEDDED);
fontResolver.addFontDirectory("/usr/share/fonts", BaseFont.EMBEDDED);
fontResolver.addFontDirectory("/usr/X11R6/lib/X11/fonts", BaseFont.EMBEDDED);
fontResolver.addFontDirectory("/Library/Fonts", BaseFont.EMBEDDED);
fontResolver.addFontDirectory("/System/Library/Fonts", BaseFont.EMBEDDED);

也就是说,itext已经把背景分析2中的指定字体路径的事情作了,只是咱们尚未字体在对应的路径上 而后咱们再看看其中的这个代码docker

String windir = System.getenv("windir");
String fileseparator = System.getProperty("file.separator");
if (windir != null && fileSeparator != null) {
fontResolver.addFontDirectory(windir + fileseparator + "fonts", BaseFont.NOT_EMBEDDED);
}

windir? 比较熟悉windows下变量的人能够知道,这个是获取windows系统根路径的一个环境变量,我是win 10的电脑,获取的就是C:\Windows。 咱们打开C:\Windows\fonts路径,会发现都是相关字体文件,也就是解释了为何在linux中文没法显示的jar包在Windows下能够正常显示了——并非在windows下能够读取到jar包的字体文件,而是在windows下能够读取到系统中的字体文件。 由于这个缘由,天然能够显示中文字体;因此,若是要显示任何自定义的字体,在windows下,咱们能够将能够添加到C:\Windows\fonts下;在liunx环境下,添加到对应的路径下便可。咱们理论上可使用任何一个系统中已经定义的字体。在这里,咱们选择了/usr/share/fonts这个路径,固然这个路径在CentOS中是不存在的,因此要手动建立,而后将须要的中文字体复制进去windows

由于公司的环境是k8s的docker容器,为了平时的docker容器部署方便,咱们依然把字体文件放在工程下(与dockerfile同一级),而后使用docker的命令将字体复制到指定路径下服务器

COPY ./fonts/ /usr/share/fonts/

参考

docker cp命令 | Docker Documentation字体

转载请注明出处 https://www.cnblogs.com/majianming/p/9537173.htmlspa

相关文章
相关标签/搜索