C# 打印文档 : Phantom print to count total number of pages

标签 c# printing datagridview

我目前有一个功能,可以使用 System.Drawing.Printing.PrintDocument 将 DataGridView 打印到页面上 - 打印实用程序通过我的打印页面功能 (PrintDoc_PagePrint) 运行,直到它用完行(它将设置的位置) HasMorePages 为 false。)

我试图在打印前算出总页数,这样我就可以在每页的底部放置“page x of y”。一种方法是计算出每页适合多少行,并根据总共有多少行计算出多少页,但这似乎不是很通用,因为它依赖于每一行的高度相同,这取决于它的编程方式,可能并非总是如此。

我想做的是做一个“幻影”打印——或者基本上是在用户不知情的情况下在后台将它打印到一个空打印机上。当它第一次打印时,它可以在每次运行打印功能时增加一个全局变量 TotalPages,然后一旦幻像打印完成,就停止在下次打印时增加 TotalPages(大概只是在幻像打印完成后设置一个 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;
    }
}

最佳答案

这已经在下面的问题中得到了回答......

Is there a better way to get the page count from a PrintDocument than this?

希望这有助于...

关于C# 打印文档 : Phantom print to count total number of pages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21321365/

相关文章:

c# - 在两个数组中查找唯一字符串 C#

c# - 自动缩进关闭

c# - 串行端口轮询和数据处理

c# - C# 中的 ReSharper 格式化三元运算符

css - 当 TABLE 跨越多个页面时,如何使第一页上的 TFOOT 显示为 "continued..."?

android - 如何创建 PrintDocumentAdapter 来使用 Android 4.4 打印 API 打印图像

c# - 太多方法非常相似

php - 从 sql 数据库中打印,如表中所示

c# - 如何使用鼠标滚轮让 DataGridView 一次滚动一项?

c# - 从所有 datagridview 中删除空行