当前位置: 首页 > 知识库问答 >
问题:

从openxml获取字体信息的更好方法

成和悌
2023-03-14
    private RunProperties GetRunPropertyFromParagraph(Paragraph paragraph)
    {
        var runProperties = new RunProperties();
        var fontname = "Calibri";
        var fontSize = "18";
        try
        {
            fontname =
                paragraph.GetFirstChild<ParagraphProperties>()
                         .GetFirstChild<ParagraphMarkRunProperties>()
                         .GetFirstChild<RunFonts>()
                         .Ascii;
        }
        catch
        {
            //swallow
        }
        try
        {
            fontSize =
                paragraph.GetFirstChild<Paragraph>()
                         .GetFirstChild<ParagraphProperties>()
                         .GetFirstChild<ParagraphMarkRunProperties>()
                         .GetFirstChild<FontSize>()
                         .Val;
        }
        catch
        {
            //swallow
        }
        runProperties.AppendChild(new RunFonts() { Ascii = fontname });
        runProperties.AppendChild(new FontSize() { Val = fontSize });
        return runProperties;
    }
    private RunProperties GetRunPropertyFromTableCell(TableRow rowCopy, int cellIndex)
    {
        var runProperties = new RunProperties();
        var fontname = "Calibri";
        var fontSize = "18";
        try
        {
            fontname =
                rowCopy.Descendants<TableCell>()
                       .ElementAt(cellIndex)
                       .GetFirstChild<Paragraph>()
                       .GetFirstChild<ParagraphProperties>()
                       .GetFirstChild<ParagraphMarkRunProperties>()
                       .GetFirstChild<RunFonts>()
                       .Ascii;
        }
        catch
        {
            //swallow
        }
        try
        {
            fontSize =
                   rowCopy.Descendants<TableCell>()
                          .ElementAt(cellIndex)
                          .GetFirstChild<Paragraph>()
                          .GetFirstChild<ParagraphProperties>()
                          .GetFirstChild<ParagraphMarkRunProperties>()
                          .GetFirstChild<FontSize>()
                          .Val;
        }
        catch
        {
            //swallow
        }
        runProperties.AppendChild(new RunFonts() { Ascii = fontname });
        runProperties.AppendChild(new FontSize() { Val = fontSize });
        return runProperties;
    }

代码起作用了。至少在我试过的文件中。但这似乎是一种糟糕的方式,但我还没有找到更好的解决方案,所以如果你有一个,请分享:)

共有1个答案

申屠昆
2023-03-14

我是这样做的:当我更新或替换一个运行时,我确保检查何时删除旧的东西,一个元素是否有子元素,然后它是否有一个子元素,即“runproperties”。如果是,我只保存这些属性,并在删除旧内容后将它们添加到我的新运行中。

还没让我失望。

var bkms = YourBookmarkStart;
OpenXmlElement elem = bkms.NextSibling();
RunProperties oldRunProperties = null;
while (elem != null && !(elem is BookmarkEnd))
{
    OpenXmlElement nextElem = elem.NextSibling();
    if (elem.HasChildren)
    {
        try
        {
             oldRunProperties = (RunProperties)elem.GetFirstChild<RunProperties>().Clone();
        }
        catch { }
    }
    if (!(elem is BookmarkStart))
        elem.Remove();
    elem = nextElem;
}

Run r = new Run(new Text(newText));
if (oldRunProperties != null) r.PrependChild<RunProperties>(oldRunProperties);
bkms.Parent.InsertAfter<Run>(r, bkms);

它应该抓取给定段落拥有的任何运行属性,除非它没有任何运行属性,在这种情况下,它不会添加任何运行属性,因此使用文档中默认的运行属性。

 类似资料:
  • 好的,我有一个座位系统,它生成一个30x30的网格,对于每个网格,数据库中都有一行,但是当我在我的页面上生成这个网格时,我当前每个元素发出5个SQL请求(有900个元素),我们都知道这不是最优的。 为了呈现它,我执行一个while循环,并执行一些检查,然后回显出以下代码: 下面是一个座椅模型如何工作的例子 每个请求中有5个这样的函数,这对许多人来说是一种方式。所以我需要一些好的方法来最小化这个系统

  • 本文向大家介绍Android获取窗体信息的Util方法,包括了Android获取窗体信息的Util方法的使用技巧和注意事项,需要的朋友参考一下 Android获取窗体信息的Util方法,方法很简单,这里就不多废话了,直接上代码 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 问题内容: 每次我尝试使用ffmpeg获取有关我的视频文件的信息时,都会吐出很多无用的信息,混杂着很多好东西。 我正在使用。 有没有可能以友好的方式实现这一目标?我的意思是JSON会很棒(甚至丑陋的XML也可以)。 至此,我使我的应用程序使用正则表达式解析数据,但是在某些特定的视频文件上却出现了很多讨厌的角落。我已修复所有遇到的问题,但可能还会更多。 我想要类似的东西: 问题答案: 有点晚了,但也

  • 执行 gradle help —task someTask 可以显示指定任务的详细信息. 或者多项目构建中相同任务名称的所有任务的信息. 如下例. 例 11.12. 获取任务帮助 gradle -q help —task libs的输出结果 > gradle -q help --task libs Detailed task information for libs Paths :api

  • 接口说明 获取单体化信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /api/attach/1.0.0/getAttach 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 id string form 是 场景ID 响应字段说明 无 响应成功示例 { "code": 200, "data": "at

  • 我在acroform字段中有以下pdf结构键: 我想键是字体描述,但我不明白这个值是什么意思。有人能帮忙破译吗?