C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

PrintPreviewControl の表示方法について

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■83211 / inTopicNo.1)  PrintPreviewControl の表示方法について
  
□投稿者/ 夜叉丸 (45回)-(2017/03/13(Mon) 10:12:55)

分類:[.NET 全般] 

EPSON TM-m10 で印刷をするのに
PrintDocument(pdoc)
PrintPreviewControl(ppc)
を使用してプレビューを表示しています。

用紙サイズは
A4 210x297 mm
LT 8.5x11 in
ハガキ 100x148 mm
RollPaper 58x297 mm

が存在し、RollPaper 58x297 mm を使用します。
pdoc の PrintPage で描画を行った時に表示領域のみ
印刷を行って、カットされますが、

ppc 上では 297mm分の縦長の表示がそのまま行われています。
実際に印刷されて排出される長さの分で表示したいのですが
どうすればよいのでしょうか?
引用返信 編集キー/
■83239 / inTopicNo.2)  Re[1]: PrintPreviewControl の表示方法について
□投稿者/ 魔界の仮面弁士 (1184回)-(2017/03/14(Tue) 13:53:36)
No83211 (夜叉丸 さん) に返信
> PrintDocument(pdoc)
> PrintPreviewControl(ppc)
> を使用してプレビューを表示しています。

OriginAtMargins を true にすると余白の扱いが変化すると思いますが
それでも吸収しきれないでしょうか。

どうしても合わないようなれば、printDocument1.PrintController.IsPreview で
条件分岐して描画位置を調整してみるのは如何でしょう。
引用返信 編集キー/
■83240 / inTopicNo.3)  Re[1]: PrintPreviewControl の表示方法について
□投稿者/ shu (975回)-(2017/03/14(Tue) 14:21:19)
No83211 (夜叉丸 さん) に返信

> が存在し、RollPaper 58x297 mm を使用します。
pdocに対しRollPaperを使用する設定はどのように行っていますか?
引用返信 編集キー/
■83243 / inTopicNo.4)  Re[2]: PrintPreviewControl の表示方法について
□投稿者/ 夜叉丸 (47回)-(2017/03/14(Tue) 16:56:13)
No83240 (shu さん) に返信

> pdocに対しRollPaperを使用する設定はどのように行っていますか?

A4, LT, ハガキの設定値は読み込めますが、プリンター自体10cmの立方体なので
給紙することはできませんし、設定しなくてもRollに印刷できてました。
その後とりあえず、以下のコードを呼び出し、戻り値も True を確認しています。

pdoc.SetPaperSize("Roll Paper 58 x 297 mm");
引用返信 編集キー/
■83245 / inTopicNo.5)  Re[2]: PrintPreviewControl の表示方法について
□投稿者/ 夜叉丸 (48回)-(2017/03/14(Tue) 17:31:25)
No83239 (魔界の仮面弁士 さん) に返信

> OriginAtMargins を true にすると余白の扱いが変化すると思いますが
> それでも吸収しきれないでしょうか。
>
OriginAtMargins を trueにしてみましたが何も変化がないように思います。

> どうしても合わないようなれば、printDocument1.PrintController.IsPreview で
> 条件分岐して描画位置を調整してみるのは如何でしょう。

描画位置ではなくて、PrintPreviewControl で表示されている用紙のサイズが
58x297 mm (縦長)になっています。
プレビュー画面に58x100の範囲で描画すると、100の位置で自動でカットされます。
実際に印刷されるのが 58x100だったとしても表示が58x297の縦長で表示されるのを
プレビュー画面の用紙サイズを58x100のサイズで表示したいのです。
pdoc.PrinterSettings.PaperSizesのなかに
「ユーザ定義」に関する設定が選択できるのであればできそうな気もするのですが、
このプリンターにはありませんでした。


引用返信 編集キー/
■83246 / inTopicNo.6)  Re[3]: PrintPreviewControl の表示方法について
□投稿者/ shu (976回)-(2017/03/14(Tue) 17:59:48)
No83243 (夜叉丸 さん) に返信

