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