none
C#窗口程序怎么控制打印纸张的长短还有打印的格式 RRS feed

  • 问题

  • 客户要求做个财务系统,打印机是针织打印机双联的,但是打印出来的长短必须控制不能一下打的太长,而且打印还给了我个表格希望按照那样的 我不太会控制,有高手解答下么
    2012年4月13日 4:00

答案

  • Hi 错觉,

    我新建了一个winform,添加了一个comboBox comboInstalledPrinters用来枚举打印机,添加了一个打印按钮buttonPrint

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Graphics g = e.Graphics; #region 画界面 Pen p = new System.Drawing.Pen(Color.Black, 1); g.DrawRectangle(p, 100, 35, 630, 230); //横线 g.DrawLine(p, 100, 75, 730, 75); g.DrawLine(p, 100, 105, 730, 105); g.DrawLine(p, 100, 135, 730, 135); g.DrawLine(p, 100, 165, 730, 165); g.DrawLine(p, 100, 195, 730, 195); g.DrawLine(p, 100, 225, 730, 225); //竖线 g.DrawLine(p, 170, 75, 170, 225); g.DrawLine(p, 240, 75, 240, 225); g.DrawLine(p, 310, 75, 310, 225); g.DrawLine(p, 380, 75, 380, 225); g.DrawLine(p, 450, 75, 450, 225); g.DrawLine(p, 520, 75, 520, 225); g.DrawLine(p, 590, 75, 590, 225); g.DrawLine(p, 660, 75, 660, 225); //头部 string riqi = DateTime.Now.ToString("yyyy年MM月dd日"); g.DrawString(riqi, Font, new SolidBrush(Color.Black), 110, 55); g.DrawString("大连艾莱雅婚纱摄影结算单收据", Font, new SolidBrush(Color.Black), 240, 55); g.DrawString("NO.001", Font, new SolidBrush(Color.Black), 450, 55); //标题 g.DrawString("姓 名", Font, new SolidBrush(Color.Black), 110, 85); g.DrawString("编 号", Font, new SolidBrush(Color.Black), 180, 85); g.DrawString("套系金额", Font, new SolidBrush(Color.Black), 250, 85); g.DrawString("定 金", Font, new SolidBrush(Color.Black), 320, 85); g.DrawString("尾 款", Font, new SolidBrush(Color.Black), 390, 85); g.DrawString("小 计", Font, new SolidBrush(Color.Black), 460, 85); g.DrawString("门 市", Font, new SolidBrush(Color.Black), 530, 85); g.DrawString("摄 影 师", Font, new SolidBrush(Color.Black), 600, 85); g.DrawString("化 妆 师", Font, new SolidBrush(Color.Black), 670, 85); //尾部 g.DrawString("总 金 额:", Font, new SolidBrush(Color.Black), 110, 240); g.DrawString("客户签字:", Font, new SolidBrush(Color.Black), 310, 240); #endregion } PrinterSettings printSetting = new PrinterSettings(); private void Form1_Load(object sender, EventArgs e) {

    //初始化枚举打印机

    try { for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++) { string pkInstalledPrinters; pkInstalledPrinters = PrinterSettings.InstalledPrinters[i]; comboInstalledPrinters.Items.Add(pkInstalledPrinters); } comboInstalledPrinters.Text = printSetting.DefaultPageSettings.PrinterSettings.PrinterName; printSetting.PrinterName = comboInstalledPrinters.Text; } catch { } printSetting.FromPage =1; printSetting.ToPage =1; } private void buttonPrint_Click(object sender, EventArgs e) { PageSettings ps = new PageSettings(); ps.Margins = new Margins(25, 0, 5, 5); printDocument1.DefaultPageSettings = ps; printDocument1.Print(); }

    打印部分直接用了你提供的代码,下面是打印结果.xps文件

    你可以结合实际情况用程序填写数据,批量打印,注意分页就好了。

    希望我的回答对你有帮助。打印窗体那个我个人不推荐啊,后台处理就好了,我先给你提供这个代码用吧,那个等我仔细看看啊。。。

    Allen


    Allen PPL


    • 已编辑 Allen PPL 2012年4月15日 2:28
    • 已标记为答案 错觉 2012年4月15日 3:01
    2012年4月15日 2:27

