dotnet OpenXML SDK 形状的 rect Shape Text Rectangle 属性对文本框的坐标影响

在 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:recta: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 属性

本文全部代码放在 githubgitee 欢迎大家访问

本文的属性是依靠 dotnet OpenXML 解压缩文档为文件夹工具 工具协助测试的,这个工具是开源免费的工具,欢迎小伙伴使用

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

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

如有不方便在博客评论的问题,可以加我 QQ 2844808902 交流

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

lindexi_gd CSDN认证博客专家 C# WPF UWP 微软最具价值专家
我是微软Windows应用开发方向的最具价值专家,欢迎访问我博客blog.lindexi.com里面有大量WPF和UWP博客
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页