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);"> 美国是全球大豆的第二大主产区,产量占到全球大豆总产量的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为:
比较后的字体包排序为:
美国是全球大豆的第二大主产区,产量占到全球大豆总产量的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: "PingFang SC", "Mircrosoft YaHe", 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: "tnum"; box-shadow: none; box-sizing: border-box; border-collapse: separate; border-spacing: 0px;"> <span style=\"font-size: 16px;\"> 没有对应的字体包显示</spn> </div>
fontFamily为
则比较后的字体包为:
没有对应的字体包显示 --------------------展示的字体为SimSun(宋体)
2、当通过font-family确定了一个文本的字体之后,但是文本中有些字符不兼容这个字体,则需要对文本中的字符判断是否兼容这个字体,如果兼容则取这个字体,如果不兼容,会从引入的字体包选择其他字体
美国是全球大豆的第二大主产区,产量占到全球大豆总产量的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; } } }
其会对这段文字中的每个字符去判断是否兼容字体包(经过第一步排序后的字体包一一匹配)
可见 的unicode字符集编码为160,不在KaiTi_GB2312之内
KaiTi_GB2312包含的字符只有7541个,则 不会用 KaiTi_GB2312字体展示,接下来看SimSun(宋体)是否匹配
在宋体中找到了对应的code,则 是用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; }
这段代码会把文本来进行切割
美国是全球大豆的第二大主产区,产量占到全球大豆总产量的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是否变更了,变更了就切割
美国是全球大豆的第二大主产区,产量占到全球大豆总产量的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'
美国是全球大豆的第二大主产区,产量占到全球大豆总产量的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万英亩。" 会和 字体一样