您的位置:首页 > 科技 > IT业 > itextpdf字体选择

itextpdf字体选择

2024/12/23 13:39:42 来源:https://blog.csdn.net/beiduofen2011/article/details/140440930  浏览:    关键词:itextpdf字体选择

itextpdf 版本7.2.5

itextpdf-html2pdf 版本4.0.5

这里讲的是通过html转pdf,在html2pdf中是通过html中font-family样式来确定字体的,那已知font-family的情况,怎么确定pdf中实际用的字体,大致分为两步:

1、通过font-family (有存在多个字体的情况),和html2pdf引入的字体包一一进行比较,会对font-family 中的每个字体计算出一个分数,按分数从大到小排序,最终取一个分数最大的字体

当前引入的字体包如下:

 

核心html为: 

<span style="font-family: KaiTi_GB2312;"><span style="color: rgb(0, 0, 0);"><span  style="background-color: rgb(255, 255, 255);">
&nbsp; &nbsp;美国是全球大豆的第二大主产区,产量占到全球大豆总产量的30%左右。新作方面,美国农业部公布的种植面积报告中,24/25年度美豆种植面积预估为8610万英亩,市场此前预估为8675.3万英亩,3月时预估为8651万英亩;收割面积预估为8526.1万英亩。当前USDA预估的24/25年度美豆单产为52蒲/英亩,处于同期高值,因此6月份USDA供需报告给出的新作美豆产量预期为1.2111亿吨,同比增加777万吨;需求方面,报告将24/25年度美豆出口量提高到4967万吨,同比提高7.4%,跟随供应端的增加而上调;国内压榨量增加到6600万吨的历史最高值,较上一年度增加了368万吨。供需同增的情况下,24/25年度美豆期末库存落至1238万吨,上一年度为953万吨,同比增加285万吨(+29.9%);库消比落在10.43%,与往年相比,该期末库存处于偏高水平,若数据兑现整体美豆供需格局较为宽松。另一方面,数据显示,24/25年度美豆种植成本为1182美分/蒲式耳,由于成本限制,若后续未能出现天气市升水,CBOT大豆期价下方的空间仍有限,短期看盘面能否在1050美分/蒲左右见底。</span>
</span>

如上述font-family: KaiTi_GB2312; 则会添加一个内置字体,一起去比较

则需要比较的字体fontFamily为:

比较后的字体包排序为:

 

&nbsp; &nbsp;美国是全球大豆的第二大主产区,产量占到全球大豆总产量的30%左右。新作方面,美国农业部公布的种植面积报告中,24/25年度美豆种植面积预估为8610万英亩,市场此前预估为8675.3万英亩,3月时预估为8651万英亩;收割面积预估为8526.1万英亩。当前USDA预估的24/25年度美豆单产为52蒲/英亩,处于同期高值,因此6月份USDA供需报告给出的新作美豆产量预期为1.2111亿吨,同比增加777万吨;需求方面,报告将24/25年度美豆出口量提高到4967万吨,同比提高7.4%,跟随供应端的增加而上调;国内压榨量增加到6600万吨的历史最高值,较上一年度增加了368万吨。供需同增的情况下,24/25年度美豆期末库存落至1238万吨,上一年度为953万吨,同比增加285万吨(+29.9%);库消比落在10.43%,与往年相比,该期末库存处于偏高水平,若数据兑现整体美豆供需格局较为宽松。另一方面,数据显示,24/25年度美豆种植成本为1182美分/蒲式耳,由于成本限制,若后续未能出现天气市升水,CBOT大豆期价下方的空间仍有限,短期看盘面能否在1050美分/蒲左右见底。--------------------展示的字体为KaiTi_GB2312 

其是跟引入的字体包比较逻辑为:

                if (!"".equals(fontFamily)&& (null == fontInfo.getAlias()&& null != fontDescriptor.getFamilyNameLowerCase()&& fontDescriptor.getFamilyNameLowerCase().equals(fontFamily) || fontDescriptor.getFamilyNameLowerCase().startsWith(fontFamily.trim())|| (null != fontInfo.getAlias() && fontInfo.getAlias().toLowerCase().equals(fontFamily))) ) {score += FONT_FAMILY_EQUALS_AWARD;} else {if (!isLastFontFamilyToBeProcessed) {return score;}}

一般只需要以下成立,则选择就选择到了对应的字体

fontDescriptor.getFamilyNameLowerCase().equals(fontFamily)

 如fontFamily 为kaiti_gb2312就跟字体包中的familyNameLowerCase相等,则对文本就采用改字体显示

假如fontFamily中的字体和引用的字体均匹配不上,如下:

