在卷纸上打印

25
我正在使用C#与Winforms。 我想打印一张纸带上的账单。 纸张的宽度为3英寸,但纸张的长度是动态的(是一种卷纸)。 长度取决于列表中有多少项。 例如,在购买中如果有100个项目出售,则卷会很长,而对于购买单个项目,则长度较小。
当我打印报表时,在作业结束后,打印机将弹出比我需要的最后一页更多的页面。 它会弹出尺寸为A4的纸张。 我想打印所需行,然后停止打印。 我使用纸卷,不是A4或A3,以及Epson LQ-300 + II打印机。
更具体地说,打印始终是按页面大小单位进行的。 如果我将页面设置为3英寸x8英寸,那么我总是得到一个长度为8英寸的倍数的打印输出。 如果我有一个要打印的9英寸账单,那么我最终得到的打印输出长度为16英寸,浪费了7英寸的纸张。 如何只打印所需长度的最后一页?
这是代码:
private void printDoc_PrintPage(Object sender, PrintPageEventArgs e)
        {
            Font printFont = new Font("Courier New", 12);
            int y = 15;
            e.Graphics.DrawString("a Line", printFont, Brushes.Black, 0, y); y = y + 20;
            e.Graphics.DrawString(" Line", printFont, Brushes.Black, 0, y); y = y + 25;
            e.Graphics.DrawString(" Line", printFont, Brushes.Black, 0, y); y = y + 35;
            e.Graphics.DrawString(" Line", printFont, Brushes.Black, 0, y); y = y + 45;
        }

5
你有什么问题吗?你只需要持续打印,直到完成。这就是滚动纸的优点。 - Cody Gray
+1,继续绘制直到完成,并以一条语句结束来切割纸张。我曾经使用GDI来做这件事,对Crystal报表没有经验。 - Anton
5个回答

18

考虑到限制条件,这似乎是最合乎逻辑的答案。 - NotMe
我们如何定义单行纸张?我在打印机设置中只看到标准尺寸。 - Thunder
在VB.NET中,除了一行指定高度之外,是否有任何替代选项?如果没有,那么在销售终端打印收据时使用了什么类型的编码来打印固定宽度和每个账单高度不同的收据? - Sathish
1
大家好,我也在苦苦挣扎。你说的那一行在哪里?我看你将高度设置为200,这是怎么做到的呢? - Shadrack Orina

5

您还可以即时调整纸张大小。每页只需一行更省事,但我想如果有人需要打印预览,这样做会产生更好的效果:

printdoc.DefaultPageSettings.PaperSize.Height += lineheight;

这段代码对我不起作用。在哪个事件中我应该指定这段代码?.. 我在打印页面事件中使用了它。 - Sathish
你需要在绘制每条线时这样做。并且你需要像接受的答案建议的那样从自定义单行纸张大小开始。标准纸张尺寸的高度不可写。 - Kevin Stricker

1

我正在使用VKP80II打印机,我的操作是将pagesettings.papersize设置为:

PaperSize PaperRoll= new PaperSize("Paper Roll", 300, 0);

自动打印所需长度,无需我指定长度。


0

以下是如何定义自定义纸张大小并在报表中使用它的方法:

打开打印机文件夹(从控制面板)。

从文件菜单中打开服务器属性。这将打开打印机和服务器属性对话框。

选择检查创建新的表格

指定页面宽度和高度。我建议您将高度设置为3英寸。

现在点击保存表格按钮。

您的自定义页面已准备好。

将此纸张设置为报告和打印机属性中的默认纸张大小。

现在您可以开始使用了。


1
应该至少指定您正在使用的操作系统。 - Kym NT

0

您也可以使用打印预览选项来完成此过程。

// This is for the print preview event
 private void printPreviewDialog1_Load(object sender, EventArgs e)
 {
     int j = 0;
     z = 185;

     while (j < dataGridView1.Rows.Count)
     {                 
         j += 1;
         z += 30;
     }

     z += 60;

     PaperSize pkCustomSize1 = new PaperSize("First custom size", 350, z);

     printDocument1.DefaultPageSettings.PaperSize = pkCustomSize1;
 }

 // This is the loop for generating print Document
 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
 {
     int i = 0; //For Gridview Row Count
     int sno = 1; //For Grid Serial Number

     e.Graphics.DrawString(
         "HEADING", 
         new Font("Calibri", 20, FontStyle.Bold), 
         Brushes.Black, 
         new Point(100, 5));

     e.Graphics.DrawString(
         "Address", 
         new Font("Calibri", 12, FontStyle.Bold), 
         Brushes.Black, 
         new Point(75, 35));

    int y = 185; //For Grid y axis start to print 

    while (i < dataGridView1.Rows.Count)
    {
        e.Graphics.DrawString(
            sno.ToString(), 
            new Font("Calibri", 10, FontStyle.Bold), 
            Brushes.Black, 
            new Point(10, y)); //For Serial Number

        e.Graphics.DrawString(
            dataGridView1.Rows[i].Cells[1].FormattedValue.ToString(), 
            new Font("Calibri", 10, FontStyle.Bold), 
            Brushes.Black, 
            new Point(240, y));

        //This is for Trim content to next line
        Graphics df1 = e.Graphics;
        SizeF ef1 = df1.MeasureString(
            dataGridView1.Rows[i].Cells[0].FormattedValue.ToString(),
            new Font(new FontFamily("Calibri"), 12F, FontStyle.Bold),
            200); //160

        df1.DrawString(
            dataGridView1.Rows[i].Cells[0].FormattedValue.ToString(),
            new Font(new FontFamily("Calibri"), 12F, FontStyle.Bold), 
            Brushes.Black,
            new RectangleF(new PointF(60.0F, y), ef1), //350.0
            StringFormat.GenericTypographic);

        i += 1;
        sno += 1;
        y += 30;
    }

    e.Graphics.DrawString(
        "------------------------------------------------------------------------------------",
        new Font("Calibri", 10, FontStyle.Bold), 
        Brushes.Black, 
        new Point(0, y));

    e.Graphics.DrawString(
        "Total Amount-:" + TotalAmnt_txt.Text, 
        new Font("Calibri", 10, FontStyle.Bold), 
        Brushes.Black, 
        new Point(150, y+=20));

    e.Graphics.DrawString(
        "------------------------------------------------------------------------------------", 
        new Font("Calibri", 10, FontStyle.Bold), 
        Brushes.Black, 
        new Point(0, y+=20));

    e.Graphics.DrawString(
        "***Care For You ****", 
        new Font("Calibri", 10, FontStyle.Bold), 
        Brushes.Black, 
        new Point(150, y += 20));

    i = 0;
    sno = 1;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接