2015-12-11 3 views
10

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

Однако, когда это делается на ПК с 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> 

C#: общественного частичного класса CouponViewerView { общественного 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(); 
    } 

C# Выводим помощник код:

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; 
     } 
+0

Просто для хихиканья, хотя я уверен, что вы, вероятно, уже проверили.Вы проверили настройки на машине win7, чтобы убедиться, что она не печатает в черновом режиме или не выполняет ручное изменение размера и т. Д., А также убедитесь, что все драйверы принтеров обновлены? –

+0

Да устранили всех обычных подозреваемых. Печать на прекрасное качество на всех принтерах и всех драйверах актуальна. Его действительно странно, поскольку я никогда не видел ничего подобного. – philmckendry

+0

Да, я знаю, что они внесли некоторые изменения в пакеты драйверов и прочее, чтобы попытаться уговорить производителей прекратить загрузку на кучу OEM-блэтов, но, насколько я знаю, все они должны питаться одинаково независимо от версии ОС. Это интересно. –

ответ

0

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

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

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

+0

Хорошо спасибо за ответ. Мне очень нужно уйти и посмотреть, чтобы решить эту проблему. – philmckendry

0

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

Windows 7 просто кажется сломанной с некоторой печатью WPF.

Смежные вопросы