Подтвердить что ты не робот

PrintFixedDocument wpf качество печати - Windows 10/8 vs Windows 7

В настоящее время я пытаюсь распечатать содержимое контейнера содержимого (он содержит только данные с информацией) и изображение с помощью PrintFixedDocument. Он безупречно печатает на моей машине (окна 10) с полным качеством изображения и на другом ПК, который является окном 8, качество одного и того же.

Однако, когда это делается на ПК с Windows 7, качество изображения становится очень низким, и конечный результат очень размыт. Это проблема, поскольку компьютер не может быть обновлен из Windows 7 по разным причинам, поэтому им интересно, если кто-то еще испытал это, и если это так, то обходной путь? Также может быть проблема с моим методом GetFixedDocument, хотя я не могу понять, почему это будет работать как на выигрыше 10, так и на 8, но не на 7.

ПРИМЕЧАНИЕ. ЭТО РАБОТАЕТ ИЗ УСТАНОВЛЕННОЙ ВЕРСИИ ПРИМЕНЕНИЯ НА КАЖДОМ ПК.

ТАКЖЕ ИСКЛЮЧАЕТСЯ НА МНОЖЕСТВЕННЫХ ПРИНТЕРАХ НА ВСЕХ 3 ОПЕРАЦИОННЫХ СИСТЕМАХ

Любая помощь будет оценена

Xaml:

            <StackPanel Margin="-105,146,66,0" Height="900" VerticalAlignment="Top"  x:Name="PrintImageContextMenu">
                <Image Canvas.ZIndex="0" Source="{Binding Coupon.OverlayImagePath}"  Margin="0,-21,-76,108" Stretch="Fill"  />

                <ContentControl Content="{Binding}"  ContentTemplateSelector="{StaticResource DataViewerDataTemplateSelector}"  />

            </StackPanel>

С#:    открытый частичный класс CouponViewerView   {       public CouponViewerView()       {           InitializeComponent();       }

    public void Print()
    {
        //Executes On Thread
        Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (EventHandler)delegate
        {
            UpdateLayout();

            var fixedDoc = PrintHelper.GetFixedDocument(StackPanelToPrint, new PrintDialog());

            PrintHelper.ShowPrintPreview(fixedDoc);


        }, null, null);



    }

    private void PrintCurrentForm(object sender, RoutedEventArgs e)
    {
        Print();
    }

С# Вспомогательный код печати:

 public static void ShowPrintPreview(FixedDocument fixedDoc)
        {
            var wnd = new Window();
            var viewer = new DocumentViewer();
            viewer.Document = fixedDoc;
            wnd.Content = viewer;
            wnd.ShowDialog();
        }


  public static FixedDocument GetFixedDocument(FrameworkElement toPrint, PrintDialog printDialog)
        {
            var capabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket);
            var pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);
            var visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
            var fixedDoc = new FixedDocument();
            //If the toPrint visual is not displayed on screen we neeed to measure and arrange it  
            toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
            toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize));
            //  
            var size = toPrint.DesiredSize;
            //Will assume for simplicity the control fits horizontally on the page  
            double yOffset = 0;
            while (yOffset < size.Height)
            {
                var vb = new VisualBrush(toPrint)
                {
                    Stretch = Stretch.None,
                    AlignmentX = AlignmentX.Left,
                    AlignmentY = AlignmentY.Top,
                    ViewboxUnits = BrushMappingMode.Absolute,
                    TileMode = TileMode.None,
                    Viewbox = new Rect(0, yOffset, visibleSize.Width, visibleSize.Height)
                };
                var pageContent = new PageContent();
                var page = new FixedPage();
                ((IAddChild)pageContent).AddChild(page);
                fixedDoc.Pages.Add(pageContent);
                page.Width = pageSize.Width;
                page.Height = pageSize.Height;
                var canvas = new Canvas();
                FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
                FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
                canvas.Width = visibleSize.Width;
                canvas.Height = visibleSize.Height;
                canvas.Background = vb;
                page.Children.Add(canvas);
                yOffset += visibleSize.Height;
            }
            return fixedDoc;
        }
4b9b3361

Ответ 1

кто-нибудь еще испытал это, и если это так, то обходной путь?

Это единственный ответный вопрос, да, многие. Имейте в виду, что вы часто существенно масштабируете изображение на принтере, это устройства с очень высоким разрешением точек на дюйм по сравнению с монитором. Машина, загружающая Win7, часто работает с разрешением 96 точек на дюйм, более поздние, как правило, имеют лучшие мониторы, поэтому часто выполняются с более высокими настройками dpi. Первое, на что нужно обратить внимание, - это исходное изображение. Если у него есть размер пикселя, который подходит для этого компьютера Win7, тогда он может сильно размываться, когда он взорван до 600 dpi.

Вероятно, наиболее неинтуитивное поведение масштабирования в WPF - это то, что происходит, когда выравнивание изображения не идеально соответствует целевому пикселю после масштабирования. Проблема хорошо описана в этом сообщении в блоге. Обязательно прочтите также этот вопрос SO, который идеально подходит для использования VisualBrush и его проблемы с размытием. Эта проблема была рассмотрена в .NET 4.0 с добавленным свойством UseLayoutRounding. Вы не используете его, вы определенно должны. Не слепо применять BitmapScalingMode, который рекомендует dup, тип изображения (линейное изображение и фотография) имеет большое значение.

Ответ 2

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

Windows 7 просто кажется сломанной с некоторыми из WPF-печати.