本文来告诉大家如何解析读取在 OpenXML 里面存放的文本删除线,本文使用 PowerPoint 作为例子来告诉大家如何读取然后在 WPF 应用里面显示

在开始之前,期望大家已了解如何在 dotnet 应用里面读取 PPT 文件,如果还不了解读取方法,请参阅 C# dotnet 使用 OpenXml 解析 PPT 文件

期望在阅读本文之前,先阅读 dotnet OpenXML 简单聊聊 PPT 文本解析

以下是本文效果

在 OpenXML 文档,将文本的删除线放在了文本的 Run 属性里面,大概内容如下

            <a:r>
<a:rPr lang="en-US" altLang="zh-CN" strike="sngStrike" dirty="0" smtClean="0" />
<a:t>123123</a:t>
</a:r>

以上代码的 strike 表示的就是删除线的内容。和 WPF 的设计不同的是,在 WPF 里面,无论是下划线还是删除线等,都是属于文本装饰。但是在 PPT 里面,下划线是下划线,而删除线是删除线。同时下划线和删除线的样式也是特别多的

如删除线的 TextStrikeValues 的枚举,在 ECMA 376 的第 20.1.10.78 章可以了解到有单线条的删除线和双线条的删除线,在 OpenXML 里面的枚举如下

  /// <summary>
/// Text Strike Type
/// </summary>
public enum TextStrikeValues
{
/// <summary>
/// Text Strike Enum ( No Strike ).
/// <para>When the item is serialized out as xml, its value is "noStrike".</para>
/// </summary>
[EnumString("noStrike")]
NoStrike,
/// <summary>
/// Text Strike Enum ( Single Strike ).
/// <para>When the item is serialized out as xml, its value is "sngStrike".</para>
/// </summary>
[EnumString("sngStrike")]
SingleStrike,
/// <summary>
/// Text Strike Enum ( Double Strike ).
/// <para>When the item is serialized out as xml, its value is "dblStrike".</para>
/// </summary>
[EnumString("dblStrike")]
DoubleStrike,
}

下面开始在一个空 WPF 项目里面尝试去读取一个包含删除线文本的 PPT 文件,然后将文本在界面渲染

在开始之前,先读取 PPT 文件,代码如下

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

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

拿到第一个页面

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

接着获取文本元素的坐标

            var shape = slide.CommonSlideData.ShapeTree.GetFirstChild<Shape>();
// 获取坐标
var offset = shape.ShapeProperties.Transform2D.Offset;
var x = new Emu(offset.X);
var y = new Emu(offset.Y);

以上的 EMU 是通过 dotnetCampus.OpenXMLUnitConverter 开源仓库提供的,详细请看 Office Open XML 的测量单位

获取文本元素的文本内容,文本内容需要先读取段落,接着再获取文本属性和文本

            // 读取文本内容
var textBody = shape.TextBody; // 读取段落
var paragraph = textBody.GetFirstChild<Paragraph>(); // 读取段落的文本
var run = paragraph.GetFirstChild<Run>(); // 读取删除线
var strike = run.RunProperties.Strike;

转换为 WPF 的元素,代码如下

            // 创建元素
var textBlock = new TextBlock()
{
TextDecorations = strike.Value == TextStrikeValues.NoStrike? new TextDecorationCollection():TextDecorations.Strikethrough,
Text = run.Text.Text,
Margin = new Thickness()
{
Left = x.ToPixel().Value,
Top = y.ToPixel().Value,
}
}; Canvas.Children.Add(textBlock);

以上代码的 Canvas 是放在 XAML 的控件,本文所有代码放在githubgitee 欢迎访问

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

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

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

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

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

如果要支持双删除线,可以使用如下代码

            var textBlock = new TextBlock()
{
TextDecorations = strike.Value switch
{
TextStrikeValues.NoStrike => new TextDecorationCollection(),
TextStrikeValues.SingleStrike => TextDecorations.Strikethrough,
TextStrikeValues.DoubleStrike => new TextDecorationCollection()
{
new TextDecoration(TextDecorationLocation.Strikethrough,new Pen(Brushes.Black,1), -1, TextDecorationUnit.Pixel, TextDecorationUnit.Pixel),
new TextDecoration(TextDecorationLocation.Strikethrough,new Pen(Brushes.Black,1), 1, TextDecorationUnit.Pixel, TextDecorationUnit.Pixel)
},
_ => throw new ArgumentException()
},
Text = run.Text.Text,
Margin = new Thickness()
{
Left = x.ToPixel().Value,
Top = y.ToPixel().Value,
}
};

效果如下

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

