C# 使用 printdocument 進行列印 前 先將列印結果先存成BMP 等待printdocument 輸出到印表機之後 再將之前的BMP也輸出到印表機

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

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *