GrapeCity ActiveReports for .NET 14.0J
印刷
ActiveReportsユーザーガイド > よくある質問 > セクションレポート > 印刷

用紙サイズ(規定サイズ)や余白を変更する

ActiveReports では、印刷時だけでなくレポート生成処理においても、プリントドライバ(明示的に指定したプリンタドライバ、もしくは、何も指定しない場合はマシンの通常使うプリンタに設定されているプリンタドライバ)から取得した情報を使用します。

プリンタドライバが任意の規定サイズをサポートしている場合に、ActiveReportsはその規定サイズでレポートを出力できます。プリンタドライバに依存しないレポートを作成したい場合は、以下の「プリンタドライバがサポートしていない用紙サイズに出力する」を参照してください。

設計時に設定する

デザイナ画面上の[レポートの設定]ダイアログから指定します。

このダイアログの「プリンタ設定」には、開発環境上で「通常使うプリンタ」に設定されているプリンタドライバから取得した値が、表示されます。このため、ここで選択した規定サイズが、実際の運用環境で使用されるプリンタドライバに存在しない場合、運用時にエラーが発生しますので注意してください。詳細については、「プリンタは用紙サイズ ** をサポートしません」というエラーが発生するを参照してください。

実行時に設定する

設計時にデザイナ画面上の[レポートの設定]ダイアログの「ページ設定」や「プリンタ設定」で設定した項目は、実行時にActiveReportオブジェクトのPageSettings クラスのプロパティを使用して、参照や設定を行うことができます。

たとえば、レポートの余白(マージン)は、Margins プロパティで参照できます。レポートの実行前に、これらのプロパティを指定することで、余白を動的に変更することが可能です。

以下のサンプルコードでは、用紙サイズをA3横、上下の余白を各1cm、左右の余白を各1.5cmに設定しています。

Visual Basic

Visual Basicコード
コードのコピー
Dim rpt As New SectionReport1() 

' 用紙サイズを A3横 に設定します。 
rpt.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.A3 
rpt.PageSettings.Orientation = GrapeCity.ActiveReports.Document.Section.PageOrientation.Landscape 

' 上下の余白を 1.0cm に設定します。 
rpt.PageSettings.Margins.Top = GrapeCity.ActiveReports.SectionReport.CmToInch(1) 
rpt.PageSettings.Margins.Bottom = GrapeCity.ActiveReports.SectionReport.CmToInch(1) 

' 左右の余白を 1.5cm に設定します。 
rpt.PageSettings.Margins.Left = GrapeCity.ActiveReports.SectionReport.CmToInch(1.5) 
rpt.PageSettings.Margins.Right = GrapeCity.ActiveReports.SectionReport.CmToInch(1.5) 

' レポートを生成し、Viewer上に表示します。
rpt.Run() 
Viewer1.Document = rpt.Document                                       

C#

C#コード
コードのコピー
SectionReport1 rpt = new SectionReport1();
                                                        
// 用紙サイズを A3横 に設定します。 
rpt.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.A3; 
rpt.PageSettings.Orientation = GrapeCity.ActiveReports.Document.Section.PageOrientation.Landscape;

// 上下の余白を 1.0cm に設定します。
rpt.PageSettings.Margins.Top = GrapeCity.ActiveReports.SectionReport.CmToInch(1.0f); 
rpt.PageSettings.Margins.Bottom = GrapeCity.ActiveReports.SectionReport.CmToInch(1.0f); 

// 左右の余白を 1.5cm に設定します。
rpt.PageSettings.Margins.Left = GrapeCity.ActiveReports.SectionReport.CmToInch(1.5f); 
rpt.PageSettings.Margins.Right = GrapeCity.ActiveReports.SectionReport.CmToInch(1.5f); 

// レポートを生成し、Viewer上に表示します。 
rpt.Run();
this.viewer1.Document = rpt.Document;

用紙サイズ(ユーザー定義のサイズ)を変更する

