Проблемы с XPSDocumentWriter и PrintDialog.PrintDocument - PullRequest
0 голосов
/ 29 июля 2009

Наша компания разрабатывает приложение (WPF, ориентированное на .NET 3.5) с компонентами диаграмм WPF от MindFusion. Очевидно, что печать и сохранение документов XPS приводят к различным ошибкам в разных системах.

Я сократил проблему до одного образца Документ XPS , созданный из нашего приложения. Сначала я дам обзор соответствующих систем и рассмотрю проблемы при соответствующем сохранении документа XPS и печати диаграммы. визуальный, используя новый путь печати WPF в следующем списке:

Примечание. На всех трех системах установлена ​​ОС Windows XP SP3 с установленным .NET 3.5 Framework SP1.

Использование XpsDocumentWriter для написания документа XPS с помощью Paginator:

ПК 1 - Средство просмотра XPS (работа с IE 7.0) не работает (даже после переустановки .Net 3.5). Средство просмотра XPS из пакета Essential Pack открывает документ, но представление полностью размыто. Но, как вы можете видеть, наше приложение в правой части снимка экрана использует DocumentViewer для проверки этой проблемы, которая работает правильно. Печать из поврежденного средства просмотра XPS приводит к тому же выводу, что и на экране, в то время как печать из встроенной функции печати в DocumentViewer (без вмешательства нашего приложения) дает расплывчатый вывод, который немного более читабелен, но все же неприемлем.

ПК 2 - IE XPS Viewer работает правильно. Вывод на печать несовместим. Иногда графика (фигуры) не завершена, или печатающее устройство уведомляет о нехватке памяти (с тем же документом).

ПК 3 - IE XPS Viewer работает правильно, но запуск задания печати всегда приводит к этому исключению внутри самого IE. Примечание. Все упомянутые выше проблемы были протестированы с помощью XPS Document (уже упоминавшегося выше), созданного нашим приложением.

Создание задания на печать с помощью PrintDialog.PrintDocument и Paginator:

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

• Вместо того чтобы использовать наш Paginator , я заменил последний другим Paginator-компонентом используемых для построения диаграмм компонентов MindFusion WPF. Я достиг того же результата. (Это утверждение также верно для XPSDocuments, сохраненных в виде файла).

• Я использовал последнюю доступную версию драйвера принтера

• Изменения в разрешении PrintTicket, похоже, никак не влияют на выходной сигнал

• Использование другого визуального объекта вместо диаграммы (например, окна самого приложения) не влияет на вывод

Из-за этих различных проблем, кажется, также возможны многочисленные причины. Предыдущие исключения заставляют меня предположить, что некоторые важные параметры отсутствуют в PrintTicket , или что-то ужасно неправильное происходит со сценами преобразования XPS в GDI. Помимо этих предположений у меня заканчиваются идеи.

Примечание. Все устройства печати имеют драйверы, отличные от XPS. HP Designjet 500, HP 2100

И последнее, но не менее важное: я сериализовал тот же PrintTicket , который использовался для файла документа XPS и задания на печать. Я был бы благодарен, если бы кто-нибудь испытывал подобные проблемы. Любые предложения приветствуются.

1 Ответ

0 голосов
/ 11 ноября 2009

У меня сейчас работает код, но у меня все еще есть проблемы с выравниванием. Но печать не размыта. Я даю вам свой код в надежде, что он может помочь вам, и мы оба сможем найти решение.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Documents;
using System.Windows;
using System.Windows.Media;
using System.Diagnostics;
using System.Globalization;
using System.Windows.Controls;
using System.Data;

namespace VD
{
  public class CustomPaginator : DocumentPaginator
  {
    private int _RowsPerPage;
    private Size _PageSize;
    private int _Rows;
    public static DataTable dtToPrint;

    public CustomPaginator() 
    {

    }
    public CustomPaginator(int rows, Size pageSize, DataTable dt)
    {
      _Rows = rows;
      PageSize = pageSize;
      dtToPrint = dt;
    }

    public override DocumentPage GetPage(int pageNumber)
    {
      int currentRow = _RowsPerPage * pageNumber;

      var page = new PageElement(currentRow, Math.Min(_RowsPerPage, _Rows - currentRow))
      {
        Width = PageSize.Width,
        Height = PageSize.Height,
      };

      page.Measure(PageSize);
      page.Arrange(new Rect(new Point(0,0), PageSize));     

      return new DocumentPage(page);
    }

