本文来告诉大家,在 OpenXML 的 BodyProperties 的 NormalAutoFit 的 FontScale 属性缩放文本框的文本字号的方法

通过 ECMA 376 文档可以了解到 BodyProperties 属性是作用在文本框,放在 BodyProperties 的 NormalAutoFit 的 FontScale 属性,能修改文本框的文本字号缩放

更多关于 BodyProperties 属性,请看 dotnet OpenXML 文本 BodyProperties 的属性作用

通过 ECMA 376 的 21.1.2.1.3 章可以了解到使用 NormalAutoFit 的 FontScale 属性是按照百分比缩放文本框

开始之前,先使用 C# dotnet 使用 OpenXml 解析 PPT 文件 的方法读取测试的文档。此测试文件将可以在下文拿到

            var file = new FileInfo("Test.pptx");

            using var presentationDocument = PresentationDocument.Open(file.FullName, false);

获取首页的第一个形状元素,此形状元素包含一个文本,此文本内容里设置了 NormalAutoFit 的 FontScale 属性

            var slide = presentationDocument.PresentationPart!.SlideParts.First().Slide;

            var shape = slide.CommonSlideData!.ShapeTree!.GetFirstChild<Shape>()!;

此形状的 OpenXML 内容如下

 <p:sp>
<p:nvSpPr>
<p:cNvPr id="4" name="文本框 3" />
<p:cNvSpPr txBox="1" />
<p:nvPr />
</p:nvSpPr>
<p:spPr>
<a:xfrm>
<a:off x="4168346" y="914401" />
<a:ext cx="6096000" cy="3170090" />
</a:xfrm>
<a:prstGeom prst="rect">
<a:avLst />
</a:prstGeom>
<a:noFill />
</p:spPr>
<p:txBody>
<a:bodyPr wrap="square" rtlCol="0">
<a:normAutofit fontScale="60000"/>
</a:bodyPr>
<a:lstStyle />
<a:p>
<a:r>
<a:rPr lang="zh-CN" altLang="en-US" sz="10000">
</a:rPr>
<a:t>一行文本</a:t>
</a:r>
<a:endParaRPr lang="en-US" sz="10000" dirty="0" />
</a:p>
</p:txBody>
</p:sp>

a:bodyPra:normAutofit 的文本缩放设置为 60000 的值

从 ECMA 376 文档可以了解 FontScale 属性的单位是千倍百分比,可使用 Office Open XML 的测量单位 提供的 dotnetCampus.OpenXMLUnitConverter 库的 Percentage 类型作为单位

获取文本框属性,可以使用以下代码

            var shapeProperties = shape.ShapeProperties!;
var textBody = shape.TextBody!;
Debug.Assert(textBody != null);
var textBodyProperties = textBody.BodyProperties!;
Debug.Assert(textBodyProperties != null);

文本框属性里包含 NormalAutoFit 属性,可采用以下代码获取

            var normalAutoFit = textBodyProperties.GetFirstChild<NormalAutoFit>()!;
Debug.Assert(normalAutoFit != null);

如果文档里的 OpenXML 内容没有存在 NormalAutoFit 或者 FontScale 属性,那就是默认不做文本字号缩放。可以相当于默认的倍数是 1 的值,因为任何值乘以 1 都等于原值,相当于不做缩放

            Percentage fontScale = normalAutoFit.FontScale is null
? Percentage.FromDouble(1)
: new Percentage(normalAutoFit.FontScale);

此 Percentage 类型是 dotnetCampus.OpenXMLUnitConverter 库提供的

获取文本内容,在 WPF 显示代码如下

            foreach (var paragraph in textBody.Elements<DocumentFormat.OpenXml.Drawing.Paragraph>())
{
// 一个文本里面有很多段落
// 段落里面,文本有不同的样式,如一段可以有不同加粗的文本
// 相同的样式的文本放在一个 TextRun 里面。不同的样式的文本放在不同的 TextRun 里面 // 这个文本段落是没有属性的,为了方便样式,就不写代码
//if (paragraph.ParagraphProperties != null) foreach (var run in paragraph.Elements<DocumentFormat.OpenXml.Drawing.Run>())
{
var runProperties = run.RunProperties!;
var fontSize = new PoundHundredfold(runProperties.FontSize!.Value).ToPound(); // 默认字体前景色是黑色
var text = run.Text!.Text; var textBlock = new TextBlock()
{
Text = text,
FontSize = fontSize.ToPixel().Value * fontScale.DoubleValue,
FontFamily = new FontFamily("宋体"),
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
}; Root.Children.Add(textBlock);
}
}

运行以上代码效果如下,可以看到文本大小和 Office 的 PPT 相同

本文所有代码和测试文件放在githubgitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 24230fc0bb8202c567ccf9ffffb49eebc08be120

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 Pptx 文件夹

更多请看 Office 使用 OpenXML SDK 解析文档博客目录

