【问题标题】:Why isn't the PrintPreview exactly the same as the paper print?为什么 PrintPreview 与纸张打印不完全相同?
【发布时间】:2010-07-26 22:05:13
【问题描述】:

好的,在你用 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;
    }
}

【问题讨论】:

    标签: c# winforms printing


    【解决方案1】:

    向右偏离往往可以通过PageSettings.HardMarginX 属性的值来解释。由打印机驱动程序生成的值。然而,打印机驱动程序通常不太擅长猜测通过打印机的实际纸张路径可能是什么样子。那是机械,夹送辊,托盘对齐等等。软件工程师和机械工程师一起吃午饭的次数不够多。

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

    【讨论】:

    • 就我而言,它不是机械的。但这可能是打印机驱动程序错误。当我打印到文件时,输出图像具有我设置的精确边距。页面打印正确,页边距完全相同。这里唯一的问题是预览。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 2013-02-08
      • 2015-10-28
      • 1970-01-01
      相关资源
      最近更新 更多