简体   繁体   中英

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

using C#, I wrote the below code to print out images in an array (size = totalToPrint) of Picturebox pictureBoxArr[] each in size of 100x100 pixel. I want to print them vertically with the 20-pixel distance between them heightDistanceBetweenImages the problem is that it only prints on 1 page (say letter size) no matter how many images ( then it only prints 8 images and dismisses the rest). How can I solve this problem, and print it on multiple pages?

    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();
    }

You are about half way there. PrintDocument would be your future reference.

The PrintPage gives you more than just a drawing space; it also has your page bounds, page margins, etc. It also has HasMorePages property that you set if you need to print more pages. This property defaults to false, so you were only printing 1 page. Also if anything is outside the bounds of the page, it would not print that. With a little change here and there, you would end up with something like this.

// 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;
}

Hopefully this gets you on the right path and with some minor tweaks for your code, you will have what you need.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM