C#确定实际打印区域

时间:2013-06-25 00:17:33

标签: c# .net winforms printing

在C#中,带有winforms的.NET 3.5我正在处理打印预览控件。它看起来工作正常,但是当我打印A4页面时,我在A3页面上以实际尺寸扫描,尺度超出了3%......

我使用以下代码根据用户选择的设置计算页面的实际可打印区域,我想知道我是否可能错误地进行了这些计算?

public static RectangleF GetPrintArea(PageSettings PageSettings)
    {
        float[] margins;
        RectangleF printArea;

        // Get the actual page bounds
        printArea = PageSettings.Bounds;

        // Calculate the hard margins taking into account page orientation
        margins = new float[4];
        // Left
        margins[0] = !PageSettings.Landscape ? PageSettings.HardMarginX : PageSettings.HardMarginY;
        // Top
        margins[1] = !PageSettings.Landscape ? PageSettings.HardMarginY : PageSettings.HardMarginX;
        // Right
        margins[2] = margins[0];
        // Bottom
        margins[3] = margins[1];

        // Calculate the real print margins taking into account teh hard and soft margins
        // left
        margins[0] = Math.Max(margins[0], PageSettings.Margins.Left);
        // Top
        margins[1] = Math.Max(margins[1], PageSettings.Margins.Top);
        // Right
        margins[2] = Math.Max(margins[2], PageSettings.Margins.Right);
        // Bottom
        margins[3] = Math.Max(margins[3], PageSettings.Margins.Bottom);

        return new RectangleF(
            new PointF(margins[0], margins[1]),
            new SizeF(printArea.Width - (margins[0] + margins[2]), printArea.Height - (margins[1] + margins[3]))
         );
    }

这应该返回一个矩形,它会给出打印页面的实际区域。我使用这个矩形来生成预览和打印输出。

打印输出的代码如下:

    /// <summary>
    /// Draws the image on the printing surface
    /// </summary>
    /// <param name="Graphics">The graohics object with which to draw</param>
    protected virtual void PrintImage(Graphics Graphics)
    {
        RectangleF imageBoundingBox;
        RectangleF visibleImageBoundingBox;
        RectangleF visibleImage;

        // Offset the visible bounding box location by the position of the print area so as to print right within the margins
        Graphics.TranslateTransform(-this.Page.PrintableArea.Left, -this.Page.PrintableArea.Top);

        // Calculate the bounding box of the scaled image
        imageBoundingBox = new RectangleF(this.Page.PrintAreaOrigin.Add(this.ImagePrintLocation), this.Image.Size.Multiply(this.ImagePrintScale));

        // Calculate the position and size of the portion of the image bounding box visible in the viewport
        visibleImageBoundingBox = RectangleF.Intersect(imageBoundingBox, this.Page.PrintArea);

        // Calculate the portion of the image which corresponds to the visible bounding box
        visibleImage = new RectangleF(
            new PointF(
                imageBoundingBox.X < this.Page.PrintArea.Left ? Math.Min(this.Page.PrintArea.Left - imageBoundingBox.X, imageBoundingBox.Width) : 0,
                imageBoundingBox.Y < this.Page.PrintArea.Top ? Math.Min(this.Page.PrintArea.Top - imageBoundingBox.Y, imageBoundingBox.Height) : 0
            ).Divide(this.ImagePrintScale),
            visibleImageBoundingBox.Size.Divide(this.ImagePrintScale)
        );

        // Draw the image
        Graphics.DrawImage(this.Image, visibleImageBoundingBox, visibleImage, GraphicsUnit.Pixel);
    }

其中Page是包含页面边界(PageArea)的类,可打印区域PrintableArea和实际打印区域(PrintArea)。实际打印区域是前一个矩形给出的区域。

这种做法肯定是错的,但我不能为我的生活弄清楚它是什么。如果有人能够确定哪些是错的,我会非常感激......

0 个答案:

没有答案