1

我们使用 Windward 在 Microsoft Word 中生成报告。

由于一些更新,Unicode 字符不再正确显示。

虽然供应商仍在寻找解决方案,但我们正在寻找解决方法。

我注意到的一个症状是“正常”样式没有出现在功能区的“样式库”中。

我可以在文件的“styles.xml”部分找到它。我注意到该样式没有与之关联的 RSID,就像普通的 MS Word 文件那样。

GOOD FILE“正常”样式出现在图库中

<w:style w:type="paragraph" w:styleId="Normal" w:default="1">
    <w:name w:val="Normal" />
    <w:qFormat />
    <w:rsid w:val="003C4F1E" />
</w:style>

错误文件“正常”样式未出现在图库中

<w:style w:type="paragraph" w:default="1" w:styleId="Normal">
    <w:name w:val="Normal"/>
</w:style>

修改Styles.xml文件以使“正常”样式具有 rsid 以及 qFormat xml 标记,从而解决了让“正常”样式出现在图库中的问题。

我注意到,一旦我再次出现“正常”并单击它而无需先选择文档中的任何文本,Unicode 字符就会正确显示。

当我检查document.xml时,我注意到在运行之前添加了以下 xml:

    <w:rPr>
        <w:rFonts w:ascii="Mangal" w:hAnsi="Mangal" w:cs="Mangal"/>
    </w:rPr>

MS Word 是如何知道为 runPperty 选择这些值的?

如何使用 ooxml 检测复杂脚本,然后进行适当的字体选择?

使用复杂脚本的示例 XML

<w:r>
    <w:rPr>
        <w:rFonts w:ascii="Mangal" w:hAnsi="Mangal" w:cs="Mangal"/>
    </w:rPr>
    <w:t>एनडीटीवी</w:t>
</w:r>

到目前为止我所拥有的。

static bool GetRunText()
{
    bool bStylesFound = false;

    using (WordprocessingDocument doc = WordprocessingDocument.Open(_path, false))
    {

        // Get a reference to the main document part.
        var docPart = doc.MainDocumentPart;

        // Get the first paragraph.  
        Paragraph p = docPart.Document.Body.Descendants<Paragraph>().ElementAtOrDefault(0);

        if (p == null)
        {
            Console.WriteLine("No paragraphs found.");

        }
        else
        {

            Run run = p.Descendants<Run>().ElementAtOrDefault(1);

            RunProperties rp = run.RunProperties;

            //Console.WriteLine(rp.RunFonts.);
            bStylesFound = true;
        }

        return bStylesFound;
    }

}
4

0 回答 0