質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

2955閲覧

System.Drawing.Printing.PrinterSettingsのCreateMeasurementGraphicsより取得できる印刷サイズ(pixel単位)が印刷時と異なる。

naitou

総合スコア141

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/12/03 01:57

印刷前に印刷サイズ(pixel単位)を取得したいが、うまく取得できない。

System.Drawing.Printing.PrintDocumentクラスを用いた印刷処理で、System.Drawing.Printing.PrinterSettingsクラスのCreateMeasurementGraphicsより取得したGraphicsの印刷サイズ(pixel単位)(VisibleClipBoundsメンバから取得)が印刷実行時と異なる。

下記コードでGetPrintSizeByMeasurementGraphicsメソッドと
GetPrintSizeWhenPrintメソッドが同じ値を返すことを期待するが、
CreateMeasurementGraphicsを用いた方の値がおかしい。

実際に印刷してキャンセルするというGetPrintSizeWhenPrintの方法では
正しく取得できるが、この方法だと実際に印刷を実行してしまっている為、
システムの印刷ダイアログが出てしまったり、
Microsoft Print to PDFのようなファイル保存デバイスの場合は
ファイル保存ダイアログが出てしまったりする問題がある。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Drawing.Printing; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace PrintTest { 13 static class Program { 14 15 [STAThread] 16 static void Main() { 17 foreach (string s in System.Drawing.Printing.PrinterSettings.InstalledPrinters){ 18 Console.WriteLine(s); 19 var size1 = GetPrintSizeByMeasurementGraphics(PaperKind.A4,false,s); 20 var size2 = GetPrintSizeByMeasurementGraphics(PaperKind.A3,false,s); 21 var size3 = GetPrintSizeByMeasurementGraphics(PaperKind.A4,true ,s); 22 var size4 = GetPrintSizeByMeasurementGraphics(PaperKind.A3,true ,s); 23 var size5 = GetPrintSizeWhenPrint( PaperKind.A4,false,s); 24 var size6 = GetPrintSizeWhenPrint( PaperKind.A3,false,s); 25 var size7 = GetPrintSizeWhenPrint( PaperKind.A4,true ,s); 26 var size8 = GetPrintSizeWhenPrint( PaperKind.A3,true ,s); 27 Console.WriteLine("GetPrintSizeByMeasurementGraphics A4 縦 w:"+size1.Width +" h:"+ size1.Height); 28 Console.WriteLine("GetPrintSizeByMeasurementGraphics A3 縦 w:"+size2.Width +" h:"+ size2.Height); 29 Console.WriteLine("GetPrintSizeByMeasurementGraphics A4 横 w:"+size3.Width +" h:"+ size3.Height); 30 Console.WriteLine("GetPrintSizeByMeasurementGraphics A3 横 w:"+size4.Width +" h:"+ size4.Height); 31 Console.WriteLine("GetPrintSizeWhenPrint A4 縦 w:"+size5.Width +" h:"+ size5.Height); 32 Console.WriteLine("GetPrintSizeWhenPrint A3 縦 w:"+size6.Width +" h:"+ size6.Height); 33 Console.WriteLine("GetPrintSizeWhenPrint A4 横 w:"+size7.Width +" h:"+ size7.Height); 34 Console.WriteLine("GetPrintSizeWhenPrint A3 横 w:"+size8.Width +" h:"+ size8.Height); 35 Console.WriteLine(); 36 } 37 System.Threading.Thread.Sleep(1000*60); 38 } 39 40 public static Size GetPrintSizeByMeasurementGraphics( PaperKind paperKind , Boolean landscape ,String printerName ){ 41 using ( var pd = new PrintDocument()){ 42 if( printerName != "" ){ 43 pd.PrinterSettings.PrinterName = printerName; 44 } 45 pd.PrintController = new StandardPrintController();//「印刷中...」ダイアログを表示しないようにする 46 47 foreach( PaperSize psz in pd.PrinterSettings.PaperSizes ){ 48 if( psz.Kind == paperKind ){ 49 pd.DefaultPageSettings.PaperSize = psz; 50 break; 51 } 52 } 53 54 pd.DefaultPageSettings.Landscape = landscape; 55 pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); 56 57 Int32 width = 0; 58 Int32 height = 0; 59 using( Graphics g = pd.DefaultPageSettings.PrinterSettings.CreateMeasurementGraphics()){ 60 g.PageUnit = GraphicsUnit.Pixel; 61 width = (Int32)(g.VisibleClipBounds.Width); 62 height = (Int32)(g.VisibleClipBounds.Height); 63 } 64 return new Size(width,height); 65 } 66 } 67 public static Size GetPrintSizeWhenPrint( PaperKind paperKind , Boolean landscape ,String printerName ){ 68 using ( var pd = new PrintDocument()){ 69 if( printerName != "" ){ 70 pd.PrinterSettings.PrinterName = printerName; 71 } 72 pd.PrintController = new StandardPrintController();//「印刷中...」ダイアログを表示しないようにする 73 74 foreach( PaperSize psz in pd.PrinterSettings.PaperSizes ){ 75 if( psz.Kind == paperKind ){ 76 pd.DefaultPageSettings.PaperSize = psz; 77 break; 78 } 79 } 80 81 pd.DefaultPageSettings.Landscape = landscape; 82 pd.DefaultPageSettings.Margins = new Margins(0, 0, 0, 0); 83 84 Int32 width = 0; 85 Int32 height = 0; 86 pd.PrintPage += (sender,e)=>{ 87 e.Graphics.PageUnit = GraphicsUnit.Pixel; 88 width = (Int32)(e.Graphics.VisibleClipBounds.Width); 89 height = (Int32)(e.Graphics.VisibleClipBounds.Height); 90 e.Cancel = true; 91 }; 92 pd.Print(); 93 return new Size(width,height); 94 } 95 } 96 } 97} 98

実行結果

Send To OneNote 2013
GetPrintSizeByMeasurementGraphics A4 縦 w:4676 h:6814
GetPrintSizeByMeasurementGraphics A3 縦 w:4676 h:6814
GetPrintSizeByMeasurementGraphics A4 横 w:4676 h:6814
GetPrintSizeByMeasurementGraphics A3 横 w:4676 h:6814
GetPrintSizeWhenPrint A4 縦 w:4676 h:6814
GetPrintSizeWhenPrint A3 縦 w:6730 h:9720
GetPrintSizeWhenPrint A4 横 w:6778 h:4760
GetPrintSizeWhenPrint A3 横 w:9684 h:6814

OneNote for Windows 10
GetPrintSizeByMeasurementGraphics A4 縦 w:2480 h:3508
GetPrintSizeByMeasurementGraphics A3 縦 w:2480 h:3508
GetPrintSizeByMeasurementGraphics A4 横 w:2480 h:3508
GetPrintSizeByMeasurementGraphics A3 横 w:2480 h:3508
GetPrintSizeWhenPrint A4 縦 w:2480 h:3508
GetPrintSizeWhenPrint A3 縦 w:2480 h:3508
GetPrintSizeWhenPrint A4 横 w:3508 h:2480
GetPrintSizeWhenPrint A3 横 w:3508 h:2480

Microsoft XPS Document Writer
GetPrintSizeByMeasurementGraphics A4 縦 w:4961 h:7016
GetPrintSizeByMeasurementGraphics A3 縦 w:4961 h:7016
GetPrintSizeByMeasurementGraphics A4 横 w:4961 h:7016
GetPrintSizeByMeasurementGraphics A3 横 w:4961 h:7016
GetPrintSizeWhenPrint A4 縦 w:3496 h:4961
GetPrintSizeWhenPrint A3 縦 w:7016 h:9921
GetPrintSizeWhenPrint A4 横 w:4961 h:3496
GetPrintSizeWhenPrint A3 横 w:9921 h:7016

Microsoft Print to PDF
GetPrintSizeByMeasurementGraphics A4 縦 w:4961 h:7016
GetPrintSizeByMeasurementGraphics A3 縦 w:4961 h:7016
GetPrintSizeByMeasurementGraphics A4 横 w:4961 h:7016
GetPrintSizeByMeasurementGraphics A3 横 w:4961 h:7016
GetPrintSizeWhenPrint A4 縦 w:3496 h:4961
GetPrintSizeWhenPrint A3 縦 w:7016 h:9921
GetPrintSizeWhenPrint A4 横 w:4961 h:3496
GetPrintSizeWhenPrint A3 横 w:9921 h:7016

Fax
GetPrintSizeByMeasurementGraphics A4 縦 w:1654 h:2339
GetPrintSizeByMeasurementGraphics A3 縦 w:1654 h:2339
GetPrintSizeByMeasurementGraphics A4 横 w:1654 h:2339
GetPrintSizeByMeasurementGraphics A3 横 w:1654 h:2339
GetPrintSizeWhenPrint A4 縦 w:1165 h:1654
GetPrintSizeWhenPrint A3 縦 w:1654 h:2339
GetPrintSizeWhenPrint A4 横 w:1654 h:1165
GetPrintSizeWhenPrint A3 横 w:2339 h:1654

プリンタ(C7788)
GetPrintSizeByMeasurementGraphics A4 縦 w:4767 h:6822
GetPrintSizeByMeasurementGraphics A3 縦 w:4767 h:6822
GetPrintSizeByMeasurementGraphics A4 横 w:4767 h:6822
GetPrintSizeByMeasurementGraphics A3 横 w:4767 h:6822
GetPrintSizeWhenPrint A4 縦 w:3302 h:4767
GetPrintSizeWhenPrint A3 縦 w:6822 h:9728
GetPrintSizeWhenPrint A4 横 w:4767 h:3302
GetPrintSizeWhenPrint A3 横 w:9728 h:6822

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

4.8のソースコードを読みましたがPrinterSettingsクラスのCreateMeasurementGraphics()は、
自クラスメンバのDefaultPageSettingsの情報を使ってGraphicsを生成する様です。

一方印刷時は、PrintDocumentが自クラスメンバのDefaultPageSettings使って
Graphicsを生成する様です。

ややこしいのですが、クラスのメンバ所有関係としては下記の様になっており、
2つのDefaultPageSettingsは別ものであり、CreateMeasurementGraphicsを利用する場合と
印刷する場合で使い分ける必要がありました。
PrintDocument→PrinterSettings→DefaultPageSettings
PrintDocument→DefaultPageSettings

これを踏まえてソースコードを下記の様に変えたところ、正常に動作する様になりました。
pd.DefaultPageSettings.PaperSize = psz;

pd.PrinterSettings.DefaultPageSettings.PaperSize = psz;

pd.DefaultPageSettings.Landscape = landscape;

pd.PrinterSettings.DefaultPageSettings.Landscape = landscape;

using( Graphics g = pd.DefaultPageSettings.PrinterSettings.CreateMeasurementGraphics()){

using( Graphics g = pd.PrinterSettings.CreateMeasurementGraphics()){

投稿2020/12/03 04:08

naitou

総合スコア141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問