【问题标题】:How to check if an OLE object exists in rtf file如何检查 rtf 文件中是否存在 OLE 对象
【发布时间】:2017-05-22 11:29:55
【问题描述】:

LINK Extract Embedded Image Object in RTF我下面的代码与我提供的链接相同,它在 97-2003 文档中运行良好,而相同的代码现在在 office 2007/2010 中不起作用。我们通常检查其中包含 OLE 对象的 RTF,并根据公司规则拒绝我们的转换,但即使在 office-2007/2010 创建的 RTF 中存在写为“对象”的文本,我们的代码也会拒绝。在 Office-2007 创建的 RTF 中是否有任何解决方案可以识别?

        using (StreamReader sr = new StreamReader(filePath))
                    {
                        RtfReader reader = new RtfReader(sr);
                        IEnumerator<RtfObject> enumerator = reader.Read().GetEnumerator();
                        while (enumerator.MoveNext())
                        {
                            if (enumerator.Current.Text == "object")
                            {
                                hasOLEObjects = true;
                                break;
                            }
                        }
                    }


    public RtfReader(TextReader reader)
            {
                if (reader == null)
                    throw new ArgumentNullException("reader");

                Reader = reader;
            }


public class RtfObject
    {
        public RtfObject(string text)
        {
            if (text == null)
                throw new ArgumentNullException("text");

            Text = text.Trim();
        }

        public string Text { get; private set; }
    }

【问题讨论】:

  • RtfReader 来自什么命名空间/包?
  • 它是一个文本阅读器
  • 没有名为RtfReader 的内置类。这看起来像是您自己的项目中的一个类。除非猜测明显的问题,否则无法帮助您未发布的代码。例如,为什么要检查元素的 contents 而不是其类型? RtfReader 不会暴露元素类型吗?现在,您拒绝在其文本中包含单词object 的任何文档。如果用户开始使用带有Object 标题的模板怎么办?
  • NO RtfReader 不公开元素类型,是的,它的类来自我自己的项目。我想知道 RTF 中是否有任何 OLE 对象。我在谷歌搜索了很多,但除了下面的链接之外找不到 Soultion。请看一下并建议我如何在 RTF 中找到对象。 stackoverflow.com/questions/14779647/….

标签: .net c#-4.0 rtf


【解决方案1】:

我又添加了一个 if 条件来检查 OLE 对象 if (RtfReader.MoveToNextControlWord(enumerator, "objclass"))

这可能对某人有帮助

public static bool ValidateOLEObjects(string filePath)
        {
            bool hasOLEObjects = false;
            using (StreamReader sr = new StreamReader(filePath))
            {
                RtfReader reader = new RtfReader(sr);
                IEnumerator<RtfObject> enumerator = reader.Read().GetEnumerator();
                while (enumerator.MoveNext())
                {
                    if (enumerator.Current.Text == "object")
                    {
                        if (RtfReader.MoveToNextControlWord(enumerator, "objclass"))
                        {
                            hasOLEObjects = true;
                            break;

                            }
                    }
                }

                return hasOLEObjects;
            }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    相关资源
    最近更新 更多