C# 如何在c中垂直打印多页位图图像#

C# 如何在c中垂直打印多页位图图像#,c#,printing,bitmap,system.drawing,C#,Printing,Bitmap,System.drawing,位图图像高度可能大于页面高度。在这种情况下,它应该打印成多页 我尝试了下面的小单页图像代码,但在第行出现了内存异常 e.Graphics.DrawImage(bm.Clone(new Rectangle(0, pageHeight * (pageno - 1), bm.Width, pageHeight), System.Drawing.Imaging.PixelFormat.DontCare), 0, 0); 使用ASP

位图图像高度可能大于页面高度。在这种情况下,它应该打印成多页

我尝试了下面的小单页图像代码,但在第行出现了内存异常

    e.Graphics.DrawImage(bm.Clone(new Rectangle(0, 
       pageHeight * (pageno - 1), bm.Width, 
       pageHeight),
        System.Drawing.Imaging.PixelFormat.DontCare),
        0, 0);
使用ASP.NET MVC4控制器到服务器打印机进行打印

using System.Drawing.Printing;
using System.Drawing;
using System.IO;


        byte[] bmp =   bmp image created by wkhtmltoimage
        var doc = new PrintDocument();
        doc.PrinterSettings.PrinterName = "myprinter";
        doc.PrintPage += new PrintPageEventHandler(ProvideContent);
        pageHeight = doc.DefaultPageSettings.PaperSize.Height;
        using (bm = new Bitmap(new MemoryStream(bmp)))
        {
            var lehti = (int)Math.Ceiling((double)(bm.Height / pageHeight));
            doc.PrinterSettings.FromPage = 1;
            doc.PrinterSettings.ToPage = lehti;
            doc.PrinterSettings.MaximumPage = 1;
            doc.PrinterSettings.MinimumPage = lehti;
            pageno = 1;
            doc.Print();
        }
    }

    int pageno;
    int pageHeight;
    Bitmap bm;

    void ProvideContent(object sender, PrintPageEventArgs e)
    {
        e.Graphics.DrawImage(bm.Clone(new Rectangle(0, pageHeight * (pageno - 1), bm.Width, pageHeight), System.Drawing.Imaging.PixelFormat.DontCare),
            0, 0);
    }
如何将图像打印到多个页面?
e.Graphics.DrawImage(bm,0,0)可以工作,但只打印图像的顶部。

如果没有它,将清楚地显示您尝试过的内容,并精确解释代码的作用以及它与您想要的内容的不同之处,则无法回答。一般来说,你需要自己“分页”。没有理由关闭位图;只需使用页面尺寸及其自身来计算需要多少页面矩形才能覆盖整个位图,然后继续按顺序打印页面,直到将每个位图子集绘制到一个页面为止。您可能希望在此处查看文章:。它适用于WPF,但它描述了位图分页的基本算法,因此可能对您有用。我正在编辑你的标签,因为这个问题似乎与ASP.NET本身没有任何关系。谢谢你的链接。好文章和漂亮的分页符搜索代码。我很遗憾它使用了不安全的代码。也许它可以改为只使用安全代码。你可以写下来作为答案,我可以接受。我使用DrawImage代码解决了内存不足的问题,该代码来自链接文章中的已接受答案使用
不安全
仅用于直接访问位图像素数据,因为它们是分页方式。在您的情况下,分页分隔符的计算应该简单得多:只需在页面可打印区域的边界处进行分隔。当调用
IsRowGoodBreakingPoint()
时,可以忽略
;只需将
pageBreak
设置为
pageHeight
并打印页面(如有必要,宽度类似……垂直分页符仅出现在页面宽度处)。我目前使用的是固定页面高度。页面末尾的最后一行不可读:部分显示在页面末尾,部分显示在下一页的开头。如何在不使用不安全代码的情况下修复此问题?如果不使用不安全代码,就无法清楚地显示您尝试了什么,并精确解释该代码的作用以及它与您想要的不同之处,那么就无法回答。一般来说,你需要自己“分页”。没有理由关闭位图;只需使用页面尺寸及其自身来计算需要多少页面矩形才能覆盖整个位图,然后继续按顺序打印页面,直到将每个位图子集绘制到一个页面为止。您可能希望在此处查看文章:。它适用于WPF,但它描述了位图分页的基本算法,因此可能对您有用。我正在编辑你的标签,因为这个问题似乎与ASP.NET本身没有任何关系。谢谢你的链接。好文章和漂亮的分页符搜索代码。我很遗憾它使用了不安全的代码。也许它可以改为只使用安全代码。你可以写下来作为答案,我可以接受。我使用DrawImage代码解决了内存不足的问题,该代码来自链接文章中的已接受答案使用
不安全
仅用于直接访问位图像素数据,因为它们是分页方式。在您的情况下,分页分隔符的计算应该简单得多:只需在页面可打印区域的边界处进行分隔。当调用
IsRowGoodBreakingPoint()
时,可以忽略
;只需将
pageBreak
设置为
pageHeight
并打印页面(如有必要,宽度类似……垂直分页符仅出现在页面宽度处)。我目前使用的是固定页面高度。页面末尾的最后一行不可读:部分显示在页面末尾,部分显示在下一页的开头。如何在不使用不安全代码的情况下修复此问题?