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为:

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

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

java 复制代码
                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;
                    }
                }

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

java 复制代码
fontDescriptor.getFamilyNameLowerCase().equals(fontFamily)

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

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

html 复制代码
<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为:

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

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

java 复制代码
            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万英亩。当前

java 复制代码
        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;字体一样

相关推荐
monkey_meng3 分钟前
【Rust Iterator 之 fold,map,filter,for_each】
开发语言·后端·rust
Vae_Mars6 分钟前
QT-protected
开发语言·qt
木子七7 分钟前
vue3-setup中使用响应式
前端·vue
JosieBook15 分钟前
【面试题】2025年百度校招Java后端面试题
java·开发语言·网络·百度
廖子默17 分钟前
提供html2canvas+jsPDF将HTML页面以A4纸方式导出为PDF后,内容分页时存在截断的解决思路
前端·pdf·html
Moment19 分钟前
毕业半年,终于拥有了两个近 500 star 的开源项目了 🤭🤭🤭
前端·后端·开源
wjs202431 分钟前
CentOS Docker 安装
开发语言
光影少年1 小时前
react和vue图片懒加载及实现原理
前端·vue.js·react.js
AndyGoWei1 小时前
react react-router-dom history 实现原理,看这篇就够了
前端·javascript·react.js