C# 使用 printdocument 進行列印 前 先將列印結果先存成BMP 等待printdocument 輸出到印表機之後 再將之前的BMP也輸出到印表機
C# 使用 printdocument 進行列印 前 先將列印結果先存成BMP 等待printdocument 輸出到印表機之後 再將之前的BMP也輸出到印表機
資料來源:chatgpt
code
using System; using System.Drawing; using System.Drawing.Printing; using System.IO; //C# 8.0 要用NuGet裝 ~ System.Drawing.Common public class PrintHelper { private PrintDocument printDoc; private Bitmap bmp; private string bmpPath = "printResult.bmp"; // BMP檔案儲存位置 private string textToPrint = "這是直接列印的內容!"; public PrintHelper(string printerName) { printDoc = new PrintDocument(); // 指定印表機 printDoc.PrinterSettings.PrinterName = printerName; // 設定印表機解析度(例如:300 DPI) printDoc.PrinterSettings.DefaultPageSettings.PrinterResolution = new PrinterResolution() { X = 300, Y = 300 }; // 設置列印事件 printDoc.PrintPage += new PrintPageEventHandler(PrintPage); } // 這是我們用來觸發列印的函式 public void Print(bool printFromImage) { if (printFromImage) { // 先將列印結果渲染到 BMP SaveToBitmap(); // 列印 BMP 圖片 printDoc.Print(); } else { // 直接列印文字 printDoc.Print(); } } // 這是列印過程 private void PrintPage(object sender, PrintPageEventArgs e) { if (bmp != null) { // 從 BMP 檔案讀取圖片 using (Image img = Image.FromFile(bmpPath)) { // 根據原始圖片尺寸,直接將圖片列印到頁面 e.Graphics.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); } } else { // 直接列印文字 Font font = new Font("Arial", 20); e.Graphics.DrawString(textToPrint, font, Brushes.Black, 10, 100); } // 如果需要繼續列印,設置 e.HasMorePages 為 true e.HasMorePages = false; } // 先將列印結果保存為 BMP private void SaveToBitmap() { // 設定解析度為 300 DPI int dpi = 500; int width = (int)(850 * dpi / 72); // A4 width at 300 DPI int height = (int)(1100 * dpi / 72); // A4 height at 300 DPI bmp = new Bitmap(width, height); // 使用高解析度繪製圖片 using (Graphics g = Graphics.FromImage(bmp)) { g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; // 繪製文字 Font font = new Font("Arial", 20); g.DrawString(textToPrint, font, Brushes.Black, 10, 100); // 儲存 BMP 檔案 bmp.Save(bmpPath); } } } class Program { static void Main(string[] args) { // 顯示所有可用的印表機名稱 Console.WriteLine("可用的印表機列表:"); foreach (var printer in PrinterSettings.InstalledPrinters) { Console.WriteLine(printer); } // 假設你選擇了某個印表機,這裡使用 "Your Printer Name" string printerName = "80mm Series Printer"; // 替換成實際的印表機名稱 PrintHelper printHelper = new PrintHelper(printerName); // 讓使用者選擇列印方式:從圖片列印或直接列印文字 Console.WriteLine("選擇列印方式:"); Console.WriteLine("1. 直接列印文字"); Console.WriteLine("2. 從圖片列印"); string choice = Console.ReadLine(); if (choice == "1") { // 直接列印文字 printHelper.Print(false); } else if (choice == "2") { // 從圖片列印 printHelper.Print(true); } else { Console.WriteLine("無效選擇!"); } } }
心得: 在熱敏印標機直接列印還是比BMP圖片結果解析度高(漂亮)