WPF PrintDialog печатает одну и ту же страницу дважды - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь распечатать многостраничный файл, но вместо двух разных страниц я получаю две страницы с одним и тем же изображением.

Настройка теста:

Я сканирую несколько страниц в размолвка. Страницы помечены как «1», «2», «3», и если я открою файл с Windows предварительным просмотром изображения, появится несколько разных страниц. Как только я распечатываю файл в формате PDF или на физическом принтере, я получаю две страницы с одинаковым изображением. (Не обязательно на той же странице, так как я могу добавить текстовый блок с увеличивающимся номером страницы, который отображается правильно)

Как я это делаю, так:

  1. Загрузка TIFF из файла через BitmapDecoder

    BitmapDecoder decoder = BitmapDecoder.Create(new Uri(path), BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.OnLoad);

  2. Итерация фреймов: foreach ImageFrame создает Frameworkelement его файл xaml с одним Imagecontrol (Интересно, если я добавлю страницу индекс он считает, но изображение остается прежним)

var count = decoder.Frames.Count;
                for (int i = 0; i < count; i++)
                {
                    var frame = decoder.Frames[i];
                    frame.Freeze();
                    var element = new PrintDocumentControl();
                    element.DataContext = new DocumentVm(new ImageData(frame));
                    this.internDocument.AddPage(element);
                }

этот internDocument (список элементов кадра) затем преобразуется в FixedDocument следующим образом:

    private FixedDocument CreateDocument()//TODO: change some element property to check whether there are two different frames 
    {
        FixedDocument document = new FixedDocument();
        document.DocumentPaginator.PageSize = PageSize;

        double height = PageSize.Height;
        double width = PageSize.Width;

        foreach (var element in frameworkElements)
        {
            PageContent pageContent = new PageContent();
            FixedPage fixedPage = new FixedPage();

            element.Height = height;
            element.Width = width;

            fixedPage.Width = width;
            fixedPage.Height = height;
            fixedPage.Children.Add(element);

            pageContent.Width = width;
            pageContent.Height = height;

            pageContent.Child = fixedPage;
            document.Pages.Add(pageContent);
        }

        return document;
    } 

и отображается в DocumentViewer-Control

<DocumentViewer Grid.Column="1" Document="{Binding Document}"/>

Как только пользователь нажимает кнопку Печать, выполняется следующее:

     if (document != null)
        {
            printDialog.PageRangeSelection = PageRangeSelection.AllPages; // added to check if this is where the problem occurs
            printDialog.PrintDocument(document.DocumentPaginator, Description);
        }

, где документ ранее был создан и отображен FixedDocument.

Надеюсь, это объяснение имеет смысл, я собираюсь около недели углубиться в эту проблему ...

Есть какие-нибудь предложения относительно того, где моя проблема может быть ie?

Параметр двусторонней печати отключен, а диапазон страниц - AllPages.

Для меня это выглядит как проблема с кэшированием изображения, поскольку дважды печатается только изображение, но не текстовый блок «dynamici c».

EDIT:

Мое подозрение что то, как я создаю FixedDocument, является ошибкой. Что делает это странным, так это то, что предварительный просмотр отображается правильно ... Запись FixedDocument во временный файл XPS приводит к одинаковому поведению: правильные две страницы, но одно и то же изображение на обеих страницах.

            if (document != null)
            {
                string filename = System.Environment.GetEnvironmentVariable("TEMP") + @"\TempFixedDocument.xps";
                System.IO.File.Delete(filename);
                XpsDocument xpsd = new XpsDocument(filename, FileAccess.ReadWrite);
                XpsDocumentWriter xw = XpsDocument.CreateXpsDocumentWriter(xpsd);
                xw.Write(document);
                printDialog.PrintDocument(xpsd.GetFixedDocumentSequence().DocumentPaginator, Description);
                xpsd.Close();
            }
...