C#实现调用打印机(打印字符串、打印绘图、打印图片),还差打印水晶报表

目的:调用打印机的使用

缺陷:打印的对象不全(还差打印水晶报表),不能实现在插件绘图板中画什么打印什么

改进:同缺陷,希望朋友们能提供解决方案,和提供改进方案,请留言谢谢。

C# winfrom

界面(纯功能测试):

主代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Printing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Printer
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

private Font printFont;
        private Font titleFont;
        private StringReader streamToPrint;
        private int leftMargin = 0;

/// <summary>
        /// 设置PrintDocument 的相关属性 调用打印机方法
        /// </summary>
        /// <param name="str">要打印的字符串</param>
        public void print(string str)
        {
            try
            {
                //打印文字
                streamToPrint = new StringReader(str);
                printFont = new Font("宋体", 10);
                titleFont = new Font("宋体", 15);
                System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
                //调用的打印机名
                pd.PrinterSettings.PrinterName = "Hewlett-Packard HP LaserJet Pro MFP M126a";
                pd.DocumentName = pd.PrinterSettings.MaximumCopies.ToString(); 
                pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.pd_PrintPage);
               // pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.MyPrintDocument_PrintPage);
                pd.PrintController = new System.Drawing.Printing.StandardPrintController(); 
                pd.Print();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

/// <summary>
        /// 打印格式(字符串)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="ev"></param>
        private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev)
        {
            float linesPerPage = 0;
            float yPos = 0;
            int count = 0;
            float leftMargin = this.leftMargin;
            float topMargin = 0;
            String line = null;
            linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics);
            while (count < linesPerPage &&
            ((line = streamToPrint.ReadLine()) != null))
            {
                if (count == 0)
                {
                    yPos = topMargin + (count * printFont.GetHeight(ev.Graphics));
                    ev.Graphics.DrawString(line, titleFont, Brushes.Black, leftMargin + 10, yPos, new StringFormat());
                }
                else
                {
                    yPos = topMargin + (count * printFont.GetHeight(ev.Graphics));
                    ev.Graphics.DrawString(line, printFont, Brushes.Black, leftMargin, yPos, new StringFormat());
                }
                count++;
            }
            if (line != null)
                ev.HasMorePages = true;
            else
                ev.HasMorePages = false;

}

private void button1_Click(object sender, EventArgs e)
        {
            //打印报表解决方案一:

string ss = "菜单";
            //调用本地打印机成功:注意的问题的是打印机的名字和打印机的驱动安装
            print("主题\n------------\n被冷冷地:"+ss+"\n-------------\n说到了");

//获取本地打印机的名字
            GetPrintName();
        }

/// <summary>
        /// 获取打印机的名字
        /// </summary>
        private void GetPrintName()
        {
            //获取本地打印机的名字
            PrintDocument print = new PrintDocument();
            string sDefault = print.PrinterSettings.PrinterName;//默认打印机名

label1.Text = sDefault;
            
            foreach (string sPrint in PrinterSettings.InstalledPrinters)//获取所有打印机名称
            {
                listBox1.Items.Add(sPrint);
                textBox1.Text += sPrint + "\n";
                if (sPrint == sDefault)
                    listBox1.SelectedIndex = listBox1.Items.IndexOf(sPrint);

}
        }

private void Form1_Load(object sender, EventArgs e)
        {
            // TODO:  这行代码将数据加载到表“weijiaweiDataSet.xinxibiao”中。您可以根据需要移动或删除它。
           // this.xinxibiaoTableAdapter.Fill(this.weijiaweiDataSet.xinxibiao);

this.reportViewer1.RefreshReport();
            this.reportViewer1.RefreshReport();
        }

private void button2_Click(object sender, EventArgs e)
        {

print2();

}

