我们使用 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;
}
}