在 Office 里面,对于形状,可以通过 a:rect 指定文本框的坐标
在 PPT 里面,有文档里面存在自定义形状大概如下
<p:sp>
<p:nvSpPr> <!-- 忽略代码 --> </p:nvSpPr>
<p:spPr>
<a:xfrm>
<a:off x="3333403" y="2419004" />
<a:ext cx="3250276" cy="2385752" />
</a:xfrm>
<a:custGeom>
<a:avLst />
<a:gdLst/>
<a:ahLst />
<a:rect l="7200000" t="0" r="0" b="0" />
<a:pathLst>
<!-- 忽略代码 -->
</a:pathLst>
</a:custGeom>
</p:spPr>
<p:style>
<!-- 忽略代码 -->
</p:style>
<p:txBody>
<a:bodyPr lIns="3600000" tIns="360000"/>
<a:p>
<a:pPr />
<a:r>
<a:rPr lang="en-US" altLang="zh-CN"/>
<a:t>123</a:t>
</a:r>
</a:p>
</p:txBody>
</p:sp>
请问此时的文本的左上角坐标是什么
如下图,在形状里面的文本会先通过形状的 a:rect
拿到文本框相对于形状的矩形范围,然后文本又相对于文本框有一定的边距
在 OpenXML 里面,根据 ECMA 376 的 20.1.9.22 文档内容,形状的 a:rect
决定文本框的外框的矩形范围。而在文本框里面还有 a:bodyPr
的 lIns (Left Inset) 和 rIns (Right Inset) 和 bIns (Bottom Inset) 和 tIns (Top Inset) 决定文本在文本框里面的边距
因此文本在形状里面会受到 a:rect
和 a:bodyPr
的影响
在 OpenXML SDK 辅助读取形状的 a:rect
可以使用如下代码
using (var presentationDocument = DocumentFormat.OpenXml.Packaging.PresentationDocument.Open("自定义形状.pptx", false))
{
var presentationPart = presentationDocument.PresentationPart;
var presentation = presentationPart.Presentation;
var slideIdList = presentation.SlideIdList;
foreach (var slideId in slideIdList.ChildElements.OfType<SlideId>())
{
SlidePart slidePart = (SlidePart)presentationPart.GetPartById(slideId.RelationshipId);
var slide = slidePart.Slide;
var customGeometry = slide.Descendants<CustomGeometry>().First();
var sharpTextRectangle = customGeometry.Rectangle;
}
}
通过 OpenXML SDK 的 customGeometry.Rectangle
的属性上的注释也可以看到,这里的命名为 Rectangle 的属性其实是 SharpTextRectangle 的含义
在 Office 里面,对文本框的边距设置,作用是 a:bodyPr
属性,而不是 a:rect
属性
本文全部代码放在 github 或 gitee 欢迎大家访问
本文的属性是依靠 dotnet OpenXML 解压缩文档为文件夹工具 工具协助测试的,这个工具是开源免费的工具,欢迎小伙伴使用
本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-OpenXML-SDK-%E5%BD%A2%E7%8A%B6%E7%9A%84-rect-Shape-Text-Rectangle-%E5%B1%9E%E6%80%A7%E5%AF%B9%E6%96%87%E6%9C%AC%E6%A1%86%E7%9A%84%E5%9D%90%E6%A0%87%E5%BD%B1%E5%93%8D.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。
无盈利,不卖课,做纯粹的技术博客
以下是广告时间
推荐关注 Edi.Wang 的公众号
欢迎进入 Eleven 老师组建的 .NET 社区
以上广告全是友情推广,无盈利