Мне нужно импортировать RTF-документ в FlowDocument для дальнейшего анализа .. Но у меня есть очень странная проблема:
public string ConvertRTF(byte[] bytes)
{
if (bytes == null)
{
throw new ArgumentNullException();
}
FlowDocument document = new FlowDocument();
// open the file for reading
using (MemoryStream stream = new MemoryStream(bytes, true))
{
// create a TextRange around the entire document
TextRange documentTextRange = new TextRange(document.ContentStart, document.ContentEnd);
if (documentTextRange.CanLoad(DataFormats.Rtf))
documentTextRange.Load(stream, DataFormats.Rtf);
}
return XamlWriter.Save(document);
}
Я тестировал этот метод в трех разных проектах:
- Wpf автономное приложение : не доставляет мне никаких проблем, но, увы, я не могу использовать такого рода приложения.
- Консольное приложение : оно часто работает, но время от времени ломает документы с изображением, и я не могу разобраться, когда оно ломается и почему ... Я получаю ошибку для метода Load TextRange: «Нераспознанная структура в формате данных« Rich Text Format ». Имя параметра: stream»
- Приложение Xbap : Даже не справляется с методом CanLoad ... :( Так что в результате мне дается имя, которое называется Джеком ...
Странно то, что когда я тестирую его с помощью консольного приложения, оно работает без ошибок в следующей конструкции:
[STAThread]
static void Main(string[] args)
{
OpenFileDialog dialog = new OpenFileDialog
{
Filter = "import files (*.rtf)|*.rtf"
};
if (dialog.ShowDialog() != DialogResult.OK)
return;
byte[] data;
using (Stream filestream = dialog.OpenFile())
{
int offset = 0;
data = new byte[filestream.Length];
int remaining = data.Length;
while (remaining > 0)
{
int read = filestream.Read(data, offset, remaining);
if (read <= 0)
throw new EndOfStreamException
(String.Format("End of stream reached with {0} bytes left to read", remaining));
remaining -= read;
offset += read;
}
}
FlowDocument document = new FlowDocument();
using (MemoryStream stream = new MemoryStream(data))
{
// create a TextRange around the entire document
TextRange documentTextRange = new TextRange(document.ContentStart, document.ContentEnd);
documentTextRange.Load(stream, DataFormats.Rtf);
}
Console.WriteLine("test ok");
}
Что просто делает меня невежественным, потому что это именно то, что я делаю, но затем поэтапно в два этапа ... сначала извлекаю биты, затем использую поток памяти, чтобы превратить его в RTF ...: (
Может быть, что-то конфликтует в какой-то версии dll? Мы используем 3.5 SP1 для нашего проекта ...
Может ли кто-нибудь помочь мне найти решение для одной из двух последних возможностей, упомянутых выше?
Спасибо