<div data-v-576fc182="" class="page-preview-wrapper"style="padding: 10px; --43e54376: url(https://iirp.htfutures.com:1013/htf-iirp/top.png) no-repeat; width: 794px; height: unset; background-size: auto; background-color: rgba(0, 0, 0, 0); background-image: none; background-repeat: repeat; display: block; position: relative; top: 0px; left: 0px; transform: none; margin: 0px; border: 0px none rgba(0, 0, 0, 0.85); border-radius: 0px; letter-spacing: normal; text-align: start; opacity: 1; z-index: auto; font-size: 10.4417px; font-family: &quot;PingFang SC&quot;, &quot;Mircrosoft YaHe&quot;, Arial, Helvetica; font-variant: tabular-nums; line-height: 10.4417px; min-height: 0px; color: rgba(0, 0, 0, 0.85); vertical-align: baseline; overflow: visible; flex: 0 1 auto; justify-content: normal; align-items: normal; scroll-behavior: auto; font-feature-settings: &quot;tnum&quot;; box-shadow: none; box-sizing: border-box; border-collapse: separate; border-spacing: 0px;"><span style=\"font-size: 16px;\">&nbsp; &nbsp;没有对应的字体包显示</spn>
</div>

fontFamily为

则比较后的字体包为:

&nbsp; &nbsp;没有对应的字体包显示 --------------------展示的字体为SimSun(宋体)

2、当通过font-family确定了一个文本的字体之后,但是文本中有些字符不兼容这个字体,则需要对文本中的字符判断是否兼容这个字体,如果兼容则取这个字体,如果不兼容,会从引入的字体包选择其他字体

&nbsp; &nbsp;美国是全球大豆的第二大主产区,产量占到全球大豆总产量的30%左右。新作方面,美国农业部公布的种植面积报告中,24/25年度美豆种植面积预估为8610万英亩,市场此前预估为8675.3万英亩,3月时预估为8651万英亩;收割面积预估为8526.1万英亩。当前USDA预估的24/25年度美豆单产为52蒲/英亩,处于同期高值,因此6月份USDA供需报告给出的新作美豆产量预期为1.2111亿吨,同比增加777万吨;需求方面,报告将24/25年度美豆出口量提高到4967万吨,同比提高7.4%,跟随供应端的增加而上调;国内压榨量增加到6600万吨的历史最高值,较上一年度增加了368万吨。供需同增的情况下,24/25年度美豆期末库存落至1238万吨,上一年度为953万吨,同比增加285万吨(+29.9%);库消比落在10.43%,与往年相比,该期末库存处于偏高水平,若数据兑现整体美豆供需格局较为宽松。另一方面,数据显示,24/25年度美豆种植成本为1182美分/蒲式耳,由于成本限制,若后续未能出现天气市升水,CBOT大豆期价下方的空间仍有限,短期看盘面能否在1050美分/蒲左右见底。-------------展示的字体为KaiTi_GB2312 

如上生成的pdf为:

 其中部分文字展示为宋体,这是为什么呢?

其中对一段文字选择字体还有一个策略逻辑,如下:

            for (FontInfo f : selector.getFonts()) {int codePoint = isSurrogatePair(text, nextUnignorable)? TextUtil.convertToUtf32(text, nextUnignorable): (int) text.charAt(nextUnignorable);if (f.getFontUnicodeRange().contains(codePoint)) {PdfFont currentFont = getPdfFont(f);Glyph glyph = currentFont.getGlyph(codePoint);if (null != glyph && 0 != glyph.getCode()) {font = currentFont;break;}}}

其会对这段文字中的每个字符去判断是否兼容字体包(经过第一步排序后的字体包一一匹配)

 

 可见&nbsp;的unicode字符集编码为160,不在KaiTi_GB2312之内

KaiTi_GB2312包含的字符只有7541个,则 &nbsp; 不会用 KaiTi_GB2312字体展示,接下来看SimSun(宋体)是否匹配

 

 

 在宋体中找到了对应的code,则 &nbsp;是用SimSun(宋体)展示

那么以下文字是兼容KaiTi_GB2312字体,为什还是用宋体呢?美国是全球大豆的第二大主产区,产量占到全球大豆总产量的30%左右。新作方面,美国农业部公布的种植面积报告中,24/25年度美豆种植面积预估为8610万英亩,市场此前预估为8675.3万英亩,3月时预估为8651万英亩;收割面积预估为8526.1万英亩。当前

        if (font != null) {Character.UnicodeScript unicodeScript = nextSignificantUnicodeScript(nextUnignorable);int to = nextUnignorable;for (int i = nextUnignorable; i < text.length(); i++) {int codePoint = isSurrogatePair(text, i) ? TextUtil.convertToUtf32(text, i) : (int) text.charAt(i);Character.UnicodeScript currScript = Character.UnicodeScript.of(codePoint);if (isSignificantUnicodeScript(currScript) && currScript != unicodeScript) {System.out.println("----i------"+i+"-----charAt---"+text.charAt(i)); ;break;}if (codePoint > 0xFFFF) {i++;}to = i;}int numOfAppendedGlyphs = font.appendGlyphs(text, index, to, glyphs);anyGlyphsAppended = numOfAppendedGlyphs > 0;assert anyGlyphsAppended;index += numOfAppendedGlyphs;}

