0

当社では、MindFusion の WPF ダイアグラム コンポーネントを使用してアプリケーション (.NET 3.5 をターゲットとする WPF) を開発しています。明らかに、XPS ドキュメントを印刷および保存すると、さまざまなシステムでさまざまなエラーが発生します。

問題をアプリケーションから作成された 1 つのサンプルXPS ドキュメントに減らしました。まず、関連するシステムの概要を示し、xps ドキュメントを保存するときと、新しい WPF 印刷パスを使用して図のビジュアルを印刷するときの問題を分析します。次のリスト:

注: 3 つのシステムすべてに、Windows XP SP3 と .NET 3.5 Framework SP1 がインストールされています。

XpsDocumentWriter を使用して、Paginator で XPS ドキュメントを作成します。

PC 1 - XPS ビューアー (IE 7.0 で動作) が機能しません (.Net 3.5 の再インストール後でも)。Essential Pack の XPS Viewer でドキュメントを開きますが、ビューが完全にぼやけています。しかし、ご覧のとおり、スクリーンショットの右側にあるアプリケーションはDocumentViewer を使用してこの問題をテストしており、正しく動作しています。破損した XPS Viewer から印刷すると、画面上と同じ出力が得られますが、DocumentViewer の統合された印刷機能から (アプリケーションからの介入なしで) 印刷すると、ぼやけた出力が得られます。

PC 2 - IE XPS Viewer は正常に動作します。印刷出力に一貫性がありません。場合によっては、グラフィック (形状) が完全でないか、印刷デバイスが (同じドキュメントで) メモリ不足を通知します。

PC 3 – IE XPS Viewer は正常に動作しますが、印刷ジョブを開始すると常にIE 自体でこの例外が発生します。注: これまでに説明したすべての問題は、アプリケーションによって作成されたXPS ドキュメント(前述)でテストされています。

PrintDialog.PrintDocument と Paginator を使用して印刷ジョブを作成する:

私たちのアプリケーションから印刷すると、すべてのシステムで一貫した出力が得られます。ドキュメントが大きくなればなるほど (ページのメディア サイズに関して言えば)、ぼやけてしまいます。残念ながら、潜在的な原因の多くはすでに省略されています。ドキュメントを印刷するためのコードはかなり単純です。

• 独自のPaginatorを使用する代わりに、後者を、使用する MindFusion WPF ダイアグラム コンポーネントの別の Paginator 部分に置き換えました。私は同じ結果を達成しました。(このステートメントは、ファイルとして保存された XPSDocuments にも当てはまります)。

• 利用可能な最新の印刷ドライバーを使用しました

• PrintTicket Resolution の変更は、出力にまったく影響を与えないようです。

• ダイアグラムの代わりに別のビジュアル (アプリケーション自体のウィンドウなど) を使用しても、出力には影響しません。

これらのさまざまな問題により、複数の原因も考えられるようです。以前の除外により、いくつかの重要な設定が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 に答える