ActiveReportsでは、印刷時だけでなくレポート生成処理においても、プリントドライバ(明示的に指定したプリンタドライバ、もしくは、何も指定しない場合はマシンの通常使うプリンタに設定されているプリンタドライバ)から取得した情報を使用します。

プリンタドライバがユーザー定義のサイズをサポートしている場合に、ActiveReportsはそのユーザー定義のサイズでレポートを出力できます。このため、ActiveReportsでユーザー定義サイズのレポートの印刷を行うには、まずプリンタドライバが、ユーザー定義サイズとしてそのサイズをサポートしているかどうかを確認する必要があります。この確認方法については、以下の「ActiveReportsで使用可能な用紙サイズを取得する」を参照してください。

しかしながら、サポートされていない用紙サイズが指定された場合には、レポートはプリンタドライバのデフォルトの用紙サイズで出力されます。プリンタドライバでサポートされていない用紙サイズは、そのサイズで正しく印刷することができません。ただし、印刷ではなく、単にプレビューするだけや、他の形式へエクスポートすることが目的であれば、仮想プリンタを使用することでプリンタドライバに依存することなくレポートを生成でき、プレビューやエクスポートの処理を行えます。この方法については「プリンタドライバがサポートしていない用紙サイズに出力する」を参照してください。

また、Webアプリケーションのように、必ずしもレポートの生成と印刷の環境が一致しない場合(つまり、レポートの生成はサーバー上で行い、印刷はクライアント側で行う場合)も、仮想プリンタを使用することで、生成時の環境のプリンタドライバに依存することなくレポートの生成が行えます。

ユーザー定義サイズを指定するには、以下のいずれかの方法があります。

ActiveReportsの[ユーザー定義のサイズ]機能を使用する方法

メニューバーの[レポート]メニューから [レポートの設定] を選択し、プリンタ設定ダイアログを開きます。プリンタ設定ダイアログにて、[用紙サイズ]ドロップダウンボックスから[ユーザー定義のサイズ]を選択します。このオプションを選択すると、 [幅]オプションと[高さ]オプションを使用して、用紙の幅と高さを指定できるようになります。

メモ: ユーザー定義サイズでレポートを作成する場合、アプリケーションの実行ユーザーにAdministrator権限(「サーバーのプロパティ」で新しい用紙サイズを作成可能な権限)が与えられている必要があります。
注意: 同時に使用できるユーザー定義のサイズは1つだけであることに注意してください。
ActiveReportsは、ユーザー定義のサイズが指定されると、「ARCustomForm」という名前の用紙サイズを自動的に作成します。異なるユーザー定義サイズで複数のレポートを連続して生成(表示)すると、後から生成したレポートのサイズで、「ARCustomForm」が上書きされます。レポートを印刷する際は、この「ARCustomForm」という名称の用紙サイズが使用されるため、後から指定されたサイズで印刷が行われ、その結果、想定したサイズと異なるサイズで印刷されるといった現象が起こります。複数のユーザー定義サイズを同時に使用したい場合には、下記の「Windows のプリンタにあるサーバーのプロパティの機能を使用する方法」を行うようにしてください。

「ユーザー定義のサイズ」の設定は、デザイン時だけでなく、コードを使用して実行時に行うこともできます。その場合には、下記のサンプルコードのようにReportStartイベントを使用します。

Visual Basic