/// <summary>
        /// 设置PrintDocument 的相关属性
        /// </summary>
        /// <param name="str">要打印的字符串</param>
        public void print2()
        {
            try
            {
               // streamToPrint = new StringReader(str);
                printFont = new Font("宋体", 10);
                titleFont = new Font("宋体", 15);
                System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
                pd.PrinterSettings.PrinterName = "Hewlett-Packard HP LaserJet Pro MFP M126a";
                pd.DocumentName = pd.PrinterSettings.MaximumCopies.ToString();
                //pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.pd_PrintPage);
                pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.MyPrintDocument_PrintPage);
                pd.PrintController = new System.Drawing.Printing.StandardPrintController();
                pd.Print();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

/// <summary>
        /// 打印的格式
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MyPrintDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            /*如果需要改变自己 可以在new Font(new FontFamily("黑体"),11)中的“黑体”改成自己要的字体就行了,黑体 后面的数字代表字体的大小
             System.Drawing.Brushes.Blue , 170, 10 中的 System.Drawing.Brushes.Blue 为颜色,后面的为输出的位置 */
            e.Graphics.DrawString("新乡市三月软件公司入库单", new Font(new FontFamily("黑体"), 11), System.Drawing.Brushes.Black, 170, 10);
            e.Graphics.DrawString("供货商:河南科技学院", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Blue, 10, 12);
            //信息的名称
            e.Graphics.DrawLine(Pens.Black, 8, 30, 480, 30);
            e.Graphics.DrawString("入库单编号", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 9, 35);
            e.Graphics.DrawString("商品名称", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 160, 35);
            e.Graphics.DrawString("数量", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 260, 35);
            e.Graphics.DrawString("单价", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 330, 35);
            e.Graphics.DrawString("总金额", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 400, 35);
            e.Graphics.DrawLine(Pens.Black, 8, 50, 480, 50);
            //产品信息
            e.Graphics.DrawString("R2011-01-2016:06:35", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 9, 55);
            e.Graphics.DrawString("联想A460", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 160, 55);
            e.Graphics.DrawString("100", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 260, 55);
            e.Graphics.DrawString("200.00", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 330, 55);
            e.Graphics.DrawString("20000.00", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 400, 55);

e.Graphics.DrawLine(Pens.Black, 8, 200, 480, 200);
            e.Graphics.DrawString("地址:新乡市河南科技学院信息工程学院", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 9, 210);
            e.Graphics.DrawString("经办人:任忌", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 220, 210);
            e.Graphics.DrawString("服务热线:15083128577", new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 320, 210);
            e.Graphics.DrawString("入库时间:" + DateTime.Now.ToString(), new Font(new FontFamily("黑体"), 8), System.Drawing.Brushes.Black, 9, 230);
        }

private void button3_Click(object sender, EventArgs e)
        {
            // printDocument1 为 打印控件
            //设置打印用的纸张 当设置为Custom的时候,可以自定义纸张的大小,还可以选择A4,A5等常用纸型
            
            //先注释和不注释来看取打印的内容   格式一测试失败

//格式一:
           // this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custom", 500, 300);
            //this.printDocument1.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);

//格式二:
          //  this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custom", 500, 300);
          //  this.printDocument1.PrintPage += new PrintPageEventHandler(this.MyPrintDocument_PrintPage);

//格式:菜单
           // this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custom", 300,500);
           // this.printDocument1.PrintPage += new PrintPageEventHandler(this.Menu);

//打印图片
            this.printDocument1.DefaultPageSettings.PaperSize = new PaperSize("Custom", 300, 500);
            this.printDocument1.PrintPage += new PrintPageEventHandler(this.Image);

//将写好的格式给打印预览控件以便预览
            printPreviewDialog1.Document = printDocument1;

//显示打印预览
            DialogResult result = printPreviewDialog1.ShowDialog();
        }

private void button4_Click(object sender, EventArgs e)
        {
            print3();

}

