0

我们公司正在使用 MindFusion 的 WPF 图表组件开发一个应用程序(WPF,针对 .NET 3.5)。显然,打印和保存 XPS 文档会导致不同系统上的各种错误。

我将问题简化为从我们的应用程序创建的单个示例XPS 文档。我将首先概述相关系统,并在分别保存 xps 文档和使用新的 WPF 打印路径打印图表时分解问题以下列表:

注意:所有三个系统都安装了带有 .NET 3.5 Framework SP1 的 Windows XP SP3。

使用 XpsDocumentWriter 通过 Paginator 编写 XPS 文档:

PC 1 - XPS 查看器(使用 IE 7.0)不起作用(即使在重新安装 .Net 3.5 之后)。Essential Pack 中的 XPS 查看器可打开文档,但视图完全模糊。但如您所见,我们在屏幕截图右侧的应用程序使用 DocumentViewer 来测试这个问题,它可以正常工作。从损坏的 XPS 查看器打印会产生与屏幕上相同的输出,而从 DocumentViewer 中的集成打印功能打印(无需我们的应用程序干预)会产生模糊的输出,可读性更高,但仍然不可接受。

PC 2 - IE XPS 查看器工作正常。打印输出不一致。有时,图形(形状)不完整,或者打印设备通知内存不足(使用相同的文档)。

PC 3 – IE XPS 查看器工作正常,但启动打印作业总是会导致IE 本身出现此异常。注意:之前提到的所有问题都已使用我们的应用程序创建的XPS 文档(上面已经提到)进行了测试。

使用 PrintDialog.PrintDocument 和 Paginator 创建打印作业:

从我们的应用程序打印与所有系统提供一致的输出:文档越大(就页面介质大小而言),它变得越模糊。不幸的是,很多潜在的原因已经被忽略了。打印文档的代码相当简单。

• 我没有使用我们自己的Paginator,而是将后者替换为我们使用的 MindFusion WPF 图表组件的另一个 Paginator 部分。我得到了同样的结果。(此语句也适用于保存为文件的 XPSDocuments)。

• 我使用了最新的可用打印驱动程序

• PrintTicket 分辨率的更改似乎不会以任何方式影响输出

• 使用另一个视觉对象而不是图表(如我们的应用程序本身的窗口)不会影响输出

由于这些不同的问题,似乎也有多种原因。之前的排除让我假设PrintTicket中缺少一些关键设置,或者 XPS 到 GDI 转换的场景发生了严重错误。除了这些假设之外,我的想法已经不多了。

注意:所有打印设备都有非 XPS 驱动程序。HP Designjet 500、HP 2100

最后但同样重要的是,我序列化了用于 XPS 文档文件和打印作业的相同PrintTicket 。如果有人遇到过类似的问题,我将不胜感激。欢迎任何建议。

4

1 回答 1

0

我目前有工作代码,但我仍然有对齐问题。但是打印并没有模糊我给你我的代码,希望它可以帮助你,我们都可以找到解决方案。

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);
                }
            }
        }
于 2009-11-11T14:14:22.800 回答