zoukankan      html  css  js  c++  java
  • C# GDI 绘图打印

    用了很久的水晶报表,最近经常遇到客户电脑上无法安装水晶报表,只能重装系统解决。决定用最原始的 GDI 绘图来打印报表。

    using MySql.Data.MySqlClient;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Printing;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyDocument d = new MyDocument();
                //d.DefaultPageSettings.PrinterSettings.PrinterName = "GP-L80160 Series";//设置打印机
                //Console.WriteLine(d.DefaultPageSettings.PrintableArea.Width);//可以获得打印机的默认纸张宽度
                //d.DefaultPageSettings.Landscape = true; 横向纵向控制
                d.DefaultPageSettings.PaperSize = GetSize("MyPaper", 100, 500);
                if (true)
                {
                    d.Preview();//调用扩展方法
                }
                else
                {
                    d.Print();
                }
                Console.ReadLine();
            }
    
            //宽高为毫米
            static PaperSize GetSize(string name, float width, float height)
            {
                float mul = 3.937f;//GDI 打印尺寸为百分之一英寸,需要对毫米进行转换
                return new PaperSize(name, (int)Math.Floor(width * mul), (int)Math.Floor(height * mul));
            }
        }
    
        public class MyDocument : PrintDocument
        {
            //与 Print_PrintPage 相关的变量需要在 MyDocument_BeginPrint 中初始化。
            //仅在构造函数中初始化是不够的。在反复调用 PrintDocument 的 Print 方法时 pageIndex 的值会出错。
            int pageIndex;
            public MyDocument()
            {
                this.BeginPrint += MyDocument_BeginPrint;
                this.PrintPage += Print_PrintPage;
            }
    
            private void MyDocument_BeginPrint(object sender, PrintEventArgs e)
            {
                pageIndex = 0;
            }
    
            private void Print_PrintPage(object sender, PrintPageEventArgs e)
            {
                string text = "abcdefghijklmn";
                Font f = new Font("宋体", 10);
                StringFormat sf = new StringFormat()
                {
                    Alignment = StringAlignment.Center,
                    LineAlignment = StringAlignment.Center,
                    FormatFlags = StringFormatFlags.NoWrap
                };
                //测量字符串,可以指定宽度和是否换行, 默认是允许换行的
                SizeF size = e.Graphics.MeasureString(text, f, 100, sf);
                float x, y;
                x = y = 10;
                //在实际绘制文本时使用的文本,字体等样式必须与测量时一致,并使用测量得到的尺寸
                e.Graphics.DrawString(text, f, Brushes.Black, new RectangleF(x, y, size.Width, size.Height), sf);
                //绘制线条
                e.Graphics.DrawLine(Pens.Black, 0, 0, 200, 200);
                if (pageIndex == 0)
                {
                    pageIndex++;
                    e.HasMorePages = true;
                }
            }
        }
    
        public static class PrintDocumentExtension
        {
            public static void Preview(this PrintDocument document)
            {
                PrintPreviewDialog ppd = new PrintPreviewDialog();
                ppd.Document = document;
                (ppd as Form).WindowState = FormWindowState.Maximized;
                ppd.ShowDialog();
            }
        }
    }
  • 相关阅读:
    js中给一个元素添加事件
    asp.net客户端回调
    (转)web元素之input (javascript)功能
    在wcf中使用基于证书的授权和保护
    (转)IE与FireFox的js和css几处不同点
    IE&FF兼容性问题
    solaris UFS文件系统 要点
    perl命令行 代替 各种shell 一则
    nginx中的验证模块
    漂亮的正则,素数查找
  • 原文地址:https://www.cnblogs.com/aitong/p/13408732.html
Copyright © 2011-2022 走看看