2013-02-15 59 views
2

我正在制作一个程序,我希望将我的RichTextBox 内容(文本+图像)保存为图像(jpg/png)。我试图用this solution 但我从将RichTextBox FlowDocument保存为图像

SaveUIAsGraphicFile() 

只得到黑色填充图像我也试图从我的RTB控制创建FormattedText的,在打印工作正常,但它不可能在里面插入图片。也许有可能以某种方式打印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

感谢您的解决方案,它的工作原理,但我如何获得在WPF的RTB客户端的大小,以适应图像的所有内容? – AutumnKnight 2013-02-15 23:33:48

+0

您可以使用RichTextBox的'ActualWidth'和'ActualHeight'。我编辑了我的答案来证明这一点。 – Clemens 2013-02-15 23:48:22

+0

我尝试过使用它们,但由于某些原因,它们总是返回相同的值300/100。并没有改变与文字输入。我有'VerticalScrollBarVisibility =“Auto”'设置。这可能是问题吗? – AutumnKnight 2013-02-16 00:07:44

0

Example of default column pagination

你可以花时间追逐周围试图找出为什么宽度,而实际上它试图在列分页错误。将文档的列宽设置为输出位图的整个宽度。

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