为什么PrintPreview与纸张打印完全不同?

时间:2010-07-26 22:05:14

标签: c# winforms printing

好的,在你用StringFormat.Alignment = StringAlignment.Center向我发送垃圾邮件之前......听听我的整个问题:

当我使用以下代码绘制文本时,字符串在PrintPreview中居中,但在打印时不在实际纸张上居中。整个页面稍微向右偏移,因此有些东西在打印预览中显示为打印,但在打印时会从纸张上掉落(不仅仅是在边距范围之外,而是在纸张上)。

    private void button1_Click(object sender, EventArgs e)
    {
        PrintDocument pd = new PrintDocument();

        pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);

        PrintPreviewDialog ppd = new PrintPreviewDialog();

        ((Form)ppd).WindowState = FormWindowState.Maximized;

        ppd.Document = pd;
        ppd.ShowDialog();
    }

    void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        for (int y = 100; y < 400; y += 25)
        {
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;

            e.Graphics.DrawRectangle(Pens.Black, new Rectangle(5, y, 840, 25));
        }

        e.HasMorePages = false;
    }

有关为什么关闭它的任何想法?这应该是微不足道的,但事实并非如此。

编辑:我发现它不仅仅是文字......它只是打印了一切。我已经更新了上面的代码,以提供更好的问题示例。只需将其放在带有按钮的表格中即可。

编辑2:根据给出的答案,我修改了代码,现在可以使用了。我正在为那些可能想要看到它的人提供最终代码。我必须认识到我是在PrintPreview对话框中还是在纸上看到这个,所以我有一个IsPreview标志来处理这个问题。

public partial class Form1 : Form
{
    bool IsPreview = true;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        IsPreview = true;
        PrintDocument pd = new PrintDocument();

        pd.EndPrint += new PrintEventHandler(pd_EndPrint);
        pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);


        PrintPreviewDialog ppd = new PrintPreviewDialog();

        ((Form)ppd).WindowState = FormWindowState.Maximized;

        ppd.Document = pd;
        ppd.ShowDialog();
    }

    void pd_EndPrint(object sender, PrintEventArgs e)
    {
        IsPreview = false;
    }

    void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        Rectangle b3 = e.PageBounds;

        if (IsPreview)
        {
            e.Graphics.TranslateTransform(e.PageSettings.HardMarginX, e.PageSettings.HardMarginY);
        }

        b3.Width -= (int)e.PageSettings.HardMarginX * 2;
        b3.Height -= (int)e.PageSettings.HardMarginY * 3;

        int y = b3.Y;
        int x=0;
        while ((y + 25) < b3.Bottom)
        {
            x++;
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;

            Rectangle R = new Rectangle(b3.X, y, b3.Width, 25);

            e.Graphics.DrawRectangle(Pens.Black, R);
            e.Graphics.DrawString(x.ToString(), this.Font, Brushes.Black, b3.X + 5, y + 5);

            y += 25;
        }
        // draw the last little bit
        e.Graphics.DrawRectangle(Pens.Black, new Rectangle(b3.X, y, b3.Width, b3.Height - y));

        e.HasMorePages = false;
    }
}

public partial class Form1 : Form { bool IsPreview = true; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { IsPreview = true; PrintDocument pd = new PrintDocument(); pd.EndPrint += new PrintEventHandler(pd_EndPrint); pd.PrintPage += new PrintPageEventHandler(pd_PrintPage); PrintPreviewDialog ppd = new PrintPreviewDialog(); ((Form)ppd).WindowState = FormWindowState.Maximized; ppd.Document = pd; ppd.ShowDialog(); } void pd_EndPrint(object sender, PrintEventArgs e) { IsPreview = false; } void pd_PrintPage(object sender, PrintPageEventArgs e) { Rectangle b3 = e.PageBounds; if (IsPreview) { e.Graphics.TranslateTransform(e.PageSettings.HardMarginX, e.PageSettings.HardMarginY); } b3.Width -= (int)e.PageSettings.HardMarginX * 2; b3.Height -= (int)e.PageSettings.HardMarginY * 3; int y = b3.Y; int x=0; while ((y + 25) < b3.Bottom) { x++; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; Rectangle R = new Rectangle(b3.X, y, b3.Width, 25); e.Graphics.DrawRectangle(Pens.Black, R); e.Graphics.DrawString(x.ToString(), this.Font, Brushes.Black, b3.X + 5, y + 5); y += 25; } // draw the last little bit e.Graphics.DrawRectangle(Pens.Black, new Rectangle(b3.X, y, b3.Width, b3.Height - y)); e.HasMorePages = false; } }

2 个答案:

答案 0 :(得分:6)

向右倾斜往往可以通过PageSettings.HardMarginX属性的值来解释。打印机驱动程序生成的值。然而,打印机驱动程序通常不太擅长猜测通过打印机的实际纸张路径可能是什么样的。这是机械,夹送辊,托盘对齐等等。软件和机械工程师经常没有共进午餐。

但是软件工程师几乎总能解决机械工程师的问题。您需要一个“选项”对话框,以允许用户修复机械工程师的问题。使用e.Graphics.TranslateTransform调用中的值。

答案 1 :(得分:0)

预览与纸张不匹配的原因是您尚未选择打印机。每个打印机在不可打印区域,强制边距等方面都有所不同。自从我完成了winforms打印以来已经有一段时间了,但我确实记得传递过的图形对象有办法解决这个问题。