PrintDocumentにそのメソッドが見当たらないのですが、記述は正しいでしょうか?
https://msdn.microsoft.com/ja-jp/library/system.drawing.printing.printdocument(v=vs.110).aspx

花ちゃんのサイトのサンプルです。
http://hanatyan.sakura.ne.jp/dotnet/Prt08.htm
引用返信 編集キー/
■83247 / inTopicNo.7)  Re[3]: PrintPreviewControl の表示方法について
□投稿者/ 魔界の仮面弁士 (1185回)-(2017/03/14(Tue) 19:30:33)
No83245 (夜叉丸 さん) に返信
> OriginAtMargins を trueにしてみましたが何も変化がないように思います。

あれ。余白サイズや用紙サイズが変わるわけでは無いですが、
e.Graphics.ResetTransform() しないかぎり、
原点座標がずれたままになったような…。

そもそも、pdoc.DefaultPageSettings.Margins や
QueryPageSettings イベントの e.PageSettings.Margins では
余白サイズを幾つに指定しているのでしょうか。


> 実際に印刷されるのが 58x100だったとしても表示が58x297の縦長で表示されるのを
> プレビュー画面の用紙サイズを58x100のサイズで表示したいのです。

pdoc.DefaultPageSettings.PaperSize = new PaperSize("任意の名前", 228, 394);
ppc.InvalidatePreview();

ということではなく?


> このプリンターにはありませんでした。
コントロールパネルの[デバイスとプリンター]あたりを参照していると思いますが、
用紙設定を追加するのは、『プリンターのプロパティ』ダイアログではなく、
『プリント サーバーのプロパティ』ダイアログの方ですよ。
http://www.nsgd.co.jp/nsd/NSDGoods/mswin_tl/TA12DK5/W8_Cp4.JPG

コントロールパネルで用紙名を事前定義しているのなら、new PaperSize せずとも
TM-m10 なら PaperSizes の一覧で返されます。どちらが良いのかはケースバイケースですが。



No83243 (夜叉丸 さん) に返信
> A4, LT, ハガキの設定値は読み込めますが、プリンター自体10cmの立方体なので
> 給紙することはできませんし、設定しなくてもRollに印刷できてました。

その点については、ドライバ設定次第ですね。

デフォルトでは、用紙サイズ "Roll Paper 58 x 297 mm" が既定の用紙として設定されているはず。
プリンタードライバーの[レイアウト]-[詳細設定]ボタンあたりで確認できるかと。


> その後とりあえず、以下のコードを呼び出し、戻り値も True を確認しています。
> pdoc.SetPaperSize("Roll Paper 58 x 297 mm");

"SetPaperSize" という名前のメソッドは、PrintDocument どころか
.NET Framework の他のクラスにも見当たらないですね。

https://referencesource.microsoft.com/#q=SetPaperSize
https://social.msdn.microsoft.com/Search/ja-JP?query=SetPaperSize


もしかして拡張メソッドでしょうか?

using System.Drawing.Printing;
using System.Linq;

public static class PrintDocumentExtensions
{
 public static bool SetPaperSize(this PrintDocument pdoc, string paperName)
 {
  PaperSize p = pdoc.PrinterSettings.PaperSizes.OfType<PaperSize>().FirstOrDefault(_ => _.PaperName == paperName);
  if (p != null)
  {
   pdoc.DefaultPageSettings.PaperSize = p;
   return p == pdoc.DefaultPageSettings.PaperSize;
  }
  return false;
 }
}
引用返信 編集キー/
■83326 / inTopicNo.8)  Re[4]: PrintPreviewControl の表示方法について
□投稿者/ 夜叉丸 (49回)-(2017/03/17(Fri) 11:50:40)
No83247 (魔界の仮面弁士 さん) に返信

>
> 余白サイズを幾つに指定しているのでしょうか。

