セクションレポートの実行時、プリンタが用紙サイズをサポートしていないというエラーが発生します

文書番号 : 33929     文書種別 : 使用方法     登録日 : 2013/05/15     最終更新日 : 2013/05/15
文書を印刷する
対象製品
ActiveReports for .NET 7.0J
詳細
セクションレポートを実行した時、実行する環境によって、以下のようなエラーが発生する場合があります。
  • プリンタは用紙サイズ ** をサポートしません。PageSettingsでPaperKind.Customを使用するか、プリンタがサポートしている用紙サイズを指定してください。

  • Printer does not support ** papersize. Please use PaperKind.Custom in your PageSettings or specify a papersize supported by the current printer

セクションレポートの場合、レポート生成時や、デザイン画面上で「レポートの設定」ダイアログを表示したときに、その環境のプリンタドライバから用紙サイズなどの情報を取得します。その際に参照するプリンタは、(特に指定しない限り)その環境上で「通常使うプリンタ(デフォルトプリンタ)」に指定されているプリンタです。

たとえば、開発環境と実行環境とで、インストールされているプリンタドライバやその設定が異なる場合、またはデザイン時に設定した用紙サイズがレポートを実行した環境上のプリンタでサポートされていない場合、レポート生成時にエラーが発生することがあります。

また、デザイン時にレポートに設定した規定の用紙サイズが、別の実行環境上のプリンタでサポートされていても、規定サイズではなくユーザー定義サイズとしてサポートされていると、同様のエラーが発生します。

たとえば、.NET Framework標準のPropertyGridコントロールを使用し、下記のコードを実行することで、「通常使うプリンタ」がサポートしている用紙サイズを確認できます。(フォーム上にあらかじめPropertyGridコントロールが配置しておいてください。)

◆サンプルコード(VB.NET)
Private Sub Form1_Load(...) Handles MyBase.Load
  Dim pd As New System.Drawing.Printing.PrintDocument()
  PropertyGrid1.SelectedObject = pd.PrinterSettings
End Sub

