2013-02-15 5 views
2

i'am создание программы, где я хочу, чтобы содержимое RichTextBox (текст + изображения) сохранялось как изображение (jpg/png). Я пытался использовать this solution , но я получаю только черную заливку изображения изСохранение RichTextBox FlowDocument для изображения

SaveUIAsGraphicFile() 

Я также пытался создать FormattedText из моего контроля RTB, печатая это работает хорошо, но это не возможно, чтобы вставить изображения туда. Может быть, можно каким-то образом напечатать FlowDocument?

ответ

4

Вы могли бы использовать что-то вроде следующего метода для создания растрового изображения из FlowDocument:

public BitmapSource FlowDocumentToBitmap(FlowDocument document, Size size) 
{ 
    document = CloneDocument(document); 

    var paginator = ((IDocumentPaginatorSource)document).DocumentPaginator; 
    paginator.PageSize = size; 

    var visual = new DrawingVisual(); 
    using (var drawingContext = visual.RenderOpen()) 
    { 
     // draw white background 
     drawingContext.DrawRectangle(Brushes.White, null, new Rect(size)); 
    } 
    visual.Children.Add(paginator.GetPage(0).Visual); 

    var bitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 
             96, 96, PixelFormats.Pbgra32); 
    bitmap.Render(visual); 
    return bitmap; 
} 

public FlowDocument CloneDocument(FlowDocument document) 
{ 
    var copy = new FlowDocument(); 
    var sourceRange = new TextRange(document.ContentStart, document.ContentEnd); 
    var targetRange = new TextRange(copy.ContentStart, copy.ContentEnd); 

    using (var stream = new MemoryStream()) 
    { 
     sourceRange.Save(stream, DataFormats.XamlPackage); 
     targetRange.Load(stream, DataFormats.XamlPackage); 
    } 

    return copy; 
} 

, а затем использовать его, как показано ниже, чтобы сохранить документ А RichTextBox к файлу изображения.

var doc = richTextBox.Document; 
var bm = FlowDocumentToBitmap(doc, new Size(richTextBox.ActualWidth, richTextBox.ActualHeight)); 
var encoder = new JpegBitmapEncoder(); 
encoder.Frames.Add(BitmapFrame.Create(bm)); 

using (var stream = new FileStream("doc.jpg", FileMode.Create)) 
{ 
    encoder.Save(stream); 
} 
+0

спасибо за решение, оно работает, но как мне получить размер клиента rtb в wpf, чтобы соответствовать всему содержимому на изображении? – AutumnKnight

+0

Вы можете использовать «ActualWidth» и «ActualHeight» RichTextBox. Я отредактировал свой ответ, чтобы показать это. – Clemens

+0

Я попытался использовать их, но по какой-то причине они всегда возвращают одинаковые значения 300/100. И не меняется с вводом текста. У меня есть 'VerticalScrollBarVisibility =" Auto "' set. Это может быть проблема? – AutumnKnight

0

Example of default column pagination

Вы можете потратить часы чеканка вокруг, пытаясь выяснить, почему ширина неправильно, когда в действительности ее пытаются постраничной в колоннах. Установите ширину столбца документа на полную ширину вашего растрового изображения.

public Bitmap FlowDocumentToBitmap(FlowDocument document, Size size) 
    { 
     document = CloneDocument(document); 
     document.ColumnWidth = size.Width;// <- Add this line 
Смежные вопросы