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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

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

作者:CuteXiaoKe
微信公眾號(hào):CuteXiaoKe

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

1. 字體編碼

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

2. PDF中的CJK字體

????我們可以總結(jié)出來(lái),現(xiàn)在市面上流行的字體有三種:

  • Postscript/Type1 是1985年由Adobe公司提出的一套矢量字體標(biāo)準(zhǔn),有版權(quán),收費(fèi),擴(kuò)充CJK字體的時(shí)候,使用 CID-keyed font 技術(shù),在itext7使用它的話比較麻煩,沒(méi)錯(cuò),就它事多
  • Truetype TrueType是1991年由Apple公司與Microsoft公司聯(lián)合提出另一套矢量字標(biāo)準(zhǔn)
  • OpenType 1995年,Adobe公司和Microsoft公司開(kāi)始聯(lián)手開(kāi)發(fā)一種兼容 Type1和TrueType,并且真正支持Unicode的字體,后來(lái)在發(fā)布的時(shí)候,正式命名為OpenType。OpenType可以嵌入Type1 和TrueType,這樣就兼有了二者的特點(diǎn),無(wú)論是在屏幕上察看還是打印,質(zhì)量都非常優(yōu)秀。

????如果我們?cè)赑DF中想要嵌入CJK字體的話,我們使用的itext7或者其他非Adobe軟件是不能把CJK嵌入到PDF的,因?yàn)樵S可證保護(hù),詳情我們可以看看font-asian-7.x.x.jar中cmap_info.txt的信息:

????在這里,我主要翻譯總結(jié)一下cmap_info.txt里面的內(nèi)容(因?yàn)槔锩娴囊恍┚W(wǎng)址都已經(jīng)過(guò)時(shí)了,所以我總結(jié)自己網(wǎng)上找的一些資料):

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

3. itext7嵌入字體

3.1 創(chuàng)建Type 1字體

????我們展開(kāi)上圖的cmap,我們會(huì)發(fā)現(xiàn)一些字體程序(.properties文件名代表的就是字體程序名),當(dāng)然我們還需要確定字體程序所支持的編碼,以下是常用的adobe公司的字體程序和對(duì)應(yīng)編碼:

字體程序編碼
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

其余的字體程序?qū)?yīng)的編碼暫時(shí)沒(méi)查閱到,adobe官網(wǎng)信息不一樣了,如果想用特定的字體的話可以到時(shí)候查閱

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

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

如果您曾經(jīng)使用過(guò)itext5,你會(huì)發(fā)現(xiàn)與itext5的創(chuàng)建字體方式不一樣,沒(méi)關(guān)系,我會(huì)另寫一篇文章來(lái)寫itex7與itext5在創(chuàng)建字體的時(shí)候的不同之處
不同的itext7版本創(chuàng)建PdfFont的API不一樣,在本例iText版本為7.0.3,7.1.17-SNAPSHOT的版本請(qǐng)參考iText7高級(jí)教程之構(gòu)建基礎(chǔ)塊——1.引入字體第5章

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

????我們可以發(fā)現(xiàn),實(shí)際的字體是AdobeSongStd-Light,這是因?yàn)槲冶緳C(jī)安裝的時(shí)候是選擇的簡(jiǎn)體中文,會(huì)自帶宋體和黑體的字體程序,在“C:\Program Files (x86)\Adobe\Acrobat Reader DC\Resource\CIDFont”(安裝目錄)中可以看到我們使用的是CID字體,有兩個(gè)字體程序:

????假如,我們使用在這個(gè)文件夾下沒(méi)有的字體程序呢?例如HeiseiKakuGo-W5等,我們通過(guò)itext7是可以文件,但是打開(kāi)pdf的時(shí)候會(huì)彈出這樣一個(gè)對(duì)話框,讓我們?nèi)ハ螺d字體,如圖:

3.2 創(chuàng)建其他字體

????嵌入其他字體的時(shí)候比較簡(jiǎn)單了,可以使用自己定義的字體文件,支持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文件都是用的這種編碼,日后我會(huì)詳談

4. 代碼樣例打包

????我在第一章和第一章實(shí)踐的基礎(chǔ)上,添加了中文輸出,請(qǐng)放心下載

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。