项目地址:

Pdfium.Net:https://github.com/1000374/Pdfium.Net

PdfiumViewer:https://github.com/1000374/PdfiumViewer

Pdfium.Net加载字体:

1.加载ttf字体文件

  using (var doc = PdfDocument.CreateNew())
{
var fontPath = @"c:\Windows\fonts\simhei.ttf";
byte[] fontData = File.ReadAllBytes(fontPath);
var font = doc.TextLoadFont(fontData, (uint)fontData.Length, FpdfFontTypes.TrueType, true);
}

上述方法是通过字符集获取字体对象的方式。

对于一个对象流,可直接通过 LoadFont函数加载字符集文件(注意:只能调用一次)。

由于Pdfium不支持加载字符子集,这样会把整个字体库加载到pdf内,生成的pdf会变大,考虑到此种场景,考虑对已知内容生成pdf,可先拆分字符子集,然后加载到pdf流中,这样能保证中文正常展示,切pdf大小固定,不足的是对于添加不在字符集内的字体将展示乱码。对写入内容不能确定的只能全部加载字符集。

 using (var doc = PdfDocument.CreateNew())
{
var fontPath = @"c:\Windows\fonts\simhei.ttf"; var cSharpString = "!you ok 这是第一句。";
var cSharpString2 = " 这是第二行。a you ok 你好 abcdefghijklmnopqrstuvwxyz1234567890-*/+~`@#$%^&*(){}[];:'|?,,。.!!";
doc.LoadFont(fontPath, true, cSharpString + cSharpString2);
var page = doc.Pages.Add(612, 792);
page.AddString(cSharpString, 10, 50, 12, Color.Black); page.AddString(cSharpString2, 10, 80, 12, Color.Black);
doc.Save("./Pdfium.NetTests/AddString3.pdf");
}

2.加载pdf标准字体 

pdf内置标准字体,标准字体查看 StandardPDFFonts类,pdf标准字体只能加载英文、阿拉伯数字,中文乱码

 using (var doc = PdfDocument.CreateNew())
{
var font = doc.TextLoadStandardFont(StandardPDFFonts.Arial);
}

3.从pdf内获取字体

对于某些pdf已经内置了部分字体,当重新加载新字体时会造成生成的pdf变大,针对这种场景,可尝试从pdf内获取字体使用。

 var pathPdf = "./Pdfium.NetTests/resources/fontText.pdf";
using (var doc = PdfDocument.Load(new MemoryStream(File.ReadAllBytes(pathPdf))))
{
var font = doc.Pages[0].GetTextObjFont("你", out float size);
}

Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--加载字体的更多相关文章

  1. 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式

    表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...

  2. 【原】从一个bug浅谈YUI3组件的资源加载

    篇前声明:为了不涉及业务细节,篇内信息统一以某游戏,某功能代替 前不久,某游戏准备内测客户端,开发人员测试过程中发现某功能突然不灵了,之前的测试一切ok,没有发现任何异常,第一反应是,游戏内浏览器都是 ...

  3. 用node.js搭建一个静态资源站 html,js,css正确加载 跳转也完美实现!

    昨天买了一个服务器想着用来测试一些自己的项目,由于是第一次建站,在tomcat,linux,node.js间想了好久.最终因为node搭建比较方便没那么麻烦就决定用node.js来搭建网站项目. 搭建 ...

  4. 前框 (一个)zTree 从数据库树形菜单动态加载

    这些天做动态菜单使用此插件.现在有一个非常广泛的开源框架,最新QUI框架是菜单部分使用这个插件开发,因此,它是非常值获取深入的研究和探讨,通过使用非常丰富的感觉功能,己开发和编写,官网上有非常详尽的A ...

  5. 打包一个Docker镜像,让你的好友加载开启一个容器,并且每隔一秒输出hello,world到指定的文件中

    一.两个脚本代码 Dockerfile FROM bash COPY . /usr/herui/ WORKDIR /usr/herui/ CMD [ "sh", "hel ...

  6. vue路由(一个包含重定向、嵌套路由、懒加载的main.js如下)and 路由跳转传参的query和params的异同

    import Vue from 'vue'import VueRouter from 'vue-router'import App from './App'Vue.use(VueRouter)cons ...

  7. 一个spring 基本知识的微博(怎么加载多个xml、多个property文件、aop配置、监视器)

    http://blog.sina.com.cn/s/blog_61c5866d0100ev44.html

  8. 实现一个类 RequireJS 的模块加载器 (二)

    2017 新年好 ! 新年第一天对我来说真是悲伤 ,早上兴冲冲地爬起来背着书包跑去实验室,结果今天大家都休息 .回宿舍的时候发现书包湿了,原来盒子装的牛奶盖子松了,泼了一书包,电脑风扇口和USB口都进 ...

  9. 【模块化编程】理解requireJS-实现一个简单的模块加载器

    在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...

  10. 文件加载---理解一个project的第一步

    当我最开始写php的时候,总是担心这个问题:我在这儿new的一个class能加载到对应的类文件吗?毕竟一运行就报Fatal Error,什么**文件没找到,类无法实例化等等是一种很“低级”的错误,怕别 ...

随机推荐

  1. Mysql--表注释,字段注释

    information_schema数据库是MySQL数据库自带的数据库,里面存放的MySQL数据库所有的信息,包括数据表.数据注释.数据表的索引.数据库的权限等等. 1.添加表.字段注释 creat ...

  2. linux tar解压命令总结

    把常用的tar解压命令总结下,当作备忘: -c:建立压缩档案 -x:解压 -t:查看内容 -r:向压缩归档文件末尾追加文件 -u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可 ...

  3. ElasticSearch 分组聚合统计

    统计总数: GET mytest-statistics/_search { "size": 0, "query": { "bool": { ...

  4. 生成学习全景:从基础理论到GANs技术实战

    本文全面探讨了生成学习的理论与实践,包括对生成学习与判别学习的比较.详细解析GANs.VAEs及自回归模型的工作原理与结构,并通过实战案例展示了GAN模型在PyTorch中的实现. 关注TechLea ...

  5. C#9.0:Top-Level Programs

    我们称之为顶级层序 用 C# 编写一个简单的程序需要大量的样板代码,引用,类.方法.结构体等: 1 class Program 2 { 3 static void Main(string[] args ...

  6. 国内使用 Mac OS 快速安装 Homebrew

    问题描述 使用新的 Mac 电脑开发,没有安装 Homebrew 确实不行,但是国内访问 github,很不稳定,运行 /bin/bash -c "$(curl -fsSL https:// ...

  7. Codeforces Round #738 (Div. 2) (A~E)

    比赛链接:Here 1559A. Mocha and Math 题意: 给定一个区间,选择区间内的值执行 & 操作使得区间最大值最小化 观察样例发现:令 x = (1 << 30) ...

  8. 【内核】深入分析内核panic(三)--内核错误处理流程

    1 内核错误处理方式 当内核出现致命错误时,只要cpu还能正常运行,那么最重要的就是向用户输出详细的错误信息,以及保存问题出现时的错误现场.以上致命错误可包含以下两种类型: (1)硬件能检测到的错误, ...

  9. mongodb导入本地json文件

  10. 机器学习-决策树系列-决策树-ID3算法 -C4.5算法-26

    目录 1. 决策树 2. 举个例子 计算信息增益 3. C4.5算法 1. 决策树 决策树是属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观, 模型生成:通过大量数据生成一颗非常好的树,用这 ...