全部回复

  • Hi eacsoft,

    我提供的解决方案是把所有要打印的内容画在一张“图片”里,然后打印出来。这个图片的大小总是一定的。

    public void DrawContent(int page,string content,PrintPageEventArgs e)
            {
                e.Graphics.DrawString(....);
             }

    这个需要你自己讲要打印的内容分页。。。


    Allen PPL

    2012年4月13日 4:42
  • 那怎么打印图片呢,不会打印图片也用A4的大小了把
    2012年4月13日 5:01
  • Hi 错觉,

    我确实没有打印过非标准纸张,但我认为这个不是关键啊!

    public void DrawContent(int page,string content,PrintPageEventArgs e)
            {

                //开始绘制内容

                //这个可以参考http://msdn.microsoft.com/zh-cn/library/system.drawing.graphics_members(v=vs.80).aspx

    //跟画图是一样的  你自己用程序控制来是否该换页了

                e.Graphics.DrawString(....);

             }

    绘制完了调用 printDocument1.Print();打印出来

    希望对你有帮助。


    Allen PPL


    • 已编辑 Allen PPL 2012年4月13日 5:21 给错链接了
    2012年4月13日 5:19
  • 我现在绘制在窗体上了,我在想怎么让打印机打印窗体
    2012年4月13日 7:53
  • Hi 错觉,

    这里有个打印窗体的实例

    http://blog.csdn.net/liuweihuhao/article/details/5812690

    希望对你有帮助。

    Allen


    Allen PPL

    2012年4月13日 8:38
  • 我按照那个做了 只是修改了下图像 我看了他是保存图片里打印图片 关键我写好这方法了 打出来还是白纸  private void CaptureScreen()
            {
                Graphics g = this.CreateGraphics();
                memoryImage = new Bitmap(847, 328, g);
                Graphics memoryGraphics = Graphics.FromImage(memoryImage);
                #region 画界面
                  Pen p = new System.Drawing.Pen(Color.Black, 1);
                g.DrawRectangle(p, 100,35, 630, 230);
                //横线
                g.DrawLine(p, 100, 75, 730, 75);
                g.DrawLine(p, 100, 105, 730, 105);
                g.DrawLine(p, 100, 135, 730, 135);
                g.DrawLine(p, 100, 165, 730, 165);
                g.DrawLine(p, 100, 195, 730, 195);
                g.DrawLine(p, 100, 225, 730, 225);
                //竖线
                g.DrawLine(p, 170, 75, 170, 225);
                g.DrawLine(p, 240, 75, 240, 225);
                g.DrawLine(p, 310, 75, 310, 225);
                g.DrawLine(p, 380, 75, 380, 225);
                g.DrawLine(p, 450, 75, 450, 225);
                g.DrawLine(p, 520, 75, 520, 225);
                g.DrawLine(p, 590, 75, 590, 225);
                g.DrawLine(p, 660, 75, 660, 225);
                //头部
                string riqi= DateTime.Now.ToString("yyyy年MM月dd日");            
                g.DrawString(riqi,Font,new SolidBrush(Color.Black),110,55);
                g.DrawString("大连艾莱雅婚纱摄影结算单收据", Font, new SolidBrush(Color.Black), 240, 55);           
                g.DrawString("NO.001", Font, new SolidBrush(Color.Black), 450, 55);
                //标题
                g.DrawString("姓    名", Font, new SolidBrush(Color.Black), 110, 85);
                g.DrawString("编    号", Font, new SolidBrush(Color.Black), 180, 85);
                g.DrawString("套系金额", Font, new SolidBrush(Color.Black), 250, 85);
                g.DrawString("定    金", Font, new SolidBrush(Color.Black), 320, 85);
                g.DrawString("尾    款", Font, new SolidBrush(Color.Black), 390, 85);
                g.DrawString("小    计", Font, new SolidBrush(Color.Black), 460, 85);
                g.DrawString("门    市", Font, new SolidBrush(Color.Black), 530, 85);
                g.DrawString("摄 影 师", Font, new SolidBrush(Color.Black), 600, 85);
                g.DrawString("化 妆 师", Font, new SolidBrush(Color.Black), 670, 85);
                //尾部
                g.DrawString("总 金 额:", Font, new SolidBrush(Color.Black), 110, 240);
                g.DrawString("客户签字:", Font, new SolidBrush(Color.Black), 310, 240);
                #endregion
               
            } 
    2012年4月15日 1:47
  • Hi 错觉,

    我新建了一个winform,添加了一个comboBox comboInstalledPrinters用来枚举打印机,添加了一个打印按钮buttonPrint

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Graphics g = e.Graphics; #region 画界面 Pen p = new System.Drawing.Pen(Color.Black, 1); g.DrawRectangle(p, 100, 35, 630, 230); //横线 g.DrawLine(p, 100, 75, 730, 75); g.DrawLine(p, 100, 105, 730, 105); g.DrawLine(p, 100, 135, 730, 135); g.DrawLine(p, 100, 165, 730, 165); g.DrawLine(p, 100, 195, 730, 195); g.DrawLine(p, 100, 225, 730, 225); //竖线 g.DrawLine(p, 170, 75, 170, 225); g.DrawLine(p, 240, 75, 240, 225); g.DrawLine(p, 310, 75, 310, 225); g.DrawLine(p, 380, 75, 380, 225); g.DrawLine(p, 450, 75, 450, 225); g.DrawLine(p, 520, 75, 520, 225); g.DrawLine(p, 590, 75, 590, 225); g.DrawLine(p, 660, 75, 660, 225); //头部 string riqi = DateTime.Now.ToString("yyyy年MM月dd日"); g.DrawString(riqi, Font, new SolidBrush(Color.Black), 110, 55); g.DrawString("大连艾莱雅婚纱摄影结算单收据", Font, new SolidBrush(Color.Black), 240, 55); g.DrawString("NO.001", Font, new SolidBrush(Color.Black), 450, 55); //标题 g.DrawString("姓 名", Font, new SolidBrush(Color.Black), 110, 85); g.DrawString("编 号", Font, new SolidBrush(Color.Black), 180, 85); g.DrawString("套系金额", Font, new SolidBrush(Color.Black), 250, 85); g.DrawString("定 金", Font, new SolidBrush(Color.Black), 320, 85); g.DrawString("尾 款", Font, new SolidBrush(Color.Black), 390, 85); g.DrawString("小 计", Font, new SolidBrush(Color.Black), 460, 85); g.DrawString("门 市", Font, new SolidBrush(Color.Black), 530, 85); g.DrawString("摄 影 师", Font, new SolidBrush(Color.Black), 600, 85); g.DrawString("化 妆 师", Font, new SolidBrush(Color.Black), 670, 85); //尾部 g.DrawString("总 金 额:", Font, new SolidBrush(Color.Black), 110, 240); g.DrawString("客户签字:", Font, new SolidBrush(Color.Black), 310, 240); #endregion } PrinterSettings printSetting = new PrinterSettings(); private void Form1_Load(object sender, EventArgs e) {

    //初始化枚举打印机

    try { for (int i = 0; i < PrinterSettings.InstalledPrinters.Count; i++) { string pkInstalledPrinters; pkInstalledPrinters = PrinterSettings.InstalledPrinters[i]; comboInstalledPrinters.Items.Add(pkInstalledPrinters); } comboInstalledPrinters.Text = printSetting.DefaultPageSettings.PrinterSettings.PrinterName; printSetting.PrinterName = comboInstalledPrinters.Text; } catch { } printSetting.FromPage =1; printSetting.ToPage =1; } private void buttonPrint_Click(object sender, EventArgs e) { PageSettings ps = new PageSettings(); ps.Margins = new Margins(25, 0, 5, 5); printDocument1.DefaultPageSettings = ps; printDocument1.Print(); }

    打印部分直接用了你提供的代码,下面是打印结果.xps文件

    你可以结合实际情况用程序填写数据,批量打印,注意分页就好了。

    希望我的回答对你有帮助。打印窗体那个我个人不推荐啊,后台处理就好了,我先给你提供这个代码用吧,那个等我仔细看看啊。。。

    Allen


    Allen PPL


    • 已编辑 Allen PPL 2012年4月15日 2:28
    • 已标记为答案 错觉 2012年4月15日 3:01
    2012年4月15日 2:27
  • 真的感谢你哈 辛苦了 刚才测试了真的可以 但是我想知道一点 格式是对的 问题是打印的大小怎么设置 因为我这现在是A4的 一打印就是A4的 他的是针织的 他打印是双联 他想打一个宽高为 847, 328的 这个怎么设置打印的大小呢
    • 已编辑 错觉 2012年4月15日 3:03
    2012年4月15日 2:49
  • comboInstalledPrinters 这个变量在哪声明的 = =#

    Hi 错觉,

    这个comboInstalledPrinters 只是一个comboBox控件,直接从工具箱中拖入窗体改下名字就可以了。

    你也可以直接写代码声明,但是那样会写不少代码去控制它的位置,大小,显示多少项等等,建议你还是直接把它拖出来吧。

    你直接打印窗体的代码我和那个参考对比了一下,那个打印窗体打印时只是打印了一张图片,最关键的那句

    memoryGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s);

    你没有写,而且这个位置还不好控制,所以代码打印会精确的多。

    祝你编程愉快。

    Allen

    

    Allen PPL


    2012年4月15日 3:01
  •   PageSettings ps = new PageSettings();
                ps.Margins = new Margins(25, 0, 5, 5);
                PaperSize p = new PaperSize();
                p.Width = 847;
                p.Height = 328;
                ps.PaperSize = p;
                printDocument1.DefaultPageSettings = ps;
                printDocument1.Print();

    你看这样 能控制出打印的大小么

    2012年4月15日 3:09
  • 真的感谢你哈 辛苦了 刚才测试了真的可以 但是我想知道一点 格式是对的 问题是打印的大小怎么设置 因为我这现在是A4的 一打印就是A4的 他的是针织的 他打印是双联 他想打一个宽高为 847, 328的 这个怎么设置打印的大小呢

    Hi 错觉,

    我没有打印机。。。

    下面是网上的解决方案,你试一下吧

    针式打印机设置纸张大小

    
    
    
    
    
    
    
    
    
    
    

    Allen PPL

    2012年4月15日 3:24
  •   PageSettings ps = new PageSettings();
                ps.Margins = new Margins(25, 0, 5, 5);
                PaperSize p = new PaperSize();
                p.Width = 847;
                p.Height = 328;
                ps.PaperSize = p;
                printDocument1.DefaultPageSettings = ps;
                printDocument1.Print();

    你看这样 能控制出打印的大小么

    Hi 错觉,

    你可以尝试一下,记得告诉一下测试结果。。。谢谢


    Allen PPL

    2012年4月15日 3:28
  • 下午我在针织打印机测试了我的方法,设置高度(328)了 他到那高度就停止了,不会多打纸张,测试结果非常完美

    十分感谢

    2012年4月15日 12:46