通用打印

这里的打印采用graphic去画出来,所以,可以根据不同的要求随意的设计模板。同时可以通过图片的形式加载模板。代码如下,此实例参考了网上的一些文章,具体的文字位置不是很准,只做演示:

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void btnPrint_Click(object sender, EventArgs e)

        {

            //打印预览

            PrintPreviewDialog printPreview = new PrintPreviewDialog();

            PrintDocument printDocument = new PrintDocument();

            //设置边距

            Margins margin = new Margins(20, 20, 20, 20);

            printDocument.DefaultPageSettings.Margins = margin;

 

            //纸张设置默认

            PaperSize paperSize = new PaperSize("First custom Size", 800, 600);

            printDocument.DefaultPageSettings.PaperSize = paperSize;

 

            //打印事件设置

            printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage);

            printPreview.Document = printDocument;

            printPreview.ShowDialog();

 

            try

            {

                printDocument.Print();

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.Message, "打印出错", MessageBoxButtons.OK, MessageBoxIcon.Error);

                printDocument.PrintController.OnEndPrint(printDocument, new PrintEventArgs());

            }

        }

 

        void printDocument_PrintPage(object sender, PrintPageEventArgs e)

        {

            string date = DateTime.Now.Date.ToShortDateString();//当前日期

            string flowID = "20110308";//流水号

            string payDate = DateTime.Now.Date.ToShortDateString();//应收日期

            string adminID = "12345678";//操作员编号

            string baseExpense = "2000";//应交基本费用

            string fine = "500";//应交罚款数目

            string upExpense = "5000";//上月结余

            string actualExpense = "2500";//实际应交数目

 

            //读取图片模板

            Image temp = Image.FromFile(@"3dbg.jpg");

            GetResultIntoImage(ref temp, flowID, date, baseExpense, fine, upExpense, actualExpense, payDate);

            int x = e.MarginBounds.X;

            int y = e.MarginBounds.Y;

            int width = temp.Width;

            int height = temp.Height;

            Rectangle destRect = new Rectangle(x, y, width, height);

            e.Graphics.DrawImage(temp, destRect, 0, 0, temp.Width, temp.Height, System.Drawing.GraphicsUnit.Pixel);

        }

 

        /// <summary>

        /// 将收费结果填充到图片模板

        /// </summary>

        private void GetResultIntoImage(

            ref Image temp,

            string flowId,

            string currentDate,

            string baseExpense,

            string fine,

            string upExpense,

            string actualExpense,

            string payDate)

        {

            //读取图片模板

            Graphics g = Graphics.FromImage(temp);

 

            Font f = new Font("宋体", 12);

            Brush b = new SolidBrush(Color.Black);

           

            //填充数据到图片模板位置(要在制作图模板的时候度量好)

            g.DrawImage(temp, 0, 0, temp.Width, temp.Height);

            g.DrawString(flowId, f, b, 335, 105);

            g.DrawString(currentDate, f, b, 335, 134);

            g.DrawString(baseExpense, f, b, 19, 202);

            g.DrawString(fine, f, b, 172, 202);

            g.DrawString(upExpense, f, b, 286, 202);

            g.DrawString(actualExpense, f, b, 396, 202);

            g.DrawString(payDate, f, b, 176, 269);

 

            g.Dispose();

        }

    }

 

 即使是更加复杂的打印,也可以采用同样的道理打出来,只需要校准好位置即可。为了演示,文中的字段值都是直接简单赋值,当然可以采用从输入设备中读取的值。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,要了解通用打印驱动的基本原理。通用打印驱动是作为操作系统和打印机之间的接口,将操作系统中的打印请求转化为打印机可以理解的命令,并将这些命令发送到打印机上。因此,通用打印驱动需要实现以下功能: 1. 初始化打印机 2. 解析打印请求 3. 将打印请求转化为打印机可以理解的命令序列 4. 将命令序列发送到打印机上 下面是一个简单的通用打印驱动的代码示例: ```c #include <stdio.h> // 定义打印机类型 enum PrinterType { DOT_MATRIX, // 点阵打印机 INKJET, // 喷墨打印机 LASER, // 激光打印机 }; // 定义打印请求结构体 struct PrintRequest { char *data; // 打印数据 int length; // 数据长度 }; // 初始化打印机 int initPrinter(enum PrinterType type) { // 这里可以根据不同的打印机类型进行初始化 return 0; } // 解析打印请求 void parsePrintRequest(struct PrintRequest request) { // 这里可以根据打印请求的格式进行解析 } // 将打印请求转化为命令序列 void generateCommandSequence(struct PrintRequest request, char *commandSeq) { // 这里可以根据打印请求的内容生成相应的命令序列 } // 发送命令序列到打印机 void sendCommandSequence(char *commandSeq, int length) { // 这里可以将命令序列发送到打印机上 } // 打印函数 void print(struct PrintRequest request, enum PrinterType type) { initPrinter(type); // 初始化打印机 parsePrintRequest(request); // 解析打印请求 char commandSeq[1024]; generateCommandSequence(request, commandSeq); // 生成命令序列 sendCommandSequence(commandSeq, sizeof(commandSeq)); // 发送命令序列到打印机 } int main() { struct PrintRequest request = { "Hello, world!\n", 14 }; print(request, INKJET); return 0; } ``` 以上代码仅作为示例,实际的通用打印驱动需要根据具体的需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值