José Carlos,
1º Ponto
printDocument3.DocumentName = @"d:\taveiratxt";
Esse não é o nome do seu arquivo em disco. Ok ? DocumentName refere-se ao nome do arquivo a ser impresso. Isso é enviado ao spoller de impressão do windows para que seja feita a impressão.
2º Ponto
Você está fazendo a chamada do evento que indicara que a impressão terminou no seu método construtor. Ou seja, antes do seu Form Carregar, geralmente esse não é o comportamento desejado.
3º Ponto
Você começou com a trabalhar com o printDocument3 e mandou imprimir o printDocument1.
Fiz um exemplo abaixo que exibe a MessageBox ao termino da impressão. O evento responsável por isso é o EndPrint.
private void printButton_Click(object sender, EventArgs e)
{
printDocument1.DocumentName = "Nome do arquivo";
printDocument1.PrintPage += printDocument1_PrintPage;
printDocument1.Print();
printDocument1.EndPrint += printDocument1_EndPrint;
}
void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
e.Graphics.DrawString("Exemplo", new Font("Arial", 80, FontStyle.Bold), Brushes.Black, 150, 125);
}
void printDocument1_EndPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
MessageBox.Show("A impressão acabou");
}
Acredito que o artigo abaixo possa te ajudar.
http://www.macoratti.net/12/05/c_prt1.htm