質問内容
C#でテキストファイルをPrintPreviewDialogを使用して印刷するプログラムを組もうとしました。
色々なサイトを回って参考にしながら一旦完成したのですが、プレビュー画面にはテキストファイルの内容が複数ページで正常に表示されているのに、印刷ボタンを押して印刷(今回はPDFに出力)したところ、何も出力されず真っ白な画面1枚分しか出てきませんでした。
該当のソースコード
C#
1public partial class Form1 : Form 2{ 3 const string FilePath = @"C:\DATA\Temp\TestFile.txt"; 4 const decimal Inch = (decimal)25.4; 5 6 int PageMarginTop; 7 int PageMarginBottm; 8 int PageMarginLeft; 9 int PageBottomPositionY; 10 int TextHight; 11 int TextMarginTop; 12 int TextMarginBottom; 13 14 Encoding ShiftJis = Encoding.GetEncoding(932); 15 16 StreamReader sr; 17 18 Font DefFont = new Font("MS ゴシック", 9); 19 Brush DefBrush = new SolidBrush(Color.Black); 20 21 public Form1() 22 { 23 InitializeComponent(); 24 25 PageMarginTop = MmToInch(15); //上余白15mm 26 PageMarginBottm = MmToInch(15); //下余白15mm 27 PageMarginLeft = MmToInch(15); //左余白15mm 28 PageBottomPositionY = MmToInch(297) - PageMarginBottm; //印刷範囲外となるY座標 29 TextHight = MmToInch(5); //テキストの高さ5mm 30 TextMarginTop = MmToInch((decimal)0.5); //テキスト上の余白0.5mm 31 TextMarginBottom = MmToInch((decimal)0.5); //テキスト下の余白0.5mm 32 } 33 34 private void button1_Click(object sender, EventArgs e) 35 { 36 PrintDocument PrtDoc = new PrintDocument(); 37 foreach (PaperSize ps in PrtDoc.PrinterSettings.PaperSizes) 38 { 39 if (ps.Kind == PaperKind.A4) 40 { 41 PrtDoc.DefaultPageSettings.PaperSize = ps; 42 break; 43 } 44 } 45 46 PrtDoc.DefaultPageSettings.Landscape = false; 47 sr = new StreamReader(FilePath, ShiftJis); 48 49 PrtDoc.PrintPage += new PrintPageEventHandler(DocWtr); 50 51 PrintPreviewDialog ppd = new PrintPreviewDialog(); 52 ppd.Document = PrtDoc; 53 ppd.PrintPreviewControl.Zoom = 0.75; 54 ppd.ShowDialog(); 55 56 sr.Close(); 57 } 58 59 private void DocWtr(object sender, PrintPageEventArgs e) 60 { 61 int NowPositionY = PageMarginTop; 62 while (sr.Peek() >= 0) 63 { 64 string rec = sr.ReadLine(); 65 66 e.Graphics.DrawString(rec, DefFont, DefBrush, new PointF(PageMarginLeft, NowPositionY + TextMarginTop)); 67 NowPositionY = NowPositionY + TextMarginTop + TextHight + TextMarginBottom; 68 69 if (NowPositionY >= PageBottomPositionY) 70 { 71 e.HasMorePages = true; 72 break; 73 } 74 else 75 { 76 e.HasMorePages = false; 77 } 78 } 79 } 80 81 int MmToInch(decimal Mm) 82 { 83 decimal a = (Mm / Inch); 84 int b = (int)(a * 100); 85 86 return b; 87 } 88}
テスト用に使用したテキストファイルは別口で以下の記述で100行分作りました。
C#
1const string FilePath = @"C:\DATA\Temp\TestFile.txt"; 2 3if(!File.Exists(FilePath)) 4{ 5 StreamWriter sw = File.CreateText(FilePath); 6 sw.Close(); 7} 8 9using(StreamWriter sw = new StreamWriter(FilePath,false,ShiftJis)) 10{ 11 for (int i = 0; i < 100; i++) 12 sw.WriteLine($"テストデータ:{i:000}"); 13}
試したこと
上記のPrintPreviewDialogを使用した部分(51行目~54行目)をPageSetupDialogやPrintDialogに変更して試しに動かしたところ、どちらも正常にPDFに出力されました。
C#
1//ページ設定ダイアログ 2PageSetupDialog psd = new PageSetupDialog(); 3psd.Document = PrtDoc; 4if (psd.ShowDialog() == DialogResult.OK) 5 PrtDoc.Print(); 6 7//プリンター選択ダイアログ 8PrintDialog pd = new PrintDialog(); 9pd.Document = PrtDoc; 10if (pd.ShowDialog() == DialogResult.OK) 11 PrtDoc.Print();
補足情報(FW/ツールのバージョンなど)
・Visual Studio Community 2022 (64 ビット)
・.Net Framework 4.8

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/03/29 13:25
2025/03/29 14:13