我正在制作一个简单的WinForms应用程序,并希望允许用户打印RichTextBox中的文本。
我按照MSDN链接的指示进行操作... 并且它可以在真实的打印机上正常工作(我指的是那些可以触摸的打印机)。
但是,如果我想使用某种类型的PDF打印机呢? 那么,我必须说仅当打印一页时它才有效。 每个下一页都会打印在同一页上,这意味着文本将被覆盖。 这是显而易见的,但我该怎么做才能强制PDF打印机创建新页面呢?
这是我的代码:
private PrintDocument docToPrint;
private string stringToPrint;
public mainForm()
{
InitializeComponent();
CenterToScreen();
this.docToPrint = new PrintDocument();
(...)
}
private void tsBtnPrint_Click(object sender, EventArgs e)
{
PrintDialog myPrintDialog = new PrintDialog();
myPrintDialog.AllowCurrentPage = true;
myPrintDialog.AllowSelection = true;
myPrintDialog.AllowSomePages = true;
myPrintDialog.Document = docToPrint;
if(myPrintDialog.ShowDialog()==DialogResult.OK)
{
StringReader reader = new StringReader(this.richTextBox.Text);
stringToPrint = reader.ReadToEnd();
this.docToPrint.PrintPage += new PrintPageEventHandler(this.docToPrintCustom);
this.docToPrint.Print();
}
}
private void docToPrintCustom(object sender, PrintPageEventArgs e)
{
Font PrintFont = this.richTextBox.Font;
SolidBrush PrintBrush = new SolidBrush(Color.Black);
int LinesPerPage = 0;
int charactersOnPage = 0;
e.Graphics.MeasureString(stringToPrint, PrintFont, e.MarginBounds.Size, StringFormat.GenericTypographic,
out charactersOnPage, out LinesPerPage);
e.Graphics.DrawString(stringToPrint, PrintFont, PrintBrush, e.MarginBounds, StringFormat.GenericTypographic);
stringToPrint = stringToPrint.Substring(charactersOnPage);
MessageBox.Show(stringToPrint.Length.ToString());
e.HasMorePages = (stringToPrint.Length > 0);
PrintBrush.Dispose();
}
我应该怎么做才能正确打印每一页?
PrintPage
事件?如果你设置了多次,这种情况可能会发生(如果你基于MSDN示例编写代码,则构造函数中的“(...)”可能有另一个赋值)。 - vesanthis.docToPrint.PrintPage += new PrintPageEventHandler
来设置打印处理程序。你每次点击按钮时都在添加它,所以你的代码会在每次按钮点击时运行多次。你不需要那个StringReader,只需要stringToPrint = this.richTextBox.Text;
。学会使用调试器并逐步执行代码以查看发生了什么是一个好时机。MessageBox 是穷人的调试器,不要再使用它了。 - LarsTech