/// <summary>
        /// 设置PrintDocument 的相关属性
        /// </summary>
        /// <param name="str"></param>
        public void print3()
        {
            try
            {
                /*
                // streamToPrint = new StringReader(str);
                printFont = new Font("宋体", 10);
                titleFont = new Font("宋体", 15);
                System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
                pd.PrinterSettings.PrinterName = "Hewlett-Packard HP LaserJet Pro MFP M126a";
                pd.DocumentName = pd.PrinterSettings.MaximumCopies.ToString();
                //pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.pd_PrintPage);
                pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.Menu);
                pd.PrintController = new System.Drawing.Printing.StandardPrintController();
                pd.Print();
                 
                 */

//新建打印对象
                System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
                //打印机名字
                pd.PrinterSettings.PrinterName = "Hewlett-Packard HP LaserJet Pro MFP M126a";
                //打印文档显示的名字
                pd.DocumentName = "订单";
                //
                //pd.PrinterSettings.MaximumCopies.ToString();

//打印的格式
                pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.Menu);

//
                pd.PrintController = new System.Drawing.Printing.StandardPrintController();

//开始打印
                pd.Print();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

//绘图需要使用的数组 后期可以套用变量list
        public string[] menu = { "菜一", "菜二","中级菜单" };

/// <summary>
        /// 打印的格式:菜单
        /// </summary>
        /// <param name="sender">自定义报表(原理是绘图)</param>
        /// <param name="e"></param>
        private void Menu(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {

//绘制(输出,文字格式(字体,大小),颜色,位置起始位置x,y轴坐标)                 
            e.Graphics.DrawString("店名", new Font(new FontFamily("黑体"), 11), System.Drawing.Brushes.Black, 138, 10);
           
            //打印两个点的坐标(颜色,坐标1,坐标2)
            e.Graphics.DrawLine(Pens.Black, 8, 30, 292, 30);

e.Graphics.DrawString("订单号:()", new Font(new FontFamily("黑体"), 11), System.Drawing.Brushes.Black, 10, 35);

e.Graphics.DrawString("编号", new Font(new FontFamily("黑体"), 11), System.Drawing.Brushes.Black, 10, 55);
            e.Graphics.DrawString("菜名", new Font(new FontFamily("黑体"), 11), System.Drawing.Brushes.Black, 75, 55);
            e.Graphics.DrawString("单价", new Font(new FontFamily("黑体"), 11), System.Drawing.Brushes.Black, 150, 55);
            e.Graphics.DrawString("数量", new Font(new FontFamily("黑体"), 11), System.Drawing.Brushes.Black, 200, 55);

int i = 0;
            //循环输出变量
            foreach (string element in menu)
            {
             
                i=i+20;
                e.Graphics.DrawString(element, new Font(new FontFamily("黑体"), 11), System.Drawing.Brushes.Black, 75, 80+i);

}

e.Graphics.DrawLine(Pens.Black, 8, 200, 292, 200);

}

private void button5_Click(object sender, EventArgs e)
        {
            print4();
        }

public void print4()
        {
            try
            {

//新建打印对象
                System.Drawing.Printing.PrintDocument pd = new System.Drawing.Printing.PrintDocument();
                //打印机名字
                pd.PrinterSettings.PrinterName = "Hewlett-Packard HP LaserJet Pro MFP M126a";
                //打印文档显示的名字
                pd.DocumentName = "订单";
                //
                //pd.PrinterSettings.MaximumCopies.ToString();

//打印的格式
                pd.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.Image);

//
                pd.PrintController = new System.Drawing.Printing.StandardPrintController();

//开始打印
                pd.Print();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

/// <summary>
        /// 打印的格式:图片
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Image(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            //直接调用图片对象绘制
            e.Graphics.DrawImage(pictureBox1.Image, 20, 20);

}

private void button6_Click(object sender, EventArgs e)
        {
            printDocument1.PrintController.OnEndPrint(printDocument1, new System.Drawing.Printing.PrintEventArgs());
        }

}
}

打印出的效果:

图片没有打印

结合实例使用:https://download.csdn.net/download/weixin_42401291/10758685

程序开发(ASP.NET、C#)、网站建设(H5)、小程序、公众号等相关开发联系QQ:1174787689 备注 程序开发合作

C#实现调用打印机(打印字符串、打印绘图、打印图片),还差打印水晶报表相关推荐

  1. WEB打印-网页打印功能(带分页、可多页打印)

    <html> <head> <title>Web打印</title> <meta http-equiv="Content-Type&qu ...

  2. java 打印机_java调用打印机方式二

    一.主类: package org.jeecg.print; import java.awt.BasicStroke; import java.awt.Color; import java.awt.F ...

  3. Win7图片查看器打印不了图片怎么办

    当我们想浏览电脑中的图片文件时,可以选择系统自带的图片查看器或者第三方看图工具打开,但是有些win7用户发现自己想通过windows图片查看器打印图片却没有反应,Win7图片查看器打印不了图片怎么办? ...

  4. 水晶报表制作6*4cm的打印纸标签,预览时数据是一页,打印出来却多了一页空白?

    欢迎来到一块钱的博客!!! 问题描述:水晶报表 预览时数据是一页,打印出来却多了一页空白.如图: 问题情况分析: 尝试1: 用水晶报表工具Crystal Reports2010设置一个(宽)6X4cm ...

  5. java打印字符串显示_JAVA调用系统打印机打印字符串

    用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Graphics2D直接输出 ...

  6. C++ 调用打印机 打印一段文字

    系统:win7 环境:VS2010 语言:c++ 函数:调用打印机打印一段文字. void CpainttestDlg::OnClickedButton1() {// TODO: 在此添加控件通知处理 ...

  7. JS 调用打印机打印网页文档

    引用自:灯火阑珊hy js调用打印机 打印整体或部分 有时前端的项目中需要添加打印的功能,首先要知道打印分为整体打印和局部打印两种,而局部打印又可细分为局部打印指定的部分,和局部打印指定部分之外的部分 ...

  8. android 打印机打印html,Android下通过wifi调用打印机打印

    Android下通过wifi调用打印机打印 // Code in Activity try { Socket sock = new Socket("192.168.199.245" ...

  9. JS调用打印机打印Web页面

    第一种方法:指定不打印区域 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="tex ...

最新文章

  1. AndroidStudio设置自定义代码格式化codestyle
  2. CC2530的串口实验
  3. C语言sopc蜂鸣器按键弹奏中音,基于sopc 蜂鸣器
  4. 用神经网络二分类吸引子与排斥子
  5. win10安装scrapy
  6. python人脸识别环境搭建_怎样用3分钟搭建 Python 人脸识别系统
  7. First Impression on BBED: recover deleted rows
  8. Ubuntu linux上Nautilus安装RabbitVCS扩展
  9. 版权文字:Power by DedeCms 如何去除?
  10. IntelliJ IDEA 开发swing(一)
  11. CS224n(2019):Assignment2 参考答案
  12. 【读书笔记】Head First设计模式-设计模式入门-鸭子会不会飞(1)
  13. 尝试运行项目时出错,无法启动程序 , 由于应用程序配置不正确,未能启动此应用程序。请查看清单文件以查找可能的错误。
  14. 【UE4】WebUI插件实现HTML透明区域事件穿透响应
  15. Ubuntu18.04实装autoware1.14.0(ROS Melodic、QT5.9.5、BagRunning)
  16. 输入输出流,看似复杂却更好用----小话c++(2)
  17. error:LNK2005 已经在*.obj文件中定义的解决办法
  18. 微信小程序对接大华摄像头
  19. codeforces csp复赛训练利器---初识
  20. Oracle索引技术pdf

热门文章

  1. 714. 买卖股票的最佳时机含手续费(CPP)
  2. Unity 回合制战斗系统(高级篇)
  3. JAVA 根据身份证获取年龄
  4. Android之讯飞语音-文字转语音(不用另外安装语音合成包apk)遇到的问题
  5. Stepper Motor > 步进电机控制相关参数缩写
  6. html li 圆点 大小,ul li 定制圆点,list-style-image调整图片圆点大小 与 文字和图片排版...
  7. Exeinfo PE查壳工具
  8. 电脑突然间变卡的解决办法
  9. 中国大学慕课第8周测验
  10. C语言编程>第二十二周 ③ 下列给定的程序中,函数fun的功能是根据整型形参n,计算如下公式的值: