レポートの印刷時、印字結果が不正な状態になる、プリンタが正しく動作しないなどの問題が発生する場合があります。
対象製品
ActiveReports for .NET 7.0J
詳細
印刷結果に何らかの異常(乱れ)が発生する場合には、いくつかの原因が考えられます。以下の内容についてご確認ください。
- Printメソッドの引数設定について
- 複数スレッドでの同時印刷について
- Runメソッドの引数設定について
- ユーザー定義サイズのセクションレポートについて
- イベントの実装内容について
- 実行環境のリソースについて
- プリンター名について
- ターミナルサービス環境について
- プリンタードライバーについて
- 実行環境のOSや.NET Framework等について
- Printメソッドの引数設定について
Printメソッドでレポートを印刷している場合には、メソッドの第3引数にFalseを指定した上で、再度動作をお試しください。
Printメソッドの第3引数を、指定なし(またはTrue)で実行している場合、印刷処理が非同期で実行されます。
非同期で実行されている印刷処理が完了する前に、次の印刷処理(Printメソッド)が実行された場合や、印刷処理が中断された場合、プリンタ(スプーラ)に出力されるデータが不正なものになり、結果的に印刷結果の乱れや、全く印刷が行われないなどの問題が発生する可能性があります。 - 複数スレッドでの同時印刷について
過去の事例において、複数スレッドで同時に印刷処理を行なった場合に、処理のタイミングによって印刷結果が乱れる現象が報告されております。
プリンタのような共有リソースに対する処理を行う際、印刷ジョブの開始処理がそれぞれのスレッドで同時に実行されたときに、処理の競合が発生する可能性が考えられます。
Printメソッドによる印刷処理を複数のスレッドで同時に実行する場合には、SyncLockステートメントなどを使用し、印刷処理をロックしてください。
◆サンプルコード(VB.NET)
Imports GrapeCity.ActiveReports
Private Shared ReadOnly syncObject As New Object
Private Sub Button1_Click(...) Handles Button1.Click
Dim rpt As New SectionReport1()
rpt.Run(False)
SyncLock syncObject
rpt.Document.Print(False, False, False)
End SyncLock
End Sub
◆サンプルコード(C#)
using GrapeCity.ActiveReports;
private readonly object lockObject = new object();
private void button1_Click(object sender, EventArgs e)
{
rptSample rpt = new rptSample();
rpt.Run(false);
lock (lockObject)
{
rpt.Document.Print(false, false, false);
}
}
- Runメソッドの引数設定について
セクションレポートの場合、Runメソッドを呼び出すことでレポートの生成処理が実行されます。その時、Runメソッドの引数を"True"に設定している場合は、"False"に設定した上で、再度動作をお試しください。
Runメソッドの引数を"True"に指定して実行した場合、レポートの生成処理が非同期で行われますので、印刷を実行するタイミングによっては、生成処理が完了する前に印刷処理が実行されてしまい、不正な結果になる可能性があります。 - ユーザー定義サイズのセクションレポートについて
用紙サイズを"ユーザー定義サイズ(カスタム用紙サイズ)"に設定したレポートを、同一環境で同時に複数実行した場合、レポートの生成処理や印刷処理が正常に行われない場合があります。
■生成・印刷処理が正しく行われない要因
セクションレポートの場合、製品ヘルプの以下のトピックにある「ユーザー定義サイズ」を適用する方法を用いることで、任意の用紙サイズでレポートを生成・印刷することができます。
ActiveReportsユーザーガイド
- よくある質問
- セクションレポート
- 印刷
- 「用紙サイズ(ユーザー定義のサイズ)を変更する」
この方法で用紙サイズを設定した場合、レポートの実行時に"ARCustomForm"という名前の用紙サイズ情報を、プリンタドライバに動的に登録(削除および追加)します。
そのため、同一環境上でユーザー定義サイズに設定したレポートを同一環境上で同時に複数実行した場合、用紙サイズ「ARCustomForm」の登録処理で競合が生じます。(実行するレポートの用紙サイズが全く同じサイズでも発生します。)その結果、レポートの生成や印刷でエラーが発生したり、意図しない動作になる場合があります。
任意の用紙サイズのレポートを、同一端末上で複数同時に実行・印刷する可能性がある場合には、レポートの用紙サイズを"ユーザー定義サイズ"に設定せず、あらかじめプリンタドライバに登録しておいた用紙サイズを使用するようにしてください。
具体的な方法については、こちらの文書をご覧ください。 - イベントの実装内容について
セクションレポートの場合、ActiveReports のイベントに実装している処理内容が適切でない時、生成結果に問題が生じる場合があります。
セクションレポートにおいて、ActiveReports のイベント内に処理を実装する場合には、いくつかの注意事項が存在します。たとえば、以下のようなものが挙げられます。
- FetchDataイベント内でレポート上のコントロールの値を操作してはいけない
- セクションのイベント内からFieldコレクション内の値を直接参照してはいけない
- セクションのイベント内から別のセクション上のコントロールなどにアクセスしてはいけない
ActiveReportsユーザーガイド
- 概念
- セクションレポートの概念
- セクションレポートのイベント
- よくある質問
- セクションレポート
- イベント - 実行環境のリソースについて
アプリケーションを実行する環境のリソース(メモリやCPUなど)が不足していることや、プリンタースプーラの容量が不足している場合、アプリケーションの動作や印刷動作が不安定になります。
特に、大量ページのレポートを一度に生成・印刷した場合に発生する可能性が高くなります。現象が発生した時、このような状態になっていないかどうかをご確認ください。 - プリンター名について
プリンター名に32文字以上の名称を指定している場合や、2バイト文字を含んでいる場合には、プリンタ名を変更した上で再度動作をお試しください。
Windows APIのDEVMODE構造体のdmDeviceNameメンバの仕様により、デバイス名の長さは、32文字未満に制限されております。この制限を越える長さのデバイス名を設定した場合には、何らかの問題が発生する可能性がございます。
特にネットワークプリンターなどの場合、サーバ名などが付加されることによって32文字以上になってしまう場合がございますので、プリンターのデバイス名をご確認ください。
INFO: Working with Long Printer Names
なお、Windowsフォームアプリケーションにおいて、印刷(参照)先のプリンタを明示的に設定する場合、PrinterNameプロパティを使用します。(PrinterNameプロパティを設定しない場合、印刷先のプリンタは実行環境上の「通常使うプリンタ(デフォルトプリンタ)」になります。)
ただし、セクションレポートの場合、PrinterNameプロパティに空文字(""またはString.Empty)を設定した場合、仮想プリンタの機能を使用することになります。
仮想プリンタの機能を使用した場合、レポートの実行時にプリンタドライバへのアクセスが全く行われません。Windowsフォームアプリケーションで、レポートをプリンタに印刷することを前提としている場合には、仮想プリンタ機能は基本的に使用しないことをおすすめします。
仮想プリンタの詳細については、製品ヘルプの以下のトピックをご覧ください。
ActiveReportsユーザーガイド
- 概念
- セクションレポートの概念
- 仮想プリンタ - ターミナルサービス環境について
過去の事例では、Terminal Server環境やMetaFrame(メタフレーム)環境上でActiveReportsを使用した場合に、印刷動作に何らかの異常が発生するという現象が報告されております。
誠に恐れ入りますが、ActiveReportsを含む弊社製品は、Windows Terminal Server(Service)および Citrix MetaFrame/Presentation Server/XenApp環境での動作を保証しておりません。
その他の環境 - .NET 製品の対応環境 | GrapeCity Developer Tools
動作保証外の環境上で発生する問題については、製品の制限事項とさせていただいております。
なお、プリンターメーカーによっては、MetaFrameやTerminal Service専用のプリンタードライバを提供している場合があります。プリンタードライバを変更することで、問題を解決できる可能性がございます。プリンターメーカーにお問い合わせください。 - プリンタードライバーについて
ActiveReportsの印刷処理は、ActiveReportsが直接プリンターを制御している訳ではなく、インタフェースである.NET Frameworkの印刷機能を呼び出しているのみです。その先のデバイスは意識しておりません。
それらのインタフェースに対して出力するデータも、プリンターやプリンタードライバごとに内容が変わるという訳ではなく、同一内容のデータを出力しています。
しかしながら、最終的な印刷結果は、使用するプリンターやプリンタードライバに依存しますので、それらの条件によって印刷結果や動作に差異が生じる可能性がございます。
申し訳ございませんが、プリンターの機種に依存して発生する問題を補完するような機能は、ActiveReportsには用意されておりません。
印刷時に何らかの問題が発生する場合は、ご使用のプリンターのプリンタードライバを変更(最新のものに更新)するか、プリンター側の設定を適宜変更することで解決できる場合もございます。こちらの方法をお試しください。
また、マイクロソフト社の以下のWebサイトで公開されている情報につきましても、参考までにご覧ください。
印刷スプーラ オプションを設定する
スプール フォルダの場所を変更する
[NT] ページング ファイルおよびスプール ファイルを移動させる
印刷イベントのログを有効または無効にする
印刷のトラブルシューティング
プリンターに関する問題のトラブルシューティング
ネットワーク印刷の問題をトラブルシューティングする方法
[NT] LPR プリンタでのデータ化けおよびデータ抜けについて
スプールされる順番と印刷される順番が異なる - 実行環境のOSや.NET Framework等について
前述の通り、ActiveReportsの印刷処理は.NET Frameworkに依存します。そのため、印刷処理を行っている環境のOSや.NET Framework側で問題が発生している場合、その影響を受ける可能性があります。
◇参考事例
印刷設定が反映されない問題(Microsoftセキュリティ更新プログラム[MS12-025]に関する弊社.NET製品の影響)について
GDI のセキュリティ更新プログラム 925902 をインストールした後に印刷を実行するとエラー メッセージ "Stop 0x0000007F" が表示される
OSや.NET Frameworkなどについて、サービスパックや修正パッチなどが最新の状態に更新されているか、ご確認ください。
もし、これらが最新の状態でない場合、Microsoft Updateやマイクロソフト社のWebサイトで公開されている情報をご利用いただき、最新の状態に更新した上で、再度動作をご確認ください。
関連情報
キーワード
問題 印刷・プレビュー