Visual Basicコード
コードのコピー
Private Sub SectionReport1_ReportStart(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.ReportStart
   ' 使用するプリンタ(プリンタドライバ)の名前を設定します。
    Me.Document.Printer.PrinterName = "Printer XXXX" 
   ' カスタム用紙サイズを有効にします。 
    Me.PageSettings.PaperKind = Drawing.Printing.PaperKind.Custom 
   ' 用紙サイズを指定します。(インチ単位) 
    Me.PageSettings.PaperWidth = 8
    Me.PageSettings.PaperHeight = 8 
End Sub

C#

C#コード
コードのコピー
SectionReport1_ReportStart(object sender, System.EventArgs e)
{
       // 使用するプリンタ(プリンタドライバ)の名前を設定します。
        this.Document.Printer.PrinterName = "Printer XXXX";
       // カスタム用紙サイズを有効にします。
        this.PageSettings.PaperKind = Drawing.Printing.PaperKind.Custom;
       // 用紙サイズを指定します。(インチ単位)
        this.PageSettings.PaperWidth = 8;
       this.PageSettings.PaperHeight = 8;
}

Windows のプリンタにあるサーバーのプロパティの機能を使用する方法

たとえば、「サーバーのプロパティ」から追加した用紙サイズが、PaperSizesコレクションのインデックス「10」に定義されている場合、下記のようなコードで設定できます。

Visual Basic

Visual Basicコード
コードのコピー
Dim rpt As New SectionReport1() 
rpt.PageSettings.PaperKind = rpt.Document.Printer.PaperSizes(10).Kind 
rpt.PageSettings.PaperName = rpt.Document.Printer.PaperSizes(10).PaperName
rpt.Run()

仮想プリンタを使用する方法

Visual Basic

Visual Basicコード
コードのコピー
Private Sub ActiveReport1_ReportStart(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.ReportStart 
     ' 仮想プリンタを使用します。 
    Me.Document.Printer.PrinterName = ""
     ' カスタム用紙サイズを有効にします。 
    Me.PageSettings.PaperKind = Drawing.Printing.PaperKind.Custom 
    ' 用紙サイズを指定します。(インチ単位) 
    Me.PageSettings.PaperWidth = 8 Me.PageSettings.PaperHeight = 8 
End Sub

連続用紙に印刷する

連続用紙を使用できるかどうかは、使用するプリンタのプリンタドライバに依存します。プリンタドライバが連続用紙の用紙サイズをサポートしているかどうかをご確認ください。ActiveReports上で指定できる用紙サイズの一覧は、下記のようにPaperSizesプロパティを使用することで、参照できます。

Visual Basic

Visual Basicコード
コードのコピー
Dim rpt As New SectionReport1()
Dim i As Integer
For i = 0 To rpt.Document.Printer.PaperSizes.Count - 1
    Console.Write(rpt.Document.Printer.PaperSizes(i).Kind.ToString() + ", ")
    Console.Write(rpt.Document.Printer.PaperSizes(i).PaperName.ToString() + ", ")
    Console.Write(rpt.Document.Printer.PaperSizes(i).Height.ToString() + ", ")
    Console.WriteLine(rpt.Document.Printer.PaperSizes(i).Width.ToString())
Next

C#

C#コード
コードのコピー
SectionReport1 rpt = new SectionReport1();
for (int i = 0; i rpt.Document.Printer.PaperSizes[i].Count; i++)
{
    Console.Write(rpt.Document.Printer.PaperSizes[i].Kind.ToString() + ", ");
    Console.Write(rpt.Document.Printer.PaperSizes[i].PaperName.ToString() + ", ");
    Console.Write(rpt.Document.Printer.PaperSizes[i].Height.ToString() + ", ");
    Console.WriteLine(rpt.Document.Printer.PaperSizes[i].Width.ToString());
}

プリンタ側で用意されている用紙サイズ一覧の中に、想定している用紙サイズが存在する場合には、ユーザー定義サイズではなくそちらを使用することをお勧めいたします。たとえば、想定している用紙サイズが、PaperSizesコレクションのインデックス''10''に定義されている場合、下記のようなコードで設定します。

Visual Basic

Visual Basicコード
コードのコピー
Dim rpt As New SectionReport1()
rpt.PageSettings.PaperKind = rpt.Document.Printer.PaperSizes(10).Kind
rpt.PageSettings.PaperName = rpt.Document.Printer.PaperSizes(10).PaperName
rpt.Run()

C#

C#コード
コードのコピー
SectionReport1 rpt = new SectionReport1();
rpt.PageSettings.PaperKind = rpt.Document.Printer.PaperSizes[10].Kind;
rpt.PageSettings.PaperName = rpt.Document.Printer.PaperSizes[10].PaperName;
rpt.Run()

ActiveReportsで使用可能な用紙サイズを取得する

ActiveReportsで使用できる用紙サイズは、使用するプリンタドライバに依存します。ここでは、ActiveReportsで使用できる用紙サイズを確認する方法について説明します。

メモ: 使用するプリンタがユーザー定義のサイズをサポートしているにもかかわらず、ActiveReportsで正しく認識されない場合のほとんどは、権限が不足していることが原因です。通常、ユーザー定義のサイズを設定するには、プリンタのアクセス許可において「プリンタの管理」権限が必要となりますが、ネットワークプリンタなどを使用している場合は、各ユーザーには「印刷」権限しか付与されていないケースが一般的です。これらの権限の問題が解決しているにもかかわらず、ActiveReports で正しく認識されない場合は、プリンタドライバがユーザー定義のサイズをサポートしていないか、もしくはそのプリンタドライバ固有の問題であると考えられます。

なお、プリンタドライバがサポートしていない用紙サイズのレポートを作成したい場合は、仮想プリンタを使用することで実現できます。この方法に関しては、「プリンタドライバがサポートしていない用紙サイズに出力する」を参照してください。

コードで確認する

通常のWindowsアプリケーションのように、レポートの生成と印刷環境が同一の場合、ActiveReports上で指定できる用紙サイズの一覧は、下記のサンプルコードのように、PaperSizesプロパティを使用して参照できます。

Visual Basic

Visual Basicコード
コードのコピー
Dim rpt As New SectionReport1()
Dim i As Integer
For i = 0 To rpt.Document.Printer.PaperSizes.Count - 1
    Console.Write(rpt.Document.Printer.PaperSizes(i).Kind.ToString() + ", ")
    Console.Write(rpt.Document.Printer.PaperSizes(i).PaperName.ToString() + ", ")
    Console.Write(rpt.Document.Printer.PaperSizes(i).Height.ToString() + ", ")
    Console.WriteLine(rpt.Document.Printer.PaperSizes(i).Width.ToString())
Next

C#

C#コード
コードのコピー
SectionReport1 rpt = new SectionReport1();
for (int i=0; i = rpt.Document.Printer.PaperSizes.Count; i++)
{
    Console.Write(rpt.Document.Printer.PaperSizes[i].Kind.ToString() + ", ");
    Console.Write(rpt.Document.Printer.PaperSizes[i].PaperName.ToString() + ", ");
    Console.Write(rpt.Document.Printer.PaperSizes[i].Height.ToString() + ", ");
    Console.WriteLine(rpt.Document.Printer.PaperSizes[i].Width.ToString());
}

プリンタドライバがサポートしていない用紙サイズに出力する

ActiveReportsで使用できる用紙サイズは、使用するプリンタドライバに依存します。プリンタドライバがサポートしているかどうかを確認する方法については、上記の「ActiveReportsで使用可能な用紙サイズを取得する」を参照してください。プリンタドライバがサポートしていない用紙サイズのレポートを作成したい場合は、仮想プリンタを使用します。

仮想プリンタを使用する

レポートのRunの実行前か、もしくはReportStart イベントで Printer クラスの PrinterName プロパティに "" を設定することで、仮想プリンタ機能を使用できます。以下のサンプルコードでは、ReportStart イベントで仮想プリンタを使用しています。

Visual Basic

Visual Basicコード
コードのコピー
Private Sub SectionReport1_ReportStart(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.ReportStart 
    ' 仮想プリンタを使用します。 
    Me.Document.Printer.PrinterName = ""
    ' 用紙サイズをB4縦に設定します。 
    Me.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.B4
    Me.PageSettings.Orientation = GrapeCity.ActiveReports.Document.Section.PageOrientation.Portrait 
    ' カスタム用紙サイズを有効にします。 
    Me.PageSettings.PaperKind = Drawing.Printing.PaperKind.Custom 
    ' 用紙サイズをインチで指定します。
    Me.PageSettings.PaperWidth = 8 
End Sub

C#

C#コード
コードのコピー
private void SectionReport1_ReportStart(object sender, EventArgs e)
{
     // 仮想プリンタを使用します。
     this.Document.Printer.PrinterName = "";
     // 用紙サイズをB4縦に設定します。
     this.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.B4;
    this.PageSettings.Orientation = GrapeCity.ActiveReports.Document.Section.PageOrientation.Portrait;
    // カスタム用紙サイズを有効にします。
     this.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.Custom;
    // 用紙サイズをインチで指定します。
     this.PageSettings.PaperWidth = 8;
}

仮想プリンタを使用して作成したレポートは、特に何も設定をしない場合、印刷が実際に行われる環境上の「プリンタのデフォルト値」で印刷されます。デフォルト値以外で印刷する方法は、以下の通りです。

レポートを拡大・縮小印刷したい

プリンタに拡大・縮小印刷機能がある場合

プリンタに拡大・縮小印刷機能が備わっている場合は、プリンタの機能を使用するのが最も簡単です。ただし、ActiveReportsから、プリンタ(プリンタドライバ)の拡大・縮小設定を変更することはできないため、レポート印刷の度に、手動でプリンタのプロパティから設定を切り替える必要があります。

プリンタに拡大・縮小印刷機能がない場合

ActiveReportsには、生成したレポートを拡大・縮小印刷するための直接的な機能はありません。しかし、PageクラスのDrawメソッドにより、ページの内容を、任意のGraphicsオブジェクト上の指定した座標に、拡大・縮小して出力できます。この機能と.NET Framework標準のPrintDocumentクラスを使用することで、レポートの拡大・縮小印刷を実現することが可能です。これらの処理は、 ActiveReportsおよびFrameworkの機能で行われますので、プリンタ側に拡大・縮小印刷の機能は必要ありません。

注意: この方法では、一度生成済み(Runメソッド実行済み)のレポートを、1ページずつPrintDocumentに描画するため、ページ数が多くなるほど、パフォーマンスが低下します

給紙トレイを変更する

用紙の給紙(カセット)の設定を行うには下記のサンプルコードのように、PaperSourcesプロパティを使用して実現できます。

Visual Basic

Visual Basicコード
コードのコピー
' SectionDocumentクラスの拡張メソッドとして実装されているPrintメソッドを使用するために、
' GrapeCity.ActiveReports名前空間をインポートします。
' また、プロジェクトにGrapeCity.ActiveReports.Viewer.Win.v12への参照を追加する必要があります。
Imports GrapeCity.ActiveReports

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Viewer1.LoadDocument(New SectionReport1()) 
    Dim rpt As New SectionReport1() 
    ' 使用可能な用紙トレイ一覧を参照するコードです。 
    Dim i As Integer 
    For i = 0 To rpt.Document.Printer.PrinterSettings.PaperSources.Count - 1
    Debug.WriteLine(rpt.Document.Printer.PrinterSettings.PaperSources.Item(i)) 
    Next 
    ' 使用可能な用紙トレイ一覧のインデックスが3番目の用紙トレイを設定します。 
    rpt.PageSettings.DefaultPaperSource = False 
    rpt.PageSettings.PaperSource = rpt.Document.Printer.PrinterSettings.PaperSources(2).Kind 
    rpt.Document.Printer.DefaultPageSettings.PaperSource = rpt.Document.Printer.PrinterSettings.PaperSources(2) 
    ' レポートを実行(生成)します。 
    rpt.Run() 
    
    ' レポートを印刷します(ダイアログを表示)。 
    rpt.Document.Print() 
    ' レポートを表示します。 
    Viewer1.Document = rpt.Document 
End Sub                                 

C#

C#コード
コードのコピー
// SectionDocumentクラスの拡張メソッドとして実装されているPrintメソッドを使用するために、
// GrapeCity.ActiveReports名前空間をインポートします。
// また、プロジェクトにGrapeCity.ActiveReports.Viewer.Win.v12への参照を追加する必要があります。
using GrapeCity.ActiveReports;

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    SectionReport1 rpt = new SectionReport1(); 
    // 使用可能な用紙トレイ一覧を参照するコードです。 
    for (int i = 0; i < rpt.Document.Printer.PrinterSettings.PaperSources.Count; i++) 
    {
        Console.Write(rpt.Document.Printer.PrinterSettings.PaperSources[i].SourceName.ToString() + " ");
        Console.WriteLine(rpt.Document.Printer.PrinterSettings.PaperSources[i].Kind.ToString());
    } 
    // 使用可能な用紙トレイ一覧のインデックスが3番目の用紙トレイを設定します。
    rpt.PageSettings.DefaultPaperSource = false; 
    rpt.PageSettings.PaperSource = rpt.Document.Printer.PrinterSettings.PaperSources[2].Kind; 
    rpt.Document.Printer.DefaultPageSettings.PaperSource = rpt.Document.Printer.PrinterSettings.PaperSources[2]; 
    // レポートを実行(生成)します。 
    rpt.Run(); 
    // レポートを印刷します(ダイアログを表示)。 
    rpt.Document.Print(); 
    // レポートを表示します。
    this.viewer1.Document = rpt.Document; 
}                                        

用紙方向を変更する

下記のサンプルコードのように、 Landscapeプロパティを使用して実現できます。この設定は、レポートのReportStartイベントで行うこともできます

Visual Basic

Visual Basicコード
コードのコピー
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim rpt As New SectionReport1 
    ' 用紙方向を設定します。
    rpt.Document.Printer.Landscape = True 
    ' レポートを実行(生成)し、表示します。 
    rpt.Run() 
    Viewer1.Document = rpt.Document 
End Sub

C#

C#コード
コードのコピー
private void Form1_Load(object sender, EventArgs e) 
{ 
    SectionReport1 rpt = new SectionReport1(); 
    // 用紙方向を設定します。 
    rpt.Document.Printer.Landscape = true; 
    // レポートを実行(生成)し、表示します。 
    rpt.Run(); 
    this.viewer1.Document = rpt.Document; 
}

なお、Interop.SystemPrinterクラスを使用して、用紙方向を設定する場合には SystemPrinterクラスの Landscapeプロパティを使用します。

印刷部数を指定する

PrinterSettingsクラスのCopiesプロパティによって、印刷部数を指定できます。

Visual Basic

Visual Basicコード
コードのコピー
' SectionDocumentクラスの拡張メソッドとして実装されているPrintメソッドを使用するために、
' GrapeCity.ActiveReports名前空間をインポートします。
' また、プロジェクトにGrapeCity.ActiveReports.Viewer.Win.v12への参照を追加する必要があります。
Imports GrapeCity.ActiveReports

Dim rpt As New SectionReport1() 
rpt.Run(False)
rpt.Document.Printer.PrinterSettings.Copies = 5 
rpt.Document.Print()

C#

C#コード
コードのコピー
// SectionDocumentクラスの拡張メソッドとして実装されているPrintメソッドを使用するために、
// GrapeCity.ActiveReports名前空間をインポートします。
// また、プロジェクトにGrapeCity.ActiveReports.Viewer.Win.v12への参照を追加する必要があります。
using GrapeCity.ActiveReports;

SectionReport1 rpt = new SectionReport1(); 
rpt.Run(false);
rpt.Document.Printer.PrinterSettings.Copies = 5; 
rpt.Document.Print();

印刷範囲を指定する

ActiveReports for .NETではPrinterクラスを使用する方法を提供しています。 .NETネイティブなアセンブリを使用して処理を実現します。

Document.Printerを使用する方法

下記のサンプルコードのように、FromPageプロパティとToPageプロパティを使用して実現できます。この設定は、レポートのReportStartイベントで行うこともできます。印刷範囲をコードから設定した場合、[印刷]ダイアログで印刷範囲のオプションボタンを「すべて」に変更したとしても、コードで設定した「ページ指定」が有効になります(但し、開始ページと終了ページの指定はダイアログで変更することができます)。

Visual Basic

Visual Basicコード
コードのコピー
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim rpt As New SectionReport1() 
        
    ' レポートを実行(生成)します。
     rpt.Run(False)

    ' 2ページ目と3ページ目を印刷します。 
     rpt.Document.Printer.PrinterSettings.PrintRange = Printing.PrintRange.SomePages 
    rpt.Document.Printer.PrinterSettings.FromPage = 2 
    rpt.Document.Printer.PrinterSettings.ToPage = 3
    '[印刷]ダイアログを表示します。
     rpt.Document.Print(True, True, False)

    ' レポートを表示します。 
     Viewer1.Document = rpt.Document 
End Sub

C#

C#コード
コードのコピー
Form1_Load(System.Object sender, System.EventArgs e)
{
       SectionReport1 rpt = new SectionReport1();
                                                        
       // レポートを実行(生成)します。
       rpt.Run(false); 
                                                        
       // 2ページ目と3ページ目を印刷します。
        rpt.Document.Printer.PrinterSettings.PrintRange = Printing.PrintRange.SomePages;
        rpt.Document.Printer.PrinterSettings.FromPage = 2;
        rpt.Document.Printer.PrinterSettings.ToPage = 3;
        //[印刷]ダイアログを表示します。
        rpt.Document.Print(True, True, False);
        
        // レポートを表示します。 
        Viewer1.Document = rpt.Document;
}

空白ページが出力される

レポートの幅が、レポートの出力領域を越えるような場合、はみ出した部分が印刷時に次のページに印刷され、結果的に白紙のページが出力されることになります。

レポートの出力領域の幅は、用紙の幅(PrinterオブジェクトのPaperWidthプロパティまたはPaperHeightプロパティ)から左右のマージン(PageSettingsオブジェクトのMargins.Left,Margins.Rightプロパティ)および、とじしろ(PageSettingsオブジェクトのGutterプロパティ)を引いた値になります。

従って、レポートの幅(ActiveReportオブジェクトのPrintWidthプロパティ)が、出力領域の幅を超えないようにする、つまり「PageSettings.Margins.Left + PageSettings.Margins.Right + PageSettings.Gutter + PrintWidth <= Document.Printer.PaperWidth(またはDocument.Printer.PaperHeight)」の関係が成り立つように、これらの値を適切に設定してください。

設定方法に関しては、プレビューにある「赤い線が表示される」を参照してください。

用紙サイズやプリンタ設定が正しく反映されない

ActiveReports の印刷処理は、ActiveReportsが直接プリンタを制御している訳ではなく、インタフェースである.NET Frameworkの印刷機能を呼び出しているのみです。その先のデバイスは意識していません。それらのインタフェースに対して出力するデータも、プリンタやプリンタドライバごとに内容が変わるという訳ではなく、同一内容のデータを出力しています。また、連続用紙に対するページ送りのように、特定のプリンタにのみ存在する設定を制御する機能も、特に用意されておりません。そのため、対応プリンタとして、特定機種の動作保証は行っていませんが、基本的にWindowsのプリンタドライバであれば出力可能です。

最終的な印刷結果は、使用するプリンタやプリンタドライバに依存しますので、それらの条件によって印刷結果や動作に差異が生じる可能性がございます。(例:特定のプリンタでのみ、給紙トレイの変更が反映されない)申し訳ございませんが、プリンタの機種に依存して発生する問題を補完するような機能は、ActiveReportsには用意されておりません。

印刷時に何らかの問題が発生する場合は、ご使用のプリンタのプリンタドライバを変更(最新のものに更新)するか、プリンタ側の設定を適宜変更することで解決できる場合もございます。こちらの方法もお試しください。

「プリンタは用紙サイズ ** をサポートしません」というエラーが発生する

実行環境で「プリンタは用紙サイズ ** をサポートしません。PageSettingsでPaperKind.Customを使用するか、プリンタがサポートしている用紙サイズを指定してください。」というエラーが発生します。

ActiveReportsは、レポート生成時や、デザイン画面上で[レポートの設定]ダイアログを表示したときに、その環境のプリンタドライバから用紙サイズ等の情報を取得します。その際に参照されるプリンタは、(特に指定しない限り)その環境上で「通常使うプリンタ」に指定されているものです。たとえば、開発環境と実行環境とで、インストールされているプリンタドライバやその設定が異なる場合や、実行環境上のプリンタでその用紙サイズがサポートされていない場合には、レポート生成時にエラーが発生することがあります。

また、設計時に指定した規定の用紙サイズが実行環境上のプリンタでサポートされていても、規定サイズではなくユーザー定義サイズとしてサポートされていると、同様のエラーが発生します。例えば、.NET Framework標準のPropertyGridコントロールを使用し、下記のコードを実行することで、「通常使うプリンタ」がサポートしている用紙サイズを確認できます。

Visual Basic

Visual Basicコード
コードのコピー
' Form上に"PropertyGrid"コントロールを配置しておきます。 
Dim pd As New System.Drawing.Printing.PrintDocument()
PropertyGrid1.SelectedObject = pd.PrinterSettings 

C#

C#コード
コードのコピー
// Form上に"PropertyGrid"コントロールを配置しておきます。 
System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument()
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つの方法があります。

Visual Basic

Visual Basicコード
コードのコピー
Private Sub SectionReport1_ReportStart() Handles MyBase.ReportStart
    Dim tmpBool As Boolean = False
    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
            .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
                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
                Me.Document.Printer.DefaultPageSettings.PaperSize = Ps
                tmpBool = True
            Exit For
            End If
        Next
    End If
    If tmpBool = False Then
        Me.Document.Printer.PrinterName = ""
        .PaperKind = Drawing.Printing.PaperKind.Custom
        .PaperHeight = tmpHeight
        .PaperWidth = tmpWidth
    End If
        .Orientation = PageOrientation.Portrait
    End With
End Sub

C#

C#コード
コードのコピー
private void SectionReport1_ReportStart(object sender, EventArgs e) 
{ 
    bool tmpBool = false; 
   
    float tmpHeight = SectionReport1.CmToInch(36.4f) * 100; 
    float tmpWidth = SectionReport1.CmToInch(25.7f) * 100; 
    foreach (System.Drawing.Printing.PaperSize Ps _ 
    in this.Document.Printer.PrinterSettings.PaperSizes) 
    {         
        if (Ps.Kind == System.Drawing.Printing.PaperKind.B4) 
        {  
            this.PageSettings.PaperKind = System.Drawing.Printing.PaperKind.B4; 
            tmpBool = true; 
            break; 
        } 
    } 
    if (tmpBool == false) 
    { 
        foreach (System.Drawing.Printing.PaperSize P _
        in this.Document.Printer.PrinterSettings.PaperSizes) 
        { 
            if ((Ps.Height == (int)tmpHeight) && (Ps.Width == (int)tmpWidth)) 
            { 
                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") 
            {  
                this.Document.Printer.DefaultPageSettings.PaperSize = Ps; 
                tmpBool = true; 
                break; 
            } 
        } 
    } 
    if (tmpBool == false) 
    {  
        this.Document.Printer.PrinterName = ""; 
        this.PageSettings.PaperKind=System.Drawing.Printing.PaperKind.Custom; 
        this.PageSettings.PaperHeight = tmpHeight; 
        this.PageSettings.PaperWidth = tmpWidth; 
    } 
    this.PageSettings.Orientation = PageOrientation.Portrait; 
}
関連トピック