◆サンプルコード(C#)
private void Form2_Load(object sender, EventArgs e)
{
  System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
  this.propertyGrid1.SelectedObject = pd.PrinterSettings;
}

このコードを実行し、PropertyGrid上の「PaperSizes」プロパティを展開すると、使用可能な用紙サイズ一覧が表示されます。表示される用紙サイズ一覧の内容はプリンタの機種によって異なります。また、同じ用紙サイズであっても、規定サイズとしてサポートしているプリンタと、ユーザー定義サイズとしてサポートしているプリンタがあります。以下はその一例です。
  1. B4が規定サイズのプリンタ
    [PaperSize B4 (JIS) Kind=B4 Height=1433 Width=1012]

  2. B4がカスタム(ユーザー定義サイズ)扱いのプリンタ
    [PaperSize B4 Kind=Custom Height=1433 Width=1012]
上記のように、同じB4サイズであってもプリンタによって PaperSize.Kind の値が異なる場合があります。

たとえば、デザイン時に[レポートの設定]ダイアログで用紙サイズをB4サイズに設定したとします。もし、このデザイン作業を行った開発環境のプリンタが上記「1.」のタイプのプリンタの場合、PaperSize.Kind=B4としてレポート内に保存されます。

しかしながら、このアプリケーションを別の実行環境で実行した時に、その環境のプリンタが上記「2.」のタイプのプリンタだった場合、そのプリンタからはPaperSize.Kind=B4という用紙サイズを取得できないため、レポートの生成時にエラーが発生します。

本現象を回避する方法としては、下記の2つの方法があります。

  1. 実行環境に、標準で用紙サイズをサポートするプリンタドライバ(開発環境で使用しているものと同じもの)をインストールし、レポート生成時にそのプリンタを参照するようにする。

  2. コード上で、仮想プリンタを設定し、ユーザー定義サイズで用紙サイズを指定する。
    以下のコードは、極力プリンタドライバにあらかじめ登録されている用紙サイズを適用するものとし、適用できない場合のみ、仮想プリンタ機能を使用しています。

    ◆サンプルコード(VB.NET)
    Private Sub SectionReport1_ReportStart(...) Handles MyBase.ReportStart
      Dim tmpBool As Boolean = False

      ' B4サイズの高さと幅を予め取得します。
      Dim tmpHeight As Integer = SectionReport.CmToInch(36.4) * 100
      Dim tmpWidth As Integer = SectionReport.CmToInch(25.7) * 100

      With Me.PageSettings
        For Each Ps As System.Drawing.Printing.PaperSize In _
          Me.Document.Printer.PrinterSettings.PaperSizes

          If (Ps.Kind = Drawing.Printing.PaperKind.B4) Then
            ' B4サイズが標準サイズとして存在した場合、それを設定します。
            .PaperKind = Drawing.Printing.PaperKind.B4
            tmpBool = True
            Exit For
          End If
        Next

        If tmpBool = False Then
          For Each Ps As System.Drawing.Printing.PaperSize In _
            Me.Document.Printer.PrinterSettings.PaperSizes

            If ((Ps.Height = tmpHeight) _
              AndAlso (Ps.Width = tmpWidth)) Then

              ' 用紙サイズがB4(25.7×36.4cm)のものが存在した場合、
              ' その用紙サイズを設定します。
              ' ※プリンタによって設定されている用紙サイズが
              '  異なる場合もございます。ご注意ください。

              Me.Document.Printer.DefaultPageSettings.PaperSize = Ps
              tmpBool = True
              Exit For
            End If
          Next
        End If

        If tmpBool = False Then
          For Each Ps As System.Drawing.Printing.PaperSize In _
            Me.Document.Printer.PrinterSettings.PaperSizes

            If (Ps.PaperName = "B4") Then
              ' 用紙サイズ名が"B4"のものが存在した場合、
              ' その用紙サイズを設定します。
              ' ※プリンタによって設定されている用紙名が
              '  異なる場合もございます。ご注意ください。

              Me.Document.Printer.DefaultPageSettings.PaperSize = Ps
              tmpBool = True
              Exit For
            End If
          Next
        End If

        If tmpBool = False Then
          ' B4サイズが標準サイズとして存在しなかった場合、
          ' ユーザー定義サイズとして設定します。

          ' 仮想プリンタを設定します。

          Me.Document.Printer.PrinterName = ""

          ' B4サイズを、ユーザー定義サイズで設定します。
          .PaperKind = Drawing.Printing.PaperKind.Custom
          .PaperHeight = tmpHeight / 100
          .PaperWidth = tmpWidth / 100
        End If

        ' 用紙方向を縦に設定します。
        .Orientation = Section.PageOrientation.Portrait
      End With

    End Sub

    ◆サンプルコード(C#)
    private void SectionReport1_ReportStart
      (object sender, EventArgs e)
    {
      bool tmpBool = false;

      // B4サイズの高さと幅を予め取得します。
      float tmpHeight = GrapeCity.ActiveReports.SectionReport.CmToInch(36.4f) * 100;
      float tmpWidth = GrapeCity.ActiveReports.SectionReport.CmToInch(25.7f) * 100;

      foreach (System.Drawing.Printing.PaperSize Ps
        in this.Document.Printer.PrinterSettings.PaperSizes)
      {        
        if (Ps.Kind == System.Drawing.Printing.PaperKind.B4)
        {
          // B4サイズが標準サイズとして存在した場合、それを設定します。
          this.PageSettings.PaperKind
            = System.Drawing.Printing.PaperKind.B4;
          tmpBool = true;
          break;
        }
      }

      if (tmpBool == false)
      {
        foreach (System.Drawing.Printing.PaperSize Ps
          in this.Document.Printer.PrinterSettings.PaperSizes)
        {
          if ((Ps.Height == (int)tmpHeight)
            && (Ps.Width == (int)tmpWidth))
          {
            // 用紙サイズがB4(25.7×36.4cm)のものが
            // 存在する場合、その用紙サイズを設定します。
            // ※プリンタによって設定されている用紙サイズが
            //  異なる場合もございます。ご注意ください。

            this.Document.Printer.DefaultPageSettings
              .PaperSize = Ps;
            tmpBool = true;
            break;
          }
        }
      }

      if (tmpBool == false)
      {
        foreach (System.Drawing.Printing.PaperSize Ps
          in this.Document.Printer.PrinterSettings.PaperSizes)
        {
          if (Ps.PaperName == "B4")
          {
            // 用紙サイズ名が"B4"のものが存在する場合、
            // その用紙サイズを設定します。
            // ※プリンタによって設定されている用紙名が
            //  異なる場合もございます。ご注意ください。

            this.Document.Printer.DefaultPageSettings
              .PaperSize = Ps;
            tmpBool = true;
            break;
          }
        }
      }

      if (tmpBool == false)
      {
        // B4サイズが標準サイズとして存在しなかった場合、
        // ユーザー定義サイズとして設定します。

        // 仮想プリンタを設定します。

        this.Document.Printer.PrinterName = "";

        // B4サイズを、ユーザー定義サイズで設定します。
        this.PageSettings.PaperKind
          = System.Drawing.Printing.PaperKind.Custom;
        this.PageSettings.PaperHeight = tmpHeight / 100;
        this.PageSettings.PaperWidth = tmpWidth / 100;
      }

      // 用紙方向を縦に設定します。
      this.PageSettings.Orientation
        = GrapeCity.ActiveReports.Document.Section.PageOrientation.Portrait;
    }

    なお、仮想プリンタの詳細や注意事項につきましては、製品ヘルプの以下のトピックをご参照ください。

    PowerTools ActiveReports for .NET 7.0J
     - ActiveReportsユーザーガイド
      - 概念
       - セクションレポートの概念
        - 仮想プリンタ
      - よくある質問
       - 印刷
        - 「プリンタドライバがサポートしていない用紙サイズに出力する」
関連情報
キーワード
問題 印刷・プレビュー