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;字体一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872120.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

识别 TON 生态系统中前10种加密资产,以bitget 钱包为例

元描述&#xff1a;想要找到下一个 100 倍加密货币投资&#xff1f;请密切关注这篇文章&#xff1b;它揭示了所有可能很快变得非常有价值的 TON 网络宝石。 由 Telegram 提供支持的 TON&#xff08;开放网络&#xff09;生态系统正在蓬勃发展&#xff01;这是一个充满激动人心的…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】 本地事务事务的基本性质事务的隔离级别&#xff08;下面四个越往下&#xff0c;隔离级 别越高&#xff0c;并发能力越差&#xff09;事务的传播行为&#xff08;是否…

【Hive SQL 每日一题】找出各个商品销售额的中位数

文章目录 测试数据需求说明需求实现方法1 —— 升序计算法方法2 —— 正反排序法 补充 测试数据 -- 创建 orders 表 DROP TABLE IF EXISTS orders; CREATE TABLE orders (order_id INT,product_id INT,order_date STRING,amount DOUBLE );-- 插入 orders 数据 INSERT INTO ord…

软件工程课设——成绩管理系统

软件工程课设——成绩管理系统 该文档是软件工程课程设计&#xff0c;成绩管理子系统的开发模块仓库。 功能分析 从面向的用户分&#xff0c;成绩管理子系统主要面向三类用户&#xff0c;即至少需要满足这三类用户的需求&#xff1a; 学生&#xff1a;学生是成绩管理系统的…

深入理解 Git Reset 的三种模式及其使用场景

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;Android ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 1. --soft 模式 2. --mixed 模式&#xff08;默认&#xff09; 3. --hard 模式 总结 结语 我的其他博客 前言 在日常的开发…

机器学习-1:人工智能、机器学习和深度学习的关系

人工智能&#xff08;AI&#xff09; 简单理解&#xff0c;任何一种事物只要具备了一定的智能就可以把它归类为人工智能。 官方定义&#xff1a;"AI is the field that sdudies the synthesis and analysis of computational agents that act intelligently." 其中&a…

安卓学习中遇到的问题【bug】

安卓学习中遇到的问题 1Gradle下载慢怎么办&#xff1f; Gradle下载慢怎么办&#xff1f; distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-7.5-bin.zip 2 Could not resolve all files for configuration ‘:classpath‘. &#xff1e; Could not resolv…

uniapp-vue3-vite 搭建小程序、H5 项目模板

uniapp-vue3-vite 搭建小程序、H5 项目模板 特色准备拉取默认UniApp模板安装依赖启动项目测试结果 配置自动化导入安装依赖在vite.config.js中配置 引入 prerttier eslint stylelint.editorconfig.prettierrc.cjs.eslintrc.cjs.stylelintrc.cjs 引入 husky lint-staged com…

处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题

文章目录 1、问题描述2、详情动图3、解决思路4、解决方案5、效果展示 1、问题描述 在 electron 中使用 el-image 时&#xff0c;开启了懒加载后&#xff0c;发现只有当窗口滚动后&#xff0c;图片才会显示&#xff0c;即便图片已经处于窗口的可视区域。当拖动窗口使其尺寸变大…

基于JAVA+SpringBoot+Vue+uniapp+协同过滤算法+爬虫+AI的减肥小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 小程序用户登录&#…

前端开发体系+html文件详解

目录 html骨架 body主体内基本元素 基本元素 超文本&#xff08;超链接跳转&#xff09; 锚点 图片标签 列表标签 表格标签 框架标签&#xff08;窗口标签&#xff09; 音频标签 视频标签 VScode编译器 输入框 字体样式 实例展示&#xff1a; 首先简要介绍前端的整…

在VS2017下FFmpeg+SDL编写最简单的视频播放器

1.下载ShiftMediaProject/FFmpeg 2.下载SDL2 3.新建VC控制台应用 3.配置include和lib 4.把FFmpeg和SDL的dll 复制到工程Debug目录下&#xff0c;并设置调试命令 5.复制一下mp4视频到工程Debug目录下&#xff08;复制一份到*.vcxproj同一目录&#xff0c;用于调试&#xff09; 6…

python中的re模块--正则表达式

正则表达式&#xff0c;又称规则表达式。&#xff08;英语&#xff1a;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;计算机科 学的一个概念。正则表达式通常被用来检索、替换那些符合某个模 式(规则)的文本 re模块作用 通过使用…

JVM 内存介绍

本文主要介绍&#xff1a; JVM 内存分哪几个区&#xff0c;每个区的作用是什么 备注: 橙色:堆 和 方法区 &#xff0c;属于jvm公有部分,可以进行调优 灰色:java栈,本地方法栈和计数器 属于jvm的私有部分,不可进行调优 一个对象从创建到被回收的过程是怎样的? Personpnew Perso…

【HarmonyOS】HarmonyOS NEXT学习日记:一、创建和运行一个页面

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;一 DevEco Studio下载与安装 直接到官网的下载地址下载即可 正常下载、解压、安装完成后 正常来说不会有项目&#xff0c;并且是英文界面。 需要汉化的话可以按照下面的步骤设置插件 选择customize里的 all setting 进入…

macOS Sequoia 15(Macos15系统)v15.0 Beta 3发布 macOS Sequoia 15 功能预览

macOS Sequoia 15 功能预览 犀利一如 Mac macOS Sequoia 15(Macos15系统)v15.0 Beta 3测试版本下载安装 连续互通 你的 Mac 上&#xff0c;iPhone 用起来。 有了 iPhone 镜像功能&#xff0c;在 Mac 上就能看到 iPhone 屏幕画面&#xff0c;还能直接进行操控&#xff0c;不拿…

uniapp 实现上传文件的功能

上传单个文件 <script setup>const handleUploadClick () > {console.log("上传文件")uni.chooseImage({success: (chooseImageRes) > {const tempFilePaths chooseImageRes.tempFilePaths;console.log("用户选择的图片&#xff1a;", temp…

誉天教育与武汉晴川学院携手开展鸿蒙实训营,共筑鸿蒙生态新篇章!

在数字经济蓬勃发展的今天&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐步构建起一个开放、协同、共赢的生态体系。为了进一步推动鸿蒙生态的繁荣发展&#xff0c;培养更多具备鸿蒙原生应用开发能力的专业人才&#xff0c;誉天教育与武汉晴川学院强强联合&a…

十九、【文本编辑器(五)】排版功能

目录 一、搭建框架 二、实现段落对齐 三、实现文本排序 一、搭建框架 (1) 在imgprocessor.h文件中添加private变量&#xff1a; QLabel *listLabel; //排序设置项QComboBox *listComboBox;QActionGroup *actGrp;QAction *leftAction;QAction *…

C#知识|SqlParameterCollection 只接受非空的 SqlParameter 类型对象,不接受 SqlParameter[] 对象

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 今天在练习C#时遇到报错&#xff1a; SqlParameterCollection 只接受非空的 SqlParameter 类型对象&#xff0c;不接受 SqlParameter[] 对象。 01 为什么使用SqlParameter 开发中之所以采用SqlParameter[]param是因为…