我正在关注打印多个页面的MSDN“如何”文档:How to: Print a Multi-Page Text File in Windows Forms
我已将该页面上的示例转换为项目(尝试过Visual Studio 2010和2012),并发现在打印少量页面时可以正常工作,但是在打印大量页面时(9页左右)它开始将起始页面呈现为空白(第一页和第二页是空白,接下来的15页是正确的,等等。)
任何人都可以确认这种行为吗?我没有看到可能导致这种情况的原因,并且没有抛出异常。
编辑:我收到了2个downvotes,但我不确定为什么。我会尝试更清楚。以下是我认为包含该问题的代码部分:
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
int charactersOnPage = 0;
int linesPerPage = 0;
// Sets the value of charactersOnPage to the number of characters
// of stringToPrint that will fit within the bounds of the page.
e.Graphics.MeasureString(stringToPrint, this.Font,
e.MarginBounds.Size, StringFormat.GenericTypographic,
out charactersOnPage, out linesPerPage);
// Draws the string within the bounds of the page
e.Graphics.DrawString(stringToPrint, this.Font, Brushes.Black,
e.MarginBounds, StringFormat.GenericTypographic);
// Remove the portion of the string that has been printed.
stringToPrint = stringToPrint.Substring(charactersOnPage);
// Check to see if more pages are to be printed.
e.HasMorePages = (stringToPrint.Length > 0);
}
我不相信任何数据类型都被溢出。我尝试过不同的打印机,但每个都有相同的结果。如果你发誓要告诉我为什么问题有问题,请发表评论。 注意:我尝试过.NET Framework 4和4.5,结果相同。
答案 0 :(得分:1)
似乎MSDN示例不能正常工作。这可能是因为MarginBounds Rectangle是基于整数的,而不是基于float的。将Y位置跟踪为浮点并在MeasureString和DrawString方法中使用此值解决问题。我通过检查different MSDN printing example找到了这个。
以下是相关代码:
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
float linesPerPage = 0;
float yPos = 0;
int count = 0;
float leftMargin = ev.MarginBounds.Left;
float topMargin = ev.MarginBounds.Top;
string line = null;
// Calculate the number of lines per page.
linesPerPage = ev.MarginBounds.Height /
printFont.GetHeight(ev.Graphics);
// Print each line of the file.
while (count < linesPerPage &&
((line = streamToPrint.ReadLine()) != null))
{
yPos = topMargin + (count *
printFont.GetHeight(ev.Graphics));
ev.Graphics.DrawString(line, printFont, Brushes.Black,
leftMargin, yPos, new StringFormat());
count++;
}
// If more lines exist, print another page.
if (line != null)
ev.HasMorePages = true;
else
ev.HasMorePages = false;
}
这并不像上一个例子那样考虑自动换行,但可以相对轻松地实现。