简体   繁体   English

C#从生成的格式化字符串中打印发票,每打印机页面一张发票

[英]C# Printing invoices from a generated, formatted string, one invoice per printer page

I've generated a single long string of invoices formatted as required. 我已经生成了一个单据格式的长发票。 I now need to print them out on a printer with one invoice displayed per page. 我现在需要在打印机上打印出来,每页显示一张发票。

I've looked at these tutorials/help as well as some code I was: 我看过这些教程/帮助以及我当时的一些代码:

https://msdn.microsoft.com/en-us/library/cwbe712d%28v=vs.110%29.aspx https://msdn.microsoft.com/zh-CN/library/cwbe712d%28v=vs.110%29.aspx

https://social.msdn.microsoft.com/Forums/en-US/93e54c4f-fd07-4b60-9922-102439292f52/c-printing-a-string-to-printer?forum=csharplanguage https://social.msdn.microsoft.com/Forums/zh-CN/93e54c4f-fd07-4b60-9922-102439292f52/c-printing-a-string-to-printer?forum=csharplanguage

I've primarily followed the second one. 我主要关注第二个。

What I've ended up with is (Working VS C# project with a single form with a single button): 我最终得到的是(使用单个按钮的单个表单运行VS C#项目):

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

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

        private string stringToPrint = "Hello\r\nWorld\r\n\r\n<<< Page >>>World\r\nHello";

        private void button1_Click(object sender, EventArgs e)
        {

            //  Convert string to strings
            string[] seperatingChars = { "<<< Page >>>" };
            string[] printString = stringToPrint.Split(seperatingChars, System.StringSplitOptions.RemoveEmptyEntries);

            //  Connect to the printer
            PrintDocument printDocument1 = new PrintDocument();     // Stream to the printer

            //  Send to printer (reference: https://social.msdn.microsoft.com/Forums/en-US/93e54c4f-fd07-4b60-9922-102439292f52/c-printing-a-string-to-printer?forum=csharplanguage)
            foreach (string s in printString)
            {
                printDocument1.PrintPage += delegate (object sender1, PrintPageEventArgs e1)
                {
                    e1.Graphics.DrawString(s, new Font("Times New Roman", 12), new SolidBrush(Color.Black),
                    new RectangleF(0, 0, printDocument1.DefaultPageSettings.PrintableArea.Width,
                    printDocument1.DefaultPageSettings.PrintableArea.Height));
                };
                try
                {
                    printDocument1.Print();
                    printDocument1.Dispose();
                }
                catch (Exception ex)
                {
                    throw new Exception("Exception Occured While Printing", ex);
                }
            }
        }
    }
}

I break the long string into it's parts that I want printed to each individual page and then sent that to the printer. 我将长字符串分解成要打印到每个页面的部分,然后将其发送到打印机。 This works fine for the first invoice/page but after that it just adds each page on to image of the first (I added the printDocument1.Dispose(); to try and sort that but that didn't work). 这对于第一个发票/页面效果很好,但之后仅将每个页面添加到第一个图像上(我添加了printDocument1.Dispose();尝试对其进行排序但不起作用)。

What I want to know is how can I print the string as a single string while keeping one invoice per page. 我想知道的是如何将字符串打印为单个字符串,同时每页保留一张发票。

EDIT: How do I generate the string as multi-page image for the printer? 编辑:我如何生成字符串作为打印机的多页图像?

EDIT: complete solution. 编辑:完整的解决方案。

 public partial class Form1 : Form
    {
        //string to print
        private string stringToPrint = "Hello\r\nWorld\r\n\r\n<<< Page >>>World\r\nHello";
        //list of strings/pages
        private List<string> pageData = new List<string>();
        //enumerator for iteration thru "pages"
        private IEnumerator pageEnumerator;
        //print document
        PrintDocument printDocument1;

        public Form1()
        {
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        {

            //  Connect to the printer
            printDocument1 = new PrintDocument();
            //handle events
            printDocument1.BeginPrint += new PrintEventHandler(BeginPrint);
            printDocument1.PrintPage += new PrintPageEventHandler(PrintPage);


            try
            {
                //do print
                printDocument1.Print();
                printDocument1.Dispose();
            }
            catch (Exception ex)
            {
                throw new Exception("Exception Occured While Printing", ex);
            }

        }

        void BeginPrint(object sender, PrintEventArgs e)
        {
            //  Convert string to strings
            string[] seperatingChars = { "<<< Page >>>" };

            //generate some dummy strings to print
            pageData = stringToPrint.Split(seperatingChars, System.StringSplitOptions.RemoveEmptyEntries).ToList();

            // get enumerator for dummy strings
            pageEnumerator = pageData.GetEnumerator();

            //position to first string to print (i.e. first page)
            pageEnumerator.MoveNext(); 
        }

        private void PrintPage(object sender, PrintPageEventArgs e)
        {
            //define font, brush, and print area
            Font font = new Font("Times New Roman", 12);
            Brush brush = Brushes.Black;
            RectangleF area = new RectangleF(0, 0, printDocument1.DefaultPageSettings.PrintableArea.Width,
                    printDocument1.DefaultPageSettings.PrintableArea.Height);

            //print current page
            e.Graphics.DrawString(pageEnumerator.Current.ToString(), font, brush, area);

            // advance enumerator to determine if we have more pages.
            e.HasMorePages = pageEnumerator.MoveNext();

        }


    }

From what I can see, this line is causing the problem that you described: 据我所知,此行导致了您描述的问题:

printDocument1.PrintPage += delegate(object sender1,
PrintPageEventArgs e1)

Try changing it to: 尝试将其更改为:

printDocument1.PrintPage = delegate(object sender1,
PrintPageEventArgs e1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM