使用文本和图像从 RTF 中提取文本
Extracting text from RTF with text and image
我有一个从 WPF RichTextControl 中提取的字节数组,我从中提取文本。我成功地使用了以下代码:
FlowDocument document = new FlowDocument();
TextRange txtRange = null;
using (MemoryStream stream = new MemoryStream(data))
{
txtRange = new TextRange(document.ContentStart, document.ContentEnd);
txtRange.Load(stream, DataFormats.XamlPackage);
}
当 rtf 中嵌入了图像时,问题就出现了。我仍然想提取文本,但上面的代码将因 Load
方法上的 XamlParseException
而失败。
我尝试使用以下方法:
using (RichTextBox rtb = new RichTextbox())
{
rtb.Rtf = System.Text.Encoding.Default.GetString(data);
// use rtb.Text
}
但是 rtb.Rtf 的设置失败 ArgumentException
。原因可能是 explained here,因为 GetString
确实不是 return 预期的 rtf 格式,而是混合了 text/binary 数据和 xaml 的提及(同样的格式也 returns 仅用于文本,已使用之前的方法成功提取)。我无法升级框架。
如果我能找到成功加载文档的方法,如果需要提取文本,我不介意遍历 FlowDocument 树。
是否有其他阅读 RTF 的方法?
显然,当 RTF 中包含图像时,代码将在 STA 中 运行 时运行。例如:
Thread t = new Thread(() => Foo(data));
t.SetApartmentState(Apartment.STA);
t.Start();
t.Join();
Foo()
{
FlowDocument document = new FlowDocument();
TextRange txtRange = null;
using (MemoryStream stream = new MemoryStream(data))
{
txtRange = new TextRange(document.ContentStart, document.ContentEnd);
txtRange.Load(stream, DataFormats.XamlPackage);
}
}
我有一个从 WPF RichTextControl 中提取的字节数组,我从中提取文本。我成功地使用了以下代码:
FlowDocument document = new FlowDocument();
TextRange txtRange = null;
using (MemoryStream stream = new MemoryStream(data))
{
txtRange = new TextRange(document.ContentStart, document.ContentEnd);
txtRange.Load(stream, DataFormats.XamlPackage);
}
当 rtf 中嵌入了图像时,问题就出现了。我仍然想提取文本,但上面的代码将因 Load
方法上的 XamlParseException
而失败。
我尝试使用以下方法:
using (RichTextBox rtb = new RichTextbox())
{
rtb.Rtf = System.Text.Encoding.Default.GetString(data);
// use rtb.Text
}
但是 rtb.Rtf 的设置失败 ArgumentException
。原因可能是 explained here,因为 GetString
确实不是 return 预期的 rtf 格式,而是混合了 text/binary 数据和 xaml 的提及(同样的格式也 returns 仅用于文本,已使用之前的方法成功提取)。我无法升级框架。
如果我能找到成功加载文档的方法,如果需要提取文本,我不介意遍历 FlowDocument 树。
是否有其他阅读 RTF 的方法?
显然,当 RTF 中包含图像时,代码将在 STA 中 运行 时运行。例如:
Thread t = new Thread(() => Foo(data));
t.SetApartmentState(Apartment.STA);
t.Start();
t.Join();
Foo()
{
FlowDocument document = new FlowDocument();
TextRange txtRange = null;
using (MemoryStream stream = new MemoryStream(data))
{
txtRange = new TextRange(document.ContentStart, document.ContentEnd);
txtRange.Load(stream, DataFormats.XamlPackage);
}
}