在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

相關文章
相關標籤/搜索