0

我已经在 InfoPath 表单中设置了富文本框,我的程序通过 Infopath XML 解析如下:

XPathNavigator formNameNode = root.SelectSingleNode("/my:myFields/my:Responses/my:Q1", nsMgr);
string response1 = formNameNode.InnerXml;

然后使用以下代码打开一个 word 文档并获取一个名为 response1 的纯文本内容控件:

    using (WordprocessingDocument myDoc =
WordprocessingDocument.Open(ms, true))
    {
        MainDocumentPart mainPart = myDoc.MainDocumentPart;

    List<OpenXmlElement> sdtList = InfoPathToWord.GetContentControl(mainPart.Document, "response1");
            InfoPathToWord.AddRichText(0, response1, ref mainPart, ref sdtList);
}

然后代码调用 InfoPathToWord.AddRichText 如下:

public static void AddRichText(int id, string rtfValue,
          ref MainDocumentPart mainPart, ref List<OpenXmlElement> sdtList)
        {
            if (sdtList.Count != 0)
            {
                id++;
                string altChunkId = "AltChunkId" + id;
                AlternativeFormatImportPart chunk =
                  mainPart.AddAlternativeFormatImportPart(
                  AlternativeFormatImportPartType.Xhtml, altChunkId);

                using (MemoryStream ms = new MemoryStream(System.Text.Encoding.Default.GetBytes(rtfValue)))
                {
                    chunk.FeedData(ms);
                    ms.Close();
                }

                AltChunk altChunk = new AltChunk();
                altChunk.Id = altChunkId;

                InfoPathToWord.ReplaceContentControl(sdtList, altChunk);
            }
        }

最后 altChunk 替换了“response1”

    public static void ReplaceContentControl(
      List<OpenXmlElement> sdtList, OpenXmlElement element)
    {
        if (sdtList.Count != 0)
        {
            foreach (OpenXmlElement sdt in sdtList)
            {
                OpenXmlElement parent = sdt.Parent;
                parent.InsertAfter(element, sdt);
                sdt.Remove();
            }
        }
    }

问题是它替换了文本,但格式不正确并显示“?” 输出文本中的字符。不确定它是否是由于编码引起的,我也尝试过System.Text.Encoding.UTF8.GetBytes(rtfValue), System.Text.Encoding.ASCII.GetBytes(rtfValue),但这似乎没有帮助。

请有人告诉我我做错了什么。

提前致谢。

马夫

4

1 回答 1

0

我正在使用正则表达式在保存之前清理字符串。

html = Regex.Replace(html, "/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u", "") ' 允许制表符和其他可打印字符

Dim ms As New MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)) ' 创建替代格式导入部分。将 formatImportPart 调暗为 AlternativeFormatImportPart = mainDocPart.AddAlternativeFormatImportPart("application/xhtml+xml", altChunkId)

正则表达式从字符串中删除所有特殊字符?

更新...经过严格测试后,我在 docx 中发现 InfoPath RTF 存在太多字符编码问题。

于 2013-11-11T16:49:06.497 回答