使用 WPF 做个 PowerPoint 系列 文本 BodyProperties 的 FontScale 与文本字号缩放的更多相关文章

  1. 使用 WPF 做个 PowerPoint 系列 基于 OpenXML 解析实现 PPT 文本描边效果

    本文是使用 WPF 做个 PowerPoint 系列的博客,本文来告诉大家如何解析 PPT 里面的文本描边效果,在 WPF 应用中绘制出来,实现像素级相同 背景知识 在开始之前,期望你了解了 PPT ...

  2. WPF Step By Step 系列-Prism框架在项目中使用

    WPF Step By Step 系列-Prism框架在项目中使用 回顾 上一篇,我们介绍了关于控件模板的用法,本节我们将继续说明WPF更加实用的内容,在大型的项目中如何使用Prism框架,并给予Pr ...

  3. WPF Step By Step 系列 - 开篇 ·

    WPF Step By Step 系列 - 开篇 公司最近要去我去整理出一个完整的WPF培训的教程,我刚好将自己学习WPF的过程和经验总结整理成笔记的方式来讲述,这里就不按照书上面的东西来说了,书本上 ...

  4. .NET Core 3 WPF MVVM框架 Prism系列之命令

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism的命令的用法 一.创建DelegateCommand命令 我们在上一篇.NET Core 3 WPF MVVM框架 Prism系列之 ...

  5. 《C#微信开发系列(4)-接收 / 返回文本消息》

    4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息 ...

  6. 给Source Insight做个外挂系列之三--构建外挂软件的定制代码框架

    上一篇文章介绍了“TabSiPlus”是如何进行代码注入的,本篇将介绍如何构建一个外挂软件最重要的部分,也就是为其扩展功能的定制代码.本文前面提到过,由于windows进程管理的限制,扩展代码必须以动 ...

  7. 给Source Insight做个外挂系列之一--发现Source Insight

    一提到外挂程序,大家肯定都不陌生,QQ就有很多个版本的去广告外挂,很多游戏也有用于扩展功能或者作弊的工具,其中很多也是以外挂的形式提供的.外挂和插件的区别在于插件通常依赖于程序的支持,如果程序不支持插 ...

  8. 用WPF做了几个小游戏

    最近看书看累了,参考别人的代码(其实差不多就是把代码重新打了一遍o(╯□╰)o),用wpf做了个<2048>小游戏,顺便在<Git教程>学习下git,也顺便把在<写让别人 ...

  9. wpf做的3d滑动gallery

    原文:wpf做的3d滑动gallery wpf做的3d滑动gallery 随着iphone\ipad的流行及热捧,现在做移动产品不管是什么平台的,领导总想做成像ios系统的样子.自从微软发布了wind ...

  10. WPF从我炫系列4---装饰控件的用法

    这一节的讲解中,我将为大家介绍WPF装饰控件的用法,主要为大家讲解一下几个控件的用法. ScrollViewer滚动条控件 Border边框控件 ViewBox自由缩放控件 1. ScrollView ...

随机推荐

  1. 记录--npm, npx, cnpm, yarn, pnpm梭哈

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 依赖管理解决了在软件开发过程中管理和协调各种依赖项的问题,简化了开发流程,提高了项目的可靠性.可维护性和可重复性.它们帮助开发人员更高效地 ...

  2. TP6框架--CRMEB学习笔记:布置后台管理框架+配置路由

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近在研究一个基于TP6的框架CRMEB,这里分享下我的开发心得 首先在上篇文章中,我们安装了CRMEBphp接口项目,需要可以看这一篇 ...

  3. 记录--vue中动态引入图片为什么要是require, 你不知道的那些事

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 相信用过vue的小伙伴,肯定被面试官问过这样一个问题:在vue中动态的引入图片为什么要使用require 有些小伙伴,可能会轻蔑一笑:呵, ...

  4. drools中使用全局变量

    一.背景 在我们编写drools的规则文件的时候,有些时候需要用到全局变量,那么这个该怎么实现呢?有哪些注意事项呢? 二.前置知识 1.语法结构 2.全局变量的特点 使用global来定义全局变量,它 ...

  5. Elasticsearch索引不存在时,查询接口报错怎么办?

    1.索引不存在,报错:type=index_not_found_exception, reason=no such index解决办法: DSL: GET /text_index_003/_searc ...

  6. 【Pavia】遥感图像数据集下载地址和读取数据集代码

    [Pavia]遥感图像数据集下载地址和读取数据集代码 目录 [Pavia]遥感图像数据集下载地址和读取数据集代码 前言 Pavia数据集 Pavia数据集地址: Pavia数据集预览 PaviaU.m ...

  7. Wasm软件生态系统安全分析

    演讲嘉宾 | 王浩宇 回顾整理 | 廖   涛 排版校对 | 李萍萍 嘉宾简介 王浩宇,华中科技大学教授,博士生导师,华中科技大学OpenHarmony技术俱乐部主任.研究关注于新兴软件系统中的安全. ...

  8. 深入理解 Spring IoC 和 DI:掌握控制反转和依赖注入的精髓

    在本文中,我们将介绍 IoC(控制反转)和 DI(依赖注入)的概念,以及如何在 Spring 框架中实现它们. 什么是控制反转? 控制反转是软件工程中的一个原则,它将对象或程序的某些部分的控制权转移给 ...

  9. Python scipy.ndimage.find_objects用法及代码示例

    用法 scipy.ndimage.find_objects(input, max_label=0) 在标记数组中查找对象. 参数: input: 整数数组 包含由不同标签定义的对象的数组.值为 0 的 ...

  10. 【郑州轻工业大学】HarmonyOS宠物健康系统的开发分享

    原文:https://mp.weixin.qq.com/s/upcS6PcMS7UBR5jgoP7eow,点击链接查看更多技术内容. 本期我们给大家带来的是家庭宠物健康监测系统开发者杨光的分享,希望能 ...