c# - Cómo guardar RichTextBox FlowDocument en la imagen
wpf printing (2)
Puede usar algo como el siguiente método para crear un mapa de bits a partir de un 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;
}
y luego úselo como se muestra a continuación para guardar un Documento de RichTextBox en un archivo de imagen.
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);
}
Estoy haciendo un programa donde quiero que mi contenido RichTextBox (texto + imágenes) se guarde como una imagen (jpg / png). Traté de usar esta solución pero recibí solo una imagen llena de negro de
SaveUIAsGraphicFile()
También traté de crear FormattedText desde mi control de rtb, imprimiendo funciona bien, pero no es posible insertar imágenes allí. Tal vez es posible imprimir FlowDocument de alguna manera?
Puede gastar HORAS persiguiendo tratando de averiguar por qué el ancho es incorrecto cuando en realidad trata de paginar en columnas. Establezca el ancho de columna del documento en todo el ancho de su mapa de bits de salida.
public Bitmap FlowDocumentToBitmap(FlowDocument document, Size size)
{
document = CloneDocument(document);
document.ColumnWidth = size.Width;// <- Add this line