dotnet OpenXML 文本删除线解析方法的更多相关文章

  1. 画删除线的方法,如何找替代方法,Deprecated注释

    用@Deprecated注释的程序元素,不鼓励程序员使用这样的元素,通常是因为它很危险或存在更好的选择.在使用不被赞成的程序元素或在不被赞成的代码中执行重写时,编译器会发出警告. 那么相应的替代方法应 ...

  2. python 对过时类或方法添加删除线的方法

    class Cat(Animal): def __init__(self): import warnings warnings.warn("Cat类带删除线了", Deprecat ...

  3. CSS上划线、下划线、删除线等方法

    text-decoration:underline;     下划线 text-decoration:overline;    顶划线 text-decoration:line-through;  删 ...

  4. NSMutableAttributedString 富文本删除线的用法

    #import <UIKit/UIKit.h> //价格 NSString *priceStr = @"99元 剁手价66元"; NSMutableAttributed ...

  5. html 中几次方,平方米,立方米,下标,上标,删除线等的表示方法

    html 中几次方,平方米,立方米,上标,下标,删除线等的表示方法 上标下标删除线 小号字  M2 54 X24+Y1<3=100 NN <sup>上标</sup> &l ...

  6. jQuery 表格中实现“删除线”的增进方法

    之前做了一个删除线的效果,就是类似这样的,在内容的中间加一条线. 但是又有点不同的是,这种删除线不是单纯的在文字之上,而是给一个Table中的一行加上这种删除线效果. 这里有两个方法,是在不同时期写的 ...

  7. The usage of Markdown---文字强调:加粗/斜体/文本高亮/删除线/下划线/按键效果

    更新时间:2019.09.14 1. 序言 有时候,我们需要对某些文字进行强调,例如粗体和斜体.而Markdown通常可以使用星号*或者下划线_进行文字强调. 2. 加粗 如果想要达到加粗的效果,可以 ...

  8. ios 富文本 加颜色 删除线

    UILabel *valueL = [JAppViewTools getLabel:CGRectMake(JFWidth(15), CGRectGetMaxY(proName.frame)+JFWid ...

  9. Document树的解析方法

    一.本次总结用到的xml文本 1.    <?xml version="1.0" encoding="UTF-8" standalone="no ...

  10. 【转】Android TextView SpannableStringBuilder 图文混排颜色斜体粗体下划线删除线

    spannableStringBuilder 用法详解: SpannableString ss = new SpannableString("红色打电话斜体删除线绿色下划线图片:." ...

随机推荐

  1. BugkuCTF-游戏过关

    首先将exe文件下载下来,打开看一下: 玩游戏 n是灯的序列号,m是灯的状态 如果第n盏灯的m是1,它就开,如果不是,它就关 起初所有的灯都关上了 现在你可以输入n来改变它的状态 但是你应该注意一件事 ...

  2. JDBC反序列化

    JDBC反序列化攻击 介绍 JDBC(Java DataBase Connectivity)是一种用于执行Sql语句的Java Api,即Java数据库连接,是Java语言中用来规范客户端程序如何来访 ...

  3. PHP 数据库表单创建方法记录(储存三方接口数据必用)

    最近项目在对接第三方接口数据,这里分享下我用来偷懒的一个PHP方法: /** * 数据库表单创建方法 * @return string * @throws \Exception */ public f ...

  4. 记录--Js基础练习题目

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.使用js,在页面中打印以下图案 提示: document.write可以在页面中打印内容<br>在html中代表换行, 在 ...

  5. kali linux安装vmware tools过程详解

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/robacco/article/deta ...

  6. 学习笔记-Kafka消息队列

    官网地址:https://kafka.apache.org/ 一.认识kafka 1.认识kafka Apache Kafka是Apache软件基金会的开源的流处理平台,该平台提供了消息的订阅与发布的 ...

  7. 一篇文章了解CI/CD管道全流程

    从CI/CD过程开始,包含所有阶段并负责创建自动化和无缝的软件交付的一系列步骤称为CI/CD管道工作流.使用CI/CD管道,软件发布工件可以从代码提交阶段到测试.构建.部署和生产阶段在管道中移动和前进 ...

  8. [Unity3D] 使用LineRenderer实现尾迹与虚线效果

    Unity3D 使用LineRenderer绘制尾迹与虚线 1.添加LineRenderer组件 先创建一个3D对象,然后点击Add Component选项 搜索并添加LineRenderer组件 添 ...

  9. #轮廓线dp,博弈论#洛谷 4363 [九省联考 2018] 一双木棋 chess

    题目传送门 分析 菲菲想让答案尽量大,牛牛想让答案尽量小. 很天真的一种想法就是设 \(dp[i][j]\) 表示现在选择 \((i,j)\) 的答案. 但是这样有一个弊端就是并不知道其它位置怎么选择 ...

  10. 今晚19:00知识赋能第2期直播丨OpenHarmony智能家居项目之控制面板界面设计

    OpenAtom OpenHarmony(以下简称"OpenHarmony")开源开发者成长计划项目自 2021 年 10 月 24 日上线以来,在开发者中引发高度关注. 成长计划 ...