日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

itext7学习笔记杂谈系列2——在itext7中添加中文(其他字体)和字体相关事

發布時間:2024/3/13 编程问答 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 itext7学习笔记杂谈系列2——在itext7中添加中文(其他字体)和字体相关事 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:CuteXiaoKe
微信公眾號:CuteXiaoKe

????在本章,我們會討論如何在itext7中顯示中文,或者其他CJK(Chinese/Japan/Koera)等非ASCII碼字符遇到的問題,解讀font-asian.jar這個包的作用.

1. 字體編碼

????如果我們想真正了解字體如何在計算機存儲的話,字體文件是些啥的話,還有編碼問題,可以參考中文編碼 TTF字庫之間的關系
????順帶一提,查看本機的默認代碼頁(也就是ANSI),在cmd輸入chcp即可查看代碼頁數字

2. PDF中的CJK字體

????我們可以總結出來,現在市面上流行的字體有三種:

  • Postscript/Type1 是1985年由Adobe公司提出的一套矢量字體標準,有版權,收費,擴充CJK字體的時候,使用 CID-keyed font 技術,在itext7使用它的話比較麻煩,沒錯,就它事多
  • Truetype TrueType是1991年由Apple公司與Microsoft公司聯合提出另一套矢量字標準
  • OpenType 1995年,Adobe公司和Microsoft公司開始聯手開發一種兼容 Type1和TrueType,并且真正支持Unicode的字體,后來在發布的時候,正式命名為OpenType。OpenType可以嵌入Type1 和TrueType,這樣就兼有了二者的特點,無論是在屏幕上察看還是打印,質量都非常優秀。

????如果我們在PDF中想要嵌入CJK字體的話,我們使用的itext7或者其他非Adobe軟件是不能把CJK嵌入到PDF的,因為許可證保護,詳情我們可以看看font-asian-7.x.x.jar中cmap_info.txt的信息:

????在這里,我主要翻譯總結一下cmap_info.txt里面的內容(因為里面的一些網址都已經過時了,所以我總結自己網上找的一些資料):

  • CJK或者CE字體版權歸Adobe所有,只能在Adobe Reader等軟件中使用
  • iText7不能嵌入CJK或者CE字體,因為會侵犯Adobe版權,例如嵌入CJK字體,可以用其余的PDF查看器查看,這會影響它的利益
  • font-asian.jar里面是有兩種文件,一種是cmap文件(編碼文件),另一種是.properties文件(與字體程序有關)
  • 在Type 1字體中用來描述字體度量(font metrics)是存儲在Adobe font metrics (AFM)和Adobe composite font metrics (ACFM) files中的,這些文件是被字體程序所使用的,在itext中把這些信息放在.properties文件中,以key-value這樣的形式存儲,這樣我們就不需要實際字體程序,只需要把字體信息放在itext創建的文件中。

3. itext7嵌入字體

3.1 創建Type 1字體

????我們展開上圖的cmap,我們會發現一些字體程序(.properties文件名代表的就是字體程序名),當然我們還需要確定字體程序所支持的編碼,以下是常用的adobe公司的字體程序和對應編碼:

字體程序編碼
STSong-LightUniGB-UCS2-H
MHei-MediumUniCNS-UCS2-H
MSung-LightUniCNS-UCS2-H
HeiseiKakuGo-W5UniJIS-UCS2-H
HeiseiMin-W3UniJIS-UCS2-H
HYGoThic-MediumUniKS-UCS2-H
HYSMyeongJo-MediumUniKS-UCS2-H

其余的字體程序對應的編碼暫時沒查閱到,adobe官網信息不一樣了,如果想用特定的字體的話可以到時候查閱

????然后就是創建具體的字體,核心代碼如下,假設我們使用STSong-Light創建字體:

...... PdfFont f2 = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true); document.add(new Paragraph("hellos你好").setFont(f2)); //表格、list其他方式也是這種方式 ......

如果您曾經使用過itext5,你會發現與itext5的創建字體方式不一樣,沒關系,我會另寫一篇文章來寫itex7與itext5在創建字體的時候的不同之處
不同的itext7版本創建PdfFont的API不一樣,在本例iText版本為7.0.3,7.1.17-SNAPSHOT的版本請參考iText7高級教程之構建基礎塊——1.引入字體第5章

????創建完的pdf,我們按crtl+d看字體屬性,如圖:

????我們可以發現,實際的字體是AdobeSongStd-Light,這是因為我本機安裝的時候是選擇的簡體中文,會自帶宋體和黑體的字體程序,在“C:\Program Files (x86)\Adobe\Acrobat Reader DC\Resource\CIDFont”(安裝目錄)中可以看到我們使用的是CID字體,有兩個字體程序:

????假如,我們使用在這個文件夾下沒有的字體程序呢?例如HeiseiKakuGo-W5等,我們通過itext7是可以文件,但是打開pdf的時候會彈出這樣一個對話框,讓我們去下載字體,如圖:

3.2 創建其他字體

????嵌入其他字體的時候比較簡單了,可以使用自己定義的字體文件,支持ttf文件,也可以使用windows自帶的字體文件,如下代碼:

PdfFont f2 = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H",true); PdfFont f3 = PdfFontFactory.createFont("C:/Windows/Fonts/simhei.ttf", PdfEncodings.IDENTITY_H,true); //Add paragraph to the document document.add(new Paragraph("hellos你好").setFont(f2)); document.add(new Paragraph("hellos你好").setFont(f3));

????顯示效果如下:

PdfEncodings.IDENTITY_H就是Unicode編碼,一般ttf文件都是用的這種編碼,日后我會詳談

4. 代碼樣例打包

????我在第一章和第一章實踐的基礎上,添加了中文輸出,請放心下載

總結

以上是生活随笔為你收集整理的itext7学习笔记杂谈系列2——在itext7中添加中文(其他字体)和字体相关事的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。