印刷可能領域を最大にしたいので
pdoc.DefaultPageSettings.Margins.Left = (int)(pdoc.DefaultPageSettings.HardMarginX);
pdoc.DefaultPageSettings.Margins.Right = (int)(pdoc.DefaultPageSettings.HardMarginX);
pdoc.DefaultPageSettings.Margins.Top = (int)(pdoc.DefaultPageSettings.HardMarginY);
pdoc.DefaultPageSettings.Margins.Bottom = (int)(pdoc.DefaultPageSettings.HardMarginY);
としています。

>
> pdoc.DefaultPageSettings.PaperSize = new PaperSize("任意の名前", 228, 394);
> ppc.InvalidatePreview();
>
> ということではなく?

すみませんでした。new して使用できるとは思いませんでした。
インターネットで調べたのですが、
pdoc.PrinterSettings.PaperSizes にあるものしか設定できないと


pdoc_PrintPage で印字した部分を MakePrint 関数にして、
印刷に必要なたてサイズを取得して、からpodc_PrintPage を呼び出すようにしました。
で、いいのかな?

ただ、プログラム上では155mmで印刷されるはずなのですが
現状では140mmぐらいで印刷されています。

この辺がうまくいきません。

それから、プレビュー画面ではもちろん正常なのですが
DrawLine と DrawString を同じ左位置を設定しているはずなのに
同じ位置から印字されません。DrawLineの方が1mm右にずれている感じです。
印字に合わせるとプレビューがおかしくなるし
どうすればよいのかわかりません。







引用返信 編集キー/
■83334 / inTopicNo.9)  Re[5]: PrintPreviewControl の表示方法について
□投稿者/ 魔界の仮面弁士 (1198回)-(2017/03/17(Fri) 12:29:24)
No83326 (夜叉丸 さん) に返信
>>余白サイズを幾つに指定しているのでしょうか。
> 印刷可能領域を最大にしたいので
> pdoc.DefaultPageSettings.Margins.Left = (int)(pdoc.DefaultPageSettings.HardMarginX);
> pdoc.DefaultPageSettings.Margins.Right = (int)(pdoc.DefaultPageSettings.HardMarginX);
> pdoc.DefaultPageSettings.Margins.Top = (int)(pdoc.DefaultPageSettings.HardMarginY);
> pdoc.DefaultPageSettings.Margins.Bottom = (int)(pdoc.DefaultPageSettings.HardMarginY);
> としています。

上記は具体的に、どのような値になっていますか?

プレビューのデフォルトマージンは 1 インチに設定されているはずです。
(この値は、Margins クラスの既定値です)

正しいハードマージンが取得できてないためにずれているのか、
それともマージン指定は正しいのに、プレビューの表示がずれるのか
問題点を切り分けてみて下さい。


> すみませんでした。new して使用できるとは思いませんでした。
> pdoc.PrinterSettings.PaperSizes にあるものしか設定できないと
new して設定するプリンターもありますが、既存の用紙からしか選べないものもあります。
このあたりはプリンタードライバーによって異なることなので、
実際に環境に合わせて調整する必要があります。
OS 側で設定した用紙サイズにしても、それがプリンタードライバー側に
反映されるかどうかはまちまちですし。


> それから、プレビュー画面ではもちろん正常なのですが
> DrawLine と DrawString を同じ左位置を設定しているはずなのに
文字の印刷は、プロポーショナルフォントでしょうか。等幅のものでしょうか。


> 同じ位置から印字されません。DrawLineの方が1mm右にずれている感じです。
実機は持っていないので、印字結果については情報を持ち合わせていません。
質問を受けてドライバーをダウンロードしてみただけなので…済みません。

ちなみに、Graphics クラスの原点座標は、プレビュー画面上のどの位置にある状態なのでしょうか?
引用返信 編集キー/
■83335 / inTopicNo.10)  Re[5]: PrintPreviewControl の表示方法について
□投稿者/ shu (977回)-(2017/03/17(Fri) 12:36:57)
No83326 (夜叉丸 さん) に返信