这段代码会把文本来进行切割

&nbsp; &nbsp;美国是全球大豆的第二大主产区,产量占到全球大豆总产量的30%左右。新作方面,美国农业部公布的种植面积报告中,24/25年度美豆种植面积预估为8610万英亩,市场此前预估为8675.3万英亩,3月时预估为8651万英亩;收割面积预估为8526.1万英亩。当前USDA预估的24/25年度美豆单产为52蒲/英亩,处于同期高值,因此6月份USDA供需报告给出的新作美豆产量预期为1.2111亿吨,同比增加777万吨;需求方面,报告将24/25年度美豆出口量提高到4967万吨,同比提高7.4%,跟随供应端的增加而上调;国内压榨量增加到6600万吨的历史最高值,较上一年度增加了368万吨。供需同增的情况下,24/25年度美豆期末库存落至1238万吨,上一年度为953万吨,同比增加285万吨(+29.9%);库消比落在10.43%,与往年相比,该期末库存处于偏高水平,若数据兑现整体美豆供需格局较为宽松。另一方面,数据显示,24/25年度美豆种植成本为1182美分/蒲式耳,由于成本限制,若后续未能出现天气市升水,CBOT大豆期价下方的空间仍有限,短期看盘面能否在1050美分/蒲左右见底。

切割成,切割的逻辑就是判断每个字符对应的Character.UnicodeScript是否变更了,变更了就切割

 &nbsp; &nbsp;美国是全球大豆的第二大主产区,产量占到全球大豆总产量的30%左右。新作方面,美国农业部公布的种植面积报告中,24/25年度美豆种植面积预估为8610万英亩,市场此前预估为8675.3万英亩,3月时预估为8651万英亩;收割面积预估为8526.1万英亩。当前 --------------------展示的字体为SimSun(宋体) Character.UnicodeScript == 'HAN'

USDA--------------------展示的字体为KaiTi_GB2312   Character.UnicodeScript == 'LATIN'

预估的24/25年度美豆单产为52蒲/英亩,处于同期高值,因此6月份-------------展示的字体为KaiTi_GB2312   Character.UnicodeScript == 'HAN'

USDA-------------展示的字体为KaiTi_GB2312   Character.UnicodeScript == 'LATIN'

供需报告给出的新作美豆产量预期为1.2111亿吨,同比增加777万吨;需求方面,报告将24/25年度美豆出口量提高到4967万吨,同比提高7.4%,跟随供应端的增加而上调;国内压榨量增加到6600万吨的历史最高值,较上一年度增加了368万吨。供需同增的情况下,24/25年度美豆期末库存落至1238万吨,上一年度为953万吨,同比增加285万吨(+29.9%);库消比落在10.43%,与往年相比,该期末库存处于偏高水平,若数据兑现整体美豆供需格局较为宽松。另一方面,数据显示,24/25年度美豆种植成本为1182美分/蒲式耳,由于成本限制,若后续未能出现天气市升水,--------------------展示的字体为KaiTi_GB2312 Character.UnicodeScript == 'HAN'

CBOT大豆期价下方的空间仍有限,短期看盘面能否在1050美分/蒲左右见底。--------------------展示的字体为KaiTi_GB2312   Character.UnicodeScript == 'LATIN'

 &nbsp; &nbsp;美国是全球大豆的第二大主产区,产量占到全球大豆总产量的30%左右。新作方面,美国农业部公布的种植面积报告中,24/25年度美豆种植面积预估为8610万英亩,市场此前预估为8675.3万英亩,3月时预估为8651万英亩;收割面积预估为8526.1万英亩。当前为什么不会被切割成? 因为初始的Character.UnicodeScript == 'HAN',当匹配'美'字符时,则Character.UnicodeScript == 'HAN'没有变更,则不会切割,则"美国是全球大豆的第二大主产区,产量占到全球大豆总产量的30%左右。新作方面,美国农业部公布的种植面积报告中,24/25年度美豆种植面积预估为8610万英亩,市场此前预估为8675.3万英亩,3月时预估为8651万英亩;收割面积预估为8526.1万英亩。" 会和&nbsp; &nbsp;字体一样

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com