Загрузить и сохранить RTF FlowDocument - PullRequest
0 голосов
/ 21 мая 2019

Мы используем RichTextBox (FlowDocument) в нашем приложении.Пользователь может вводить и вставлять текст и гиперссылки.Содержимое этого FlowDocument может быть загружено и сохранено.Нам нужно сохранить контент в формате Rtf, чтобы иметь возможность использовать его в других технологиях, например, Java.Все работает нормально, за исключением случаев, когда FlowDocument содержит гиперссылку с умлаутом в NavigateUri.С моей точки зрения уже сохраненный / сгенерированный текст Rtf поврежден / неверен.Если мы попытаемся загрузить его, он завершится сбоем.

Ниже приведен простой и сокращенный пример, демонстрирующий сбой.Простое нажатие на кнопку приводит к сбою.

    <DockPanel>
    <Button DockPanel.Dock="Bottom" Click="SaveAndLoadClick">Save and Load</Button>
    <RichTextBox IsDocumentEnabled="True" Name="richTextBox">
        <FlowDocument>
            <Paragraph>
                <Hyperlink Foreground="#FF0066CC" NavigateUri="http://www.öffnen.de" TextDecorations="Underline">www.öffnen.de</Hyperlink>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>
</DockPanel>

Соответствующий код позади:

    public partial class MainWindow {
    public MainWindow() {
        InitializeComponent();
    }

    private static void SetRtfText(FlowDocument document, string rtfText) {
        var textRange = new TextRange(document.ContentStart, document.ContentEnd);
        using (var stream = new MemoryStream(Encoding.Default.GetBytes(rtfText)))
            textRange.Load(stream, DataFormats.Rtf);
    }

    private static string GetRtfText(FlowDocument document) {
        var textRange = new TextRange(document.ContentStart, document.ContentEnd);
        using (var stream = new MemoryStream()) {
            textRange.Save(stream, DataFormats.Rtf);
            stream.Position = 0;
            return Encoding.Default.GetString(stream.ToArray());
        }
    }

    private void SaveAndLoadClick(object sender, RoutedEventArgs e) {
        var text = GetRtfText(richTextBox.Document);
        SetRtfText(richTextBox.Document, text);
    }
}

С моей точки зрения, проблема заключается в созданном тексте Rtf.Пожалуйста, смотрите следующую выдержку:

{\field{\*\fldinst { HYPERLINK "http://www.'f6ffnen.de" }}{\fldrslt {www.\'f6ffnen.de}}}}

Отображаемый текст экранирован и все в порядке.Но URL не в порядке.Как только текст Rtf загружен, XamParseException вызывается.Внутренним исключением является UriFormatException с недействительным Uri, поскольку имя хоста не может быть разрешено.

Я уже провел веб-исследование и не смог найти никаких потенциальных решений.Например, WordPad работает нормально и создает правильный текст Rtf.

Конечно, я могу разобрать Rtf для гиперссылок и попытаться исправить ссылку самостоятельно (со всеми проблемами).Я отлаживал код в соответствующих классах Microsoft, и с моей точки зрения проблемы связаны с ним.

Есть ли простой способ решить эту проблему?Я что-то пропустил?

Спасибо за любые идеи, подсказки ... Торстен

...