Вы могли бы использовать что-то вроде следующего метода для создания растрового изображения из 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);
}
спасибо за решение, оно работает, но как мне получить размер клиента rtb в wpf, чтобы соответствовать всему содержимому на изображении? – AutumnKnight
Вы можете использовать «ActualWidth» и «ActualHeight» RichTextBox. Я отредактировал свой ответ, чтобы показать это. – Clemens
Я попытался использовать их, но по какой-то причине они всегда возвращают одинаковые значения 300/100. И не меняется с вводом текста. У меня есть 'VerticalScrollBarVisibility =" Auto "' set. Это может быть проблема? – AutumnKnight