> それから、プレビュー画面ではもちろん正常なのですが
> DrawLine と DrawString を同じ左位置を設定しているはずなのに
> 同じ位置から印字されません。DrawLineの方が1mm右にずれている感じです。
> 印字に合わせるとプレビューがおかしくなるし
> どうすればよいのかわかりません。
>
全体の印字位置が変わるのではなく線と文字列の描画で相対的位置がプレビュー、印字
でずれてしまうということでしょうか?
DrawLine, DrawStringはどのような引数指定で描画されていますか?
引用返信 編集キー/
■83341 / inTopicNo.11)  Re[4]: PrintPreviewControl の表示
□投稿者/ 夜叉丸 (50回)-(2017/03/17(Fri) 13:39:38)
2017/03/17(Fri) 14:01:00 編集(投稿者)
2017/03/17(Fri) 14:00:06 編集(投稿者)
2017/03/17(Fri) 13:59:20 編集(投稿者)
2017/03/17(Fri) 13:58:20 編集(投稿者)
2017/03/17(Fri) 13:41:39 編集(投稿者)

e.Graphics.PageUnit = GraphicsUnit.Inch;
を指定しています。

ハードマージンの値は
this.DefaultPageSettings.HardMarginX = 9;
this.DefaultPageSettings.HardMarginY = 0;
です。

int iw = pdoc.DefaultPageSettings.PaperSize.Width - pdoc.DefaultPageSettings.Margins.Left - pdoc.DefaultPageSettings.Margins.Right;
int ih = pdoc.DefaultPageSettings.PaperSize.Height - pdoc.DefaultPageSettings.Margins.Top - pdoc.DefaultPageSettings.Margins.Bottom;

float xpos = (float)pdoc.DefaultPageSettings.Margins.Left * 58f / (float)pdoc.DefaultPageSettings.PaperSize.Width;
float ypos = (float)pdoc.DefaultPageSettings.Margins.Top * 297f / (float)pdoc.DefaultPageSettings.PaperSize.Height;
float wlen = (float)iw * 58f / (float)pdoc.DefaultPageSettings.PaperSize.Width;
float hlen = (float)ih * 297f / (float)pdoc.DefaultPageSettings.PaperSize.Height;

あとは、指定時にミリで指定したかったので位置情報は以下で求めました。
(float)milli / 25.4f

で、試行錯誤の結果
印字するときの位置をいかにしてみました。
いい札物を見たところ、見た目これでいけてるみたいなんですけど。

横位置 (float)milli / 25.4f - ((this.PrintController.IsPreview) ? 0.0f : this.DefaultPageSettings.HardMarginX * 0.01f)
縦位置 (float)milli / 25.4f - ((this.PrintController.IsPreview) ? 0.0f : this.DefaultPageSettings.HardMarginY * 0.01f);

これでいいのでしょうか?

あと、問題なのは
求めた高さが140mm なので
PaperSize("特殊", 228, 140f / 297f * 1169f);
としたのですが、プレビュー画面の下側に余白が余っています。


 本来(理想)      現状
のプレビュー      のプレビュー
┌───┐       ┌───┐
│┌─┐│       │┌─┐│
│└─┘│       │└─┘│
└───┘       │     │←下側に隙間が多い
                └───┘


印刷結果
┌───┐
│     │←送り出し部分なので仕方がない?
│┌─┐│
│└─┘│
└───┘
     





引用返信 編集キー/
■83342 / inTopicNo.12)  Re[5]: PrintPreviewControl の表示
□投稿者/ 魔界の仮面弁士 (1201回)-(2017/03/17(Fri) 16:37:06)
No83341 (夜叉丸 さん) に返信
> 求めた高さが140mm なので
> PaperSize("特殊", 228, 140f / 297f * 1169f);

PaperSize の引数は int 型のはず。
float 値を渡したらコンパイルエラーになりませんか?


高さを mm から算出するのであれば、正しい計算式は
 PaperSize("特殊", 228, (140 * 1000) / 254)
です。※254ミリメートルはジャスト10インチ。

