C#如何在多个页面中打印出一组PictureBox

C# how to print out an array of PictureBox in multiple pages

我使用 C# 编写了以下代码,以在 Picturebox pictureBoxArr[] 的数组 (size = totalToPrint) 中打印图像,每个图像的大小为 100x100 像素。我想以 heightDistanceBetweenImages 之间的 20 像素距离垂直打印它们,问题是无论有多少图像,它都只打印一页(比如字母大小)(然后它只打印 8 张图像并忽略其余图像)。如何解决这个问题,并打印在多页上?

    int totalToPrint;
    int xFirstAncorPoint = 100;
    int yFirstAncorPoint = 100;
    int ImagSize = 100; // Squre of 100x100 pixel 
    int heightDistanceBetweenImages = 20;



  PrintDialog pd = new PrintDialog();
        PrintDocument pDoc = new PrintDocument();
        pDoc.PrintPage += PrintPicture;
        pd.Document = pDoc;
        if (pd.ShowDialog() == DialogResult.OK)
        {
            pDoc.Print();
        }

    }


    public void PrintPicture(Object sender, PrintPageEventArgs e)
    {
        Bitmap bmp1 = new Bitmap(ImagSize , totalToPrint * (ImagSize + heightDistanceBetweenImages));
        for (int i = 0; i < totalToPrint; i++)
        {
            pictureBoxArr[i].DrawToBitmap(bmp1, new Rectangle(0, i * (heightDistanceBetweenImages + ImagSize), pictureBoxArr[0].Width, pictureBoxArr[0].Height));
        }
        e.Graphics.DrawImage(bmp1, xFirstAncorPoint, yFirstAncorPoint);
        bmp1.Dispose();
    }

你已经完成一半了。 PrintDocument 将是您未来的参考。

PrintPage给你的不仅仅是一张图space;它还具有您的页面边界、页边距等。如果您需要打印更多页面,它还具有您设置的 HasMorePages 属性。此 属性 默认为 false,因此您只打印了 1 页。此外,如果任何内容超出页面范围,它也不会打印出来。在这里和那里进行一些小改动,您最终会得到这样的结果。

// using queue to manage images to print
Queue<Image> printImages = new Queue<Image>();
int totalToPrint;
int xFirstAncorPoint = 100;
int yFirstAncorPoint = 100;
int ImagSize = 100; // Squre of 100x100 pixel 
int heightDistanceBetweenImages = 20;

private void btnPrintTest_Click(object sender, EventArgs e) {
    PrintDialog pd = new PrintDialog();
    PrintDocument pDoc = new PrintDocument();
    pDoc.PrintPage += PrintPicture;
    pd.Document = pDoc;
    if (pd.ShowDialog() == DialogResult.OK) {
        // add image references to printImages queue.
        for (int i = 0; i < pictureBoxArr.Length; i++) {
            printImages.Enqueue(pictureBoxArr[i].Image);
        }
        pDoc.Print();
    }
}

private void PrintPicture(object sender, PrintPageEventArgs e) {
    int boundsHeight = e.MarginBounds.Height;       // Get height of bounds that we are expected to print in.
    int currentHeight = yFirstAncorPoint;

    while (currentHeight <= boundsHeight && printImages.Count > 0) {
        var nextImg = printImages.Peek();
        int nextElementHeight = nextImg.Height + heightDistanceBetweenImages;

        if (nextElementHeight + currentHeight <= boundsHeight) {
            e.Graphics.DrawImage(nextImg, new PointF(xFirstAncorPoint, currentHeight + heightDistanceBetweenImages));

            printImages.Dequeue();
        }

        currentHeight += nextElementHeight;
    }

    // how we specify if we may have more pages to print
    e.HasMorePages = printImages.Count > 0;
}

希望这能让您走上正确的道路,对您的代码进行一些小的调整,您将拥有所需的东西。