Fórum Impressao de Nota Fiscal em Formulario Continuo #2531
04/02/2009
0
Olá
Bom eu tenho a seguinte situação, estou precisando programar um rotina de impressão de nota fiscal e não sei por onde começar, eu tive a idéia inicial de usar o PrintDocument
Bom a questão e a seguinte será que vcs não teria o caminho das pedras para que eu possa começar a programar essa rotina?
Detalhe eu estou trabalhando com Windows Form e optei por postar aqui por acreditar que vcs tenham mais experiência nesse tipo de situação.
Fico no aguardo de uma resposta, e agradeço desde já
Daniel Porfirio
Curtir tópico
+ 0
Responder
Posts
04/02/2009
Luiz Maia
Olá Daniel, tudo bom?
Caso seja um impressora fiscal alguns fornecedores fornecem DLLs e componentes para que seja feito a implementação no sistema.
Caso seja uma impressora normal e a folha tenha um desenho próprio você pode utilizar o próprio comando objeto printer e ir na base da tentativa e erro para achar as posições corretas.
Se vc estiver criando uma nova class apartir da PrintDocument. ai vai ...
public partial class NotaFiscal : Form
{
class ImprimeNF : PrintDocument
{
public Single linesPerPage;
public Single yPos;
public Int32 count;
public Single leftMargin;
public Single topMargin;
public Font printFont;
public DataTableReader dr;
public bool fimRelatorio = false;
public PrintPageEventArgs imprime_ev; public string Codigo
{
get { return this.dr.GetString(0).ToString(); }
} public ImprimeNF(DataTable Tabela)
{
linesPerPage = 0;
yPos = 0;
count = 0;
leftMargin = 0;
topMargin = 0;
printFont = new Font("arial", 10);
dr = new DataTableReader(Tabela);
}
internal void Cabec()
{
string line = "";
for (int i = 0; i < dr.FieldCount; i++)
{
line += dr.GetName(i) + " ";
}
ImprimeLinha(line);
count = 2;
yPos = topMargin + (count * printFont.GetHeight(imprime_ev.Graphics)); }
internal void Imprime()
{
ImprimeLinha(Codigo);
count++;
yPos = topMargin + (count * printFont.GetHeight(imprime_ev.Graphics));
}
private void ImprimeLinha(string line)
{
imprime_ev.Graphics.DrawString(line, printFont, Brushes.Black,
leftMargin, yPos, new StringFormat());
}
internal void Rodape()
{
}
}
DataSet.DadosNF dadosNF;
public NotaFiscal()
{
InitializeComponent();
} private void NotaFiscal_Load(object sender, EventArgs e)
{
this.dadosNFTableAdapter.Fill(this.dataSet.DadosNF);
dadosNF = this.dataSet.DadosNF; } private void button1_Click(object sender, EventArgs e)
{
Imprime();
}
private void Imprime()
{
ImprimeNF pd = new ImprimeNF(dadosNF);
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
pd.DocumentName = "Nota Fiscal";
pd.fimRelatorio = false;
pd.Print();
pd = null;
} void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
bool temItens = false;
ImprimeNF pd = (ImprimeNF)sender;
pd.imprime_ev = ev; // Calcula o numero de linhas por pagina
pd.linesPerPage = ev.MarginBounds.Height /
pd.printFont.GetHeight(ev.Graphics);
pd.leftMargin = ev.MarginBounds.Left;
pd.topMargin = ev.MarginBounds.Top; pd.Cabec(); temItens = pd.dr.Read (); while ( temItens )
{
pd.Imprime();
pd.count++;
if (pd.count > pd.linesPerPage)
{
break;
}
temItens = pd.dr.Read ();
}
pd.Rodape(); if (temItens) ev.HasMorePages = true;
else ev.HasMorePages = false;
}
} A Classe ImprimeNF precisa de um objecto DataTable. Uma Nota fiscal usa varias tabelas, acima é so um exemplo básico. Fique avontade para alterá-lo. Espero que ajude e aguardo seu retorno. Abraços Att Luiz Maia
{
class ImprimeNF : PrintDocument
{
public Single linesPerPage;
public Single yPos;
public Int32 count;
public Single leftMargin;
public Single topMargin;
public Font printFont;
public DataTableReader dr;
public bool fimRelatorio = false;
public PrintPageEventArgs imprime_ev; public string Codigo
{
get { return this.dr.GetString(0).ToString(); }
} public ImprimeNF(DataTable Tabela)
{
linesPerPage = 0;
yPos = 0;
count = 0;
leftMargin = 0;
topMargin = 0;
printFont = new Font("arial", 10);
dr = new DataTableReader(Tabela);
}
internal void Cabec()
{
string line = "";
for (int i = 0; i < dr.FieldCount; i++)
{
line += dr.GetName(i) + " ";
}
ImprimeLinha(line);
count = 2;
yPos = topMargin + (count * printFont.GetHeight(imprime_ev.Graphics)); }
internal void Imprime()
{
ImprimeLinha(Codigo);
count++;
yPos = topMargin + (count * printFont.GetHeight(imprime_ev.Graphics));
}
private void ImprimeLinha(string line)
{
imprime_ev.Graphics.DrawString(line, printFont, Brushes.Black,
leftMargin, yPos, new StringFormat());
}
internal void Rodape()
{
}
}
DataSet.DadosNF dadosNF;
public NotaFiscal()
{
InitializeComponent();
} private void NotaFiscal_Load(object sender, EventArgs e)
{
this.dadosNFTableAdapter.Fill(this.dataSet.DadosNF);
dadosNF = this.dataSet.DadosNF; } private void button1_Click(object sender, EventArgs e)
{
Imprime();
}
private void Imprime()
{
ImprimeNF pd = new ImprimeNF(dadosNF);
pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);
pd.DocumentName = "Nota Fiscal";
pd.fimRelatorio = false;
pd.Print();
pd = null;
} void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
bool temItens = false;
ImprimeNF pd = (ImprimeNF)sender;
pd.imprime_ev = ev; // Calcula o numero de linhas por pagina
pd.linesPerPage = ev.MarginBounds.Height /
pd.printFont.GetHeight(ev.Graphics);
pd.leftMargin = ev.MarginBounds.Left;
pd.topMargin = ev.MarginBounds.Top; pd.Cabec(); temItens = pd.dr.Read (); while ( temItens )
{
pd.Imprime();
pd.count++;
if (pd.count > pd.linesPerPage)
{
break;
}
temItens = pd.dr.Read ();
}
pd.Rodape(); if (temItens) ev.HasMorePages = true;
else ev.HasMorePages = false;
}
} A Classe ImprimeNF precisa de um objecto DataTable. Uma Nota fiscal usa varias tabelas, acima é so um exemplo básico. Fique avontade para alterá-lo. Espero que ajude e aguardo seu retorno. Abraços Att Luiz Maia
Responder
Gostei + 0
05/02/2009
Luiz Maia
Olá Daniel,
Como não obtivemos resposta ou feedback, estamos concluindo o chamado.
Lembrando que continuamos a sua disposição.
Abraços
Att,
Luiz Maia
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)