    public override bool IsPageCountValid
    { get { return true; } }

    public override int PageCount
    { get { return (int)Math.Ceiling(_Rows / (double)_RowsPerPage); } }

    public DataTable getDtProtols
    {
        get
        {
            return dtToPrint;
        }
    }
    public override Size PageSize
    {
      get { return _PageSize; }
      set
      {
        _PageSize = value;

        _RowsPerPage = PageElement.RowsPerPage(PageSize.Height);

        //Can't print anything if you can't fit a row on a page
        Debug.Assert(_RowsPerPage > 0);
      }
    }

    public override IDocumentPaginatorSource Source
    { get { return null; } }
  }

  public class PageElement : UserControl
  {
    private const int PageMargin = 75;
    private const int HeaderHeight = 25;
    private const int LineHeight = 20;
    private const int ColumnWidth = 140;

    private CustomPaginator objParent = new CustomPaginator();
    private DataTable ProtocolsDT = null;
    private int _CurrentRow;
    private int _Rows;

    public PageElement(int currentRow, int rows)
    {
      Margin = new Thickness(PageMargin);
      _CurrentRow = currentRow;
      _Rows = rows;
    }

    private static FormattedText MakeText(string text)
    {
      return new FormattedText(text, CultureInfo.CurrentCulture,
        FlowDirection.LeftToRight,
        new Typeface("Tahoma"), 14, Brushes.Black);
    }

    public static int RowsPerPage(double height)
    {
      return (int)Math.Floor((height - (2 * PageMargin)
        - HeaderHeight) / LineHeight);
    }

    protected override void OnRender(DrawingContext dc)
    {
        ProtocolsDT = objParent.getDtProtols;
      Point curPoint = new Point(0, 0);

      dc.DrawText(MakeText("Host Names"),curPoint );
      curPoint.X += ColumnWidth;
      for (int i = 1; i < ProtocolsDT.Columns.Count; i++)
      {
          dc.DrawText(MakeText(ProtocolsDT.Columns[i].ToString()), curPoint);
        curPoint.X += ColumnWidth;
      }

      curPoint.X = 0;
      curPoint.Y += LineHeight;

      dc.DrawRectangle(Brushes.Black, null, new Rect(curPoint, new Size(Width, 2)));
      curPoint.Y += HeaderHeight - LineHeight;

      Random numberGen = new Random();
      //for (int i = _CurrentRow; i < _CurrentRow + _Rows; i++)
      //{
        //  dc.DrawText(MakeText(ProtocolsDT.Rows[i][0].ToString()), curPoint);
        //curPoint.X += ColumnWidth;
        for (int j = 0; j < ProtocolsDT.Rows.Count; j++)
        {
            for (int z = 0; z < ProtocolsDT.Rows[j].ItemArray.Length; z++)
            {
                dc.DrawText(MakeText(ProtocolsDT.Rows[j].ItemArray[z].ToString()), curPoint);
                curPoint.X += ColumnWidth;
            }
            curPoint.Y += LineHeight;
            curPoint.X = 0;
          //dc.DrawText(MakeText(ProtocolsDT.Rows[j].ItemArray[1].ToString()), curPoint);
          //curPoint.X += ColumnWidth;
          //dc.DrawText(MakeText(ProtocolsDT.Rows[j].ItemArray[2].ToString()), curPoint);
          //curPoint.X += ColumnWidth;
        //}
        //curPoint.Y += LineHeight;
        //curPoint.X = 0;
      }
    }
  }
}


Another Class

    private void PrintDataTable(DataTable dt)
        {
            var printDialog = new PrintDialog();
            if (printDialog.ShowDialog() == true)
            {                
                var paginator = new CustomPaginator(dt.Rows.Count,
                  new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight),dt);
                try
                {
                    printDialog.PrintDocument(paginator, "Running Protocols Report");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, "Unable to print protocol information. Please check your printer settings.", "VD", MessageBoxButton.OK, MessageBoxImage.Warning, MessageBoxResult.OK);
                }
            }
        }
...