元式にある 297f という値は、A4 サイズ(210mm × 297mm)から
持ってきたのだと思いますが、提示頂いた計算式を使った場合、
141mm や 142mm を指定した際に、僅かに短くなってしまいます。


印刷処理についても、他に mm → inch 変換している箇所があるようなら、
もう一度見直してみた方が良いかもしれません。
引用返信 編集キー/
■83447 / inTopicNo.13)  Re[6]: PrintPreviewControl の表示
□投稿者/ 夜叉丸 (51回)-(2017/03/24(Fri) 10:01:31)
No83342 (魔界の仮面弁士 さん) に返信

> 元式にある 297f という値は、A4 サイズ(210mm × 297mm)から
> 持ってきたのだと思いますが、提示頂いた計算式を使った場合、
> 141mm や 142mm を指定した際に、僅かに短くなってしまいます。

ロールペーパーのサイズがもともと 58mm(228)×297mm(1169) になっていました。
PaperSizeの再設定(特殊)をしないとこのサイズでプレビューされるので
実際の印刷と同じように表示したい→New で変更が可能

PrintPage の中身を(データにより印字高さが変更される)そのまま
private int MakePrint(PrintPageEventArgs e=nll) 関数にして
プレビュー前に一度呼出して、印字される高さを取得します。

この値が140mm として取得した場合の PaperSize の設定です。
実際の印刷物とプレビューを同じにしたいのが目的で、
実際は上部に空白部(オートカットの送りの部分?)が存在しますが、
プレビューでは全くない(余白が0だから?)状態になっているのです。

印刷時と、プレビューで PrintPage の描画位置を変えないといけないのでしょうか?
プレビューで表示されてるのは用紙なのでしょうか?それとも印刷可能領域なのでしょうか?


引用返信 編集キー/
■83454 / inTopicNo.14)  Re[7]: PrintPreviewControl の表示
□投稿者/ 魔界の仮面弁士 (1212回)-(2017/03/24(Fri) 11:24:31)
No83447 (夜叉丸 さん) に返信
> 実際は上部に空白部(オートカットの送りの部分?)が存在しますが、
> プレビューでは全くない(余白が0だから?)状態になっているのです。

ほとんどのレシートプリンターや連続帳票プリンターは、上下余白部を 0 にできますが、
カッティングの際には多くの場合、追加の余白が必要となります。
(中には、印刷後に余白部を切り落とすタイプのプリンターもあります)

ラインプリンター/連続帳票プリンターでは、印刷開始位置の微調整が
行えるものが多いですが、レシートプリンターではそのような機能が
装備されていないことも多いです。
印刷開始位置の調整機能があるかどうかは、メーカーにお尋ね下さい。


> 印刷時と、プレビューで PrintPage の描画位置を変えないといけないのでしょうか?

必ず必要になるとも限らないのですが、プリンターによっては、
プレビューと実印刷でズレが生じるケースがあります。

プレビューか印刷かの判断は、BeginPrint もしくは QueryPageSettings の
e.PrintAction で判定できますので、実環境にあわせて個別調整してみてください。

市販の葉書印刷ソフトなどでも、印字位置の微調整機能が設けられているケースを
目にしますので、実環境に応じて調整できるように作りこんでおくのが宜しいかと。


なお、今回の件以外でも、下記のような理由でプレビューと実印刷とで
出力内容を切り替えるような要件がありますが、そのようなケースでも
PrintAction プロパティでの判定が役に立つかと思います。

・発送伝票に印刷する際、実印刷では宛名のみ印刷だが、プレビューでは罫線や項目名も出力する
・契約前の利用者に対しては、実印刷時に「試用版」の文字を背景に出力する
引用返信 編集キー/
■83581 / inTopicNo.15)  Re[8]: PrintPreviewControl の表示
□投稿者/ 夜叉丸 (52回)-(2017/03/29(Wed) 17:58:52)
ありがとうございました。

完璧ではありませんが、それなりに近いプレビューを
作ることができました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