- PR -

用紙上の座標を指定して印刷した場合の計算式について

1
投稿者投稿内容
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-27 18:38
例えば、あるサイズの用紙上に○×○枚配置されたラベルに対して印刷を行おうと思った場合、各ラベルの左上座標を取得しなければなりません。
そして、左上座標を得るためには、ラベルの正確な高さと幅のサイズを取得する必要があります。

指定する値は、上下左右の各余白のサイズと、○×○枚という値です。
この場合、各引数の関係は次のようになるかと思います。

ラベル高 = ((用紙縦サイズ - (上余白 + 下余白)) / 縦ラベル数)
ラベル幅 = ((用紙横サイズ - (左余白 + 右余白)) / 横ラベル数)

この計算を実現するには、どのようなプロパティを使えば良いのかわからなくなっております。
用紙サイズ、上下左右の余白を指定することで、実際に印刷できるエリアを取得するには、どのような方法を使えば良いのでしょうか?
実際に印刷しているのですが、どうしてもズレが生じてしまいます。

上下左右には、PrintDocument.DefaultPageSettings.Margins によって1/100インチで指定しております。

この状態で、実際に印刷できる範囲を取得するには、単純に PrintableArea や Boundsプロパティを参照しただけではダメなのでしょうか?


[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-05-27 18:51 ]
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2006-05-27 19:19
NAL-6295です。

計算式を複雑にしなくても、

最初の1枚目のラベルの用紙に対するTopとLeftを計測して、
横のラベルのLeftを計測して、
下のラベルのTopを計測すれば、
最初の1枚目のラベルとの差が計測できるので、
それを利用すれば、
最初の1枚目のラベルの印刷開始位置をスタートにして
等間隔に印刷できませんか?

もし、意味を取り違えていたら申し訳ありません。
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-27 19:30
引用:

NAL-6295さんの書き込み (2006-05-27 19:19) より:

最初の1枚目のラベルの用紙に対するTopとLeftを計測して、
横のラベルのLeftを計測して、
下のラベルのTopを計測すれば、
最初の1枚目のラベルとの差が計測できるので、
それを利用すれば、
最初の1枚目のラベルの印刷開始位置をスタートにして
等間隔に印刷できませんか?


ありがとうございます。
僕もそうしたいのですが、用紙タイプは変わる恐れがあるので、余白と縦横ラベル数で何とかしたいのです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-27 22:30
引用:

R・田中一郎さんの書き込み (2006-05-27 18:38) より:

例えば、あるサイズの用紙上に○×○枚配置されたラベルに対して印刷を行おうと思っ
た場合、各ラベルの左上座標を取得しなければなりません。


まず、"○×○枚配置された" がよくわからないのですが...

引用:

そして、左上座標を得るためには、ラベルの正確な高さと幅のサイズを取得する必要があります。


正確には取得できませんので、この時点で不可能な仕様です。

引用:

用紙タイプは変わる恐れがあるので、余白と縦横ラベル数で何とかしたいのです。


と仰っていますが、「プリンタ ドライバが変わる恐れ」は考えていないのでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-28 09:15
引用:

じゃんぬねっとさんの書き込み (2006-05-27 22:30) より:

まず、"○×○枚配置された" がよくわからないのですが...


すみません。わかりにくかったですね。
2列5行で10枚のラベルという意味です。

引用:

じゃんぬねっとさんの書き込み (2006-05-27 22:30) より:

正確には取得できませんので、この時点で不可能な仕様です。


僕の考えている仕様としては、次のようになります。

与えるパラメーターは、余白(上)・余白(下)・余白(左)・余白(右)、ラベル列数・ラベル行数です。
これは設定ファイルのようなものを用意してユーザーに編集してもらおうと思っています。

プリンタードライバの変更に関しては、ある程度の誤差を実値を見ながら余白にて調整しようと思っています。

実際に印刷した結果で全体的に2ミリ右にズレが生じている場合は、左の余白−2ミリ、右の余白+2ミリとして調整します。

例えば、ラベルの間に数ミリのマージンがある場合と、ラベルがぴったりくっついている場合もありますが、例えば、5ミリのマージンなら、右の余白を5ミリ削れば良いだろうと考えています。

引用:

じゃんぬねっとさんの書き込み (2006-05-27 22:30) より:

と仰っていますが、「プリンタ ドライバが変わる恐れ」は考えていないのでしょうか?


プリンタドライバからは、デッドスペースの情報が得られるかな?、と思っていますが実際どうなんでしょうか?
VB6で、このような場合は、次のコードを書いていました。

コード:
dim 紙幅 as long: 紙幅 = Printer.Width
dim 紙高 as long: 紙高 = Printer.Height
dim 印刷可能幅 as long: 印刷可能幅 = Printer.ScaleWidth
dim 印刷可能高 as long: 印刷可能高 = Printer.ScaleHeight



以上から、後は計算すれば全て算出できるので・・・
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-05-28 11:18
印刷域を得るには、次のようにすれば良かったみたいです。
但し、Margin プロパティに予め値を入れておくということと、その値はデッドスペース以上の値でなければいけないという前提付きです。

コード:

/// <summary>上下左右余白を取り除いた実際に印刷できるサイズを取得する</summary>
/// <returns>印刷できるサイズ</returns>
private Size PrintAreaGet() {
	PageSettings ps = this.printDocument.DefaultPageSettings;
	int pw = ps.PaperSize.Width;
	int ph = ps.PaperSize.Height;
	int mw = ps.Margins.Left + ps.Margins.Right;
	int mh = ps.Margins.Top + ps.Margins.Bottom;

	if (ps.Landscape) {
		int t = pw; ←ここ!!
		pw = ph;
		ph = t;
	}
	return new Size(pw - mw, ph - mh);
}



ちなみに、「ここ!!」の部分ですが、値の入れ替えって、もっと簡単な方法はないんですかね?
1

スキルアップ/キャリアアップ(JOB@IT)