本文来告诉大家,在 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. JavaScript知识总结 基础篇

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. new操作符的实现原理 new操作符的执行过程: (1)首先创建了一个新的空对象 (2)设置原型,将对象的原型设置为函数的 prot ...

  2. C++正则表达式 <regex>

    一 简介 概括而言,使用正则表达式处理字符串的流程包括: 用正则表达式定义要匹配的字符串的规则, 然后对目标字符串进行匹配, 最后对匹配到的结果进行操作. C++ 的 regex 库提供了用于表示正则 ...

  3. js前端 md5加密

    1.在utils目录下新建md5.js 在这里,我把md5()这个方法使用export进行了导出,方便在其他地方使用es6 import 引入使用 /* * JavaScript MD5 1.0.1 ...

  4. KingbaseES角色和权限介绍

    KingbaseES 使用角色的概念管理数据库访问权限.为了方便权限管理,用户可以建立多个角色,对角色进行授权和权限回收,并把角色授予其他用户. 数据库初始化时,会创建一个超级用户的角色:system ...

  5. 提升系统管理:监控和可观察性在DevOps中的作用

    在不断发展的DevOps世界中,深入了解系统行为.诊断问题和提高整体性能的能力是首要任务之一.监控和可观察性是促进这一过程的两个关键概念,为系统的健康和性能提供了宝贵的可见性.虽然这些术语经常可以互换 ...

  6. 全平台GPU通用AI视频补帧超分教程

    全平台GPU通用AI视频补帧超分教程 本教程只发布于https://www.cnblogs.com/Icys 注意:本教程需要一定的命令行和视频编码知识,请谨慎食用. 软件准备 realcugan-n ...

  7. MySQL 数据库操作指南:LIMIT,OFFSET 和 JOIN 的使用

    限制结果 您可以通过使用"LIMIT"语句来限制查询返回的记录数量.以下是一个示例,获取您自己的Python服务器中"customers"表中的前5条记录: i ...

  8. 携手HMS Core统一扫码服务, 兴业证券优理宝App提升用户扫码体验

    兴业证券优理宝App联合华为HMS Core,集成HMS Core统一扫码服务,在提升扫码成功率的同时,还支持C端用户用手机端APP扫描手表端二维码,实现行情在手机与手表间跨终端流转,行情信息,抬腕可 ...

  9. 通过path在windows下临时修改python和pip路径 以便于配置环境只对当前命令行窗口生效

    配置前 在cmd命令行下输入新env的路径 path=D:\Miniconda2\envs\openmmlab\openmmlab;D:\Miniconda2\envs\openmmlab\openm ...

  10. Mysql之刷盘机制

    一.刷盘机制总览 刷盘过程 mysql刷脏数据在写redo之后,逻辑跟oracle一致. checkpoint/commit -> 内存中的redo到redolog文件 -> 内存中的脏数 ...