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圖片結果解析度高(漂亮)