印刷前に印刷サイズ(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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。