【问题标题】:Saving RichTextBox FlowDocument to image将 RichTextBox FlowDocument 保存到图像
【发布时间】:2023-03-19 06:13:01
【问题描述】:

我正在制作一个我想要我的 RichTextBox 的程序 内容(文本+图像)保存为图像(jpg/png)。我尝试使用this solution 但我只从

得到黑色填充图像
SaveUIAsGraphicFile() 

我还尝试从我的 rtb 控件创建 FormattedText,打印效果很好,但无法在其中插入图像。也许有可能以某种方式打印 FlowDocument?

【问题讨论】:

    标签: c# wpf image printing richtextbox


    【解决方案1】:

    您可以花费 HOURS 来寻找宽度错误的原因,而实际上它试图在列中分页。将文档的列宽设置为输出位图的全宽。

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

    【讨论】:

      【解决方案2】:

      您可以使用类似以下方法从 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);
      }   
      

      【讨论】:

      • 感谢您的解决方案,它有效,但我如何在 wpf 中获取 rtb 客户端大小,以适应图像中的所有内容?
      • 您可以使用 RichTextBox 的 ActualWidthActualHeight。我已经编辑了我的答案以表明这一点。
      • 我尝试使用它们,但由于某种原因,它们总是返回相同的值 300/100。并且不会随着文本输入而改变。我有VerticalScrollBarVisibility="Auto" 设置。这可能是问题吗?
      • 你也可以试试ExtentWidthExtentHeight。请注意,我在代码示例中添加了 CloneDocument 方法,因为我意识到访问原始文档的 Paginator 会干扰 RichTextBox。
      猜你喜欢
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多