Импорт RTF с изображениями в xbap - PullRequest
1 голос
/ 12 марта 2009

Мне нужно импортировать 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 для нашего проекта ...

Может ли кто-нибудь помочь мне найти решение для одной из двух последних возможностей, упомянутых выше?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 декабря 2010

Видимо не может быть сделано.

В итоге мы отправили rtf серверу, который имеет больше привилегий, и отправили результат обратно клиенту. Противно, но работает.

0 голосов
/ 28 сентября 2010

Вероятно, у вас проблемы с уровнем доверия. Интернет-приложения Xbap по умолчанию для частичного доверия. Вы можете использовать сертификат для полного доверия с интернет-приложениями xpab.

...