0

在 C#、带有 winforms 的 .NET 3.5 中,我正在开发打印预览控件。它似乎工作正常,但是当我在 A3 页面上打印以实际尺寸扫描的 A4 页面时,比例缩小了大约 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);
    }

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

这种方法一定有问题,但我一生都无法弄清楚它是什么。如果有人能找出问题所在,我将不胜感激......

4

0 回答 0