C#printDocument:幻影打印以计算页面总数



i当前具有一个能够使用System.Drawing.printing.printdocument的datagridView在页面上打印输出的函数 - 打印实用程序通过我的打印页面函数(printdoc_pageprint)运行,直到运行从行之外(将其设置为false。)

我正在尝试在打印之前计算总页数,以便我可以将" Y页"放在每个页面的底部。一种方法是确定每个页面上适合多少行,并根据总共有多少行确定有多少页,但是这似乎并不是很通用,因为它依赖每行的高度相同,,根据其编程方式,可能并非总是如此。

我想这样做的方法是进行"幻影"打印 - 或基本上将其打印到背景中的无效打印机上,而无需用户知道。当它进行第一次打印时,每次运行打印函数时,它都可以增加全局变量的总页面,然后一旦完成幻象打印,请在下次打印时逐步添加总页面(大概只需在phantom Print时设置BOOL完成。)这将更加通用,并且适用于不同行高的数据网格或我想打印的任何其他类型的数据。

我的问题是 - 是否有任何方法可以在后台运行示例打印?这是在用户选择页面大小和方向等之后完成的,因此我们确实知道这些基本细节,但是在显示"打印预览"对话之前。

这是我拥有的一些代码...有效,但是由于某种原因,它一直无法工作!

// Phantom print to determine number of pages. Writes to TotalPages var.
// The next print won't write to TotalPages when FirstPreviewDone is set to true.
var printEventArgs = new PrintEventArgs();
// Create a graphics object of the page size to "print" to.
int x = 0;
int y = 0;
int width = printDoc.DefaultPageSettings.PaperSize.Width;
int height = printDoc.DefaultPageSettings.PaperSize.Height;
Rectangle marginBoundsRectangle = new Rectangle(x, y, width, height);
Rectangle pageBoundsRectangle = new Rectangle(0, 0, printDoc.DefaultPageSettings.PaperSize.Width, printDoc.DefaultPageSettings.PaperSize.Height);
Bitmap b = new Bitmap(width, height);
// Swap everything if it's in landscape.
if (printDoc.DefaultPageSettings.Landscape)
{
    marginBoundsRectangle = new Rectangle(y, x, height, width);
    pageBoundsRectangle = new Rectangle(0, 0, printDoc.DefaultPageSettings.PaperSize.Height, printDoc.DefaultPageSettings.PaperSize.Width);
    b = new Bitmap(height, width);
}
Graphics graphics = Graphics.FromImage(b);
var printPageEventArgs = new PrintPageEventArgs(graphics, marginBoundsRectangle, pageBoundsRectangle, printDoc.DefaultPageSettings);
printPageEventArgs.HasMorePages = true;
PrintDoc_BeginPrint(null, printEventArgs);
while (printPageEventArgs.HasMorePages  && !printPageEventArgs.Cancel)
{
    try
    {
        PrintDoc_PrintPage(null, printPageEventArgs);
    }
    catch (Exception ex)
    {
        MessageBoxEx.Show(ex.Message, "Error printing - Check logs", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return;
    }
}

这已经在以下问题中回答...

是否有更好的方法从printDocument中获得页面计数?

希望这会有所帮助...

int ipageCount = rptdocument.formatengine.getLastPagenumber(新的reportpagerequestcontext());

最新更新