// 添加Panel控件到窗体 (panelPreview)
private void GeneratePreview()
{
    panelPreview.Paint += (sender, e) =>
    {
        Graphics g = e.Graphics;
        g.Clear(Color.White);
        g.SmoothingMode = SmoothingMode.AntiAlias;
        // 1. 绘制文字
        using (Font font = new Font("微软雅黑", 10))
        {
            g.DrawString("产品标签", font, Brushes.Black, new PointF(20, 20));
        }
        // 2. 绘制图片
        Image logo = Image.FromFile("logo.png");
        g.DrawImage(logo, new Rectangle(20, 50, 100, 50));
        // 3. 绘制线条
        using (Pen pen = new Pen(Color.Black, 1))
        {
            g.DrawLine(pen, 20, 110, 200, 110);
        }
        // 4. 绘制一维码 (需安装BarcodeLib)
        Barcode barcode = new Barcode();
        Image barcodeImg = barcode.Encode(BarcodeLib.TYPE.CODE128, "123456");
        g.DrawImage(barcodeImg, 20, 130);
        // 5. 绘制二维码 (需安装ZXing.Net)
        var writer = new BarcodeWriterPixelData
        {
            Format = BarcodeFormat.QR_CODE,
            Options = new EncodingOptions { Height = 100, Width = 100 }
        };
        var pixelData = writer.Write("https://example.com");
        using (Bitmap qrImg = new Bitmap(pixelData.Width, pixelData.Height, PixelFormat.Format32bppRgb))
        {
            BitmapData bmData = qrImg.LockBits(new Rectangle(0, 0, qrImg.Width, qrImg.Height), ImageLockMode.WriteOnly, qrImg.PixelFormat);
            Marshal.Copy(pixelData.Pixels, 0, bmData.Scan0, pixelData.Pixels.Length);
            qrImg.UnlockBits(bmData);
            g.DrawImage(qrImg, 150, 130);
        }
    };
    panelPreview.Invalidate(); // 触发重绘
}
// 打印按钮事件
private void btnPrint_Click(object sender, EventArgs e)
{
    PrintDocument pd = new PrintDocument();
    pd.PrintPage += (s, args) =>
    {
        // 创建与打印机分辨率匹配的Bitmap
        Bitmap bmp = new Bitmap(panelPreview.Width, panelPreview.Height);
        panelPreview.DrawToBitmap(bmp, panelPreview.ClientRectangle);
        args.Graphics.DrawImage(bmp, args.MarginBounds);
    };
    
    PrintPreviewDialog preview = new PrintPreviewDialog();
    preview.Document = pd;
    preview.ShowDialog();
}