1

对不起,我的英语

好吧,我在一个程序中看到,当它需要打印一些东西时,第一件事是读取一个文件,其中包含将在矩阵打印机中打印的字段的行和列(点打印机,我找不到正确的单词)

我的想法是在文件中写入我需要像这样打印的字段的位置

(x,y) 字段1, (x,y) 字段2, (x,y) 字段3,

并以这种方式打印每个字段,因此我的程序需要读取文件进行打印,如果我需要打印的预打印文档发生更改,这种方式允许我更改格式中字段的位置

我想这样做,因为我有很多不同的预印发票,我需要调整打印机方式

我读到了 PrintDocument 但我没有找到很好的解释,我读了这个,但这是一个非常简单的例子

我希望有人能指引我正确的方向

4

1 回答 1

0

我认为打印机的类型并不重要(矩阵、喷墨和激光)。这是一个更完整的代码示例。

http://msdn.microsoft.com/en-us/library/system.drawing.printing.printdocument.printpage.aspx

对于您的特定场景,您需要从发票格式文件中为每个字段解析 x,y 位置信息。有了 x 和 y 后,只需将其绘制到 PrintPage 事件参数Graphics对象,就像在示例代码中一样。

棘手的部分是解析格式文件以获取正确的 x 和 y 位置数据。您可以使用非常简单的格式让事情变得更轻松。例如,您可以按如下方式格式化文件。

    x
    y
    [field1]
    x
    y
    [field2]
    ...

因此,假设您要打印一个看起来像这样的简单页面。

    07-31-2013         Invoice             Page 1

    Item               Quantity            Price
    --------           --------            --------
    Sprocket           1                   $100.00
    Cog                2                   $ 25.00

    Total: $150.00

您实际格式化的发票文件将是...

    1
    1
    07-31-2013
    1
    20
    Invoice
    1
    40
    Page 1
    3
    1
    Item
    3
    20
    Quantity
    3
    40
    Price
    4
    1
    --------
    4
    20
    --------
    4
    40
    --------
    5
    1
    Sprocket
    5
    20
    1
    5
    40
    $100.00
    6
    1
    Cog
    6
    20
    2
    6
    40
    $ 25.00
    8
    1
    Total: $150.00

您的打印代码将是这样的。

// The PrintPage event is raised for each page to be printed. 
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
    int row = 0;
    int col = 0;
    float xPos = 0;
    float yPos = 0;
    float leftMargin = ev.MarginBounds.Left;
    float topMargin = ev.MarginBounds.Top;
    string line = null;

    // Print each line of the file. 
    while (true)
    {
        try
        {
            row = Convert.ToInt32(streamToPrint.ReadLine());
            col = Convert.ToInt32(streamToPrint.ReadLine());
            line = streamToPrint.ReadLine();
        }
        catch
        {
            break;
        }

        xPos = leftMargin + (col * ev.Graphics.MeasureString(" ", printFont, ev.PageBounds.Width));
        yPos = topMargin + (row * printFont.GetHeight(ev.Graphics));

        ev.Graphics.DrawString(line, printFont, Brushes.Black, xPos, yPos, new StringFormat());
    }
}
于 2013-07-31T17:44:40.790 回答