Изображение не распечатано с RTB-контроля в WPF - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть элемент управления RichTextBox в приложении WPF. Я хотел бы распечатать содержимое на принтере. Содержимое содержит изображение вверху, текст и изображение внизу. При печати он напечатает текст и изображение внизу, но не изображение вверху.

Моя первая попытка была напечатать FlowDocument непосредственно из элемента управления RTB. Это напечатало документ с обоими изображениями, но заставило RTB-элемент управления пустым. После некоторого поиска я обнаружил, что мне нужно сначала скопировать FlowDocument из элемента управления RTB и распечатать копию. Копирование FlowDocument устранило проблему с пустым элементом управления, но копия не напечатает верхнее изображение. Я пытался копировать с различными форматами, такими как DataFormats.Rtf, но результаты были одинаковыми.

Во время отладки я заметил, что свойства размера в FD копии для изображений были равны 0, поэтому я добавил некоторый код, чтобы установить высоту и ширину копии перед печатью так же, как оригинал, но это неработать либо.

private void PrintBtn_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                LocalPrintServer printServer = new LocalPrintServer();
                PrintQueue pqDefault = printServer.DefaultPrintQueue;

                if (pqDefault == null)
                {
                    PrintDialog pd = new PrintDialog();
                    if (pd.ShowDialog() == true)
                    {
                        pqDefault = pd.PrintQueue;
                    }
                }

                if (pqDefault != null)
                {
                    XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pqDefault);
                    if (xpsdw != null)
                    {
                        MemoryStream stream = new MemoryStream();
                        TextRange sourceDoc = new TextRange(TemplateRTB.Document.ContentStart, 
                                                            TemplateRTB.Document.ContentEnd);
                        sourceDoc.Save(stream, DataFormats.XamlPackage);

                        FlowDocument fd = new FlowDocument();
                        TextRange copyDocRange = new TextRange(fd.ContentStart, fd.ContentEnd);
                        copyDocRange.Load(stream, DataFormats.XamlPackage);                  

                        TestRTB.Document = fd;
                        FixBitmaps(TemplateRTB.Document, fd);

                        DocumentPaginator paginator = ((IDocumentPaginatorSource)fd).DocumentPaginator;
                        xpsdw.Write(paginator);

                        //ResultsPrinted(1);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
~~~C#
...