将RichTextBox FlowDocument保存到图像

时间:2013-02-15 13:22:46

标签: c# wpf image printing richtextbox

我正在制作一个我需要RichTextBox的程序 内容(文本+图像)保存为图像(jpg / png)。我试图使用this solution 但是我只得到了来自

的黑色填充图像
SaveUIAsGraphicFile() 

我还尝试从我的rtb控件创建FormattedText,打印它工作正常,但不能在那里插入图像。也许有可能以某种方式打印FlowDocument?

2 个答案:

答案 0 :(得分:6)

您可以使用类似以下方法的方法从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的Document保存到图像文件。

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);
}   

答案 1 :(得分:0)

Example of default column pagination

你可以花费HOURS追逐周围试图弄清楚为什么宽度是错误的,而实际上它试图在列中分页。将文档的columnwidth设置为输出位图的整个宽度。

    public Bitmap FlowDocumentToBitmap(FlowDocument document, Size size)
    {
        document = CloneDocument(document);
        document.ColumnWidth = size.Width;// <-  Add this line