Ir para conteúdo
  • Cadastre-se

dev botao

NFSeX - Método para gerar imagem BMP da Nota Fiscal


Ivan Orosco
  • Este tópico foi criado há 667 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Olá, tive a necessidade de implementar um método para gerar a NFSe em formato de imagem BMP, gostaria que fosse anexado aos fontes do projeto, segue abaixo as alterações que realizei e os arquivos anexados:

ACBrNFSeXDANFSeClass.pas:

///declaração 
procedure SalvarDANFSeBMP(NFSe: TNFSe = nil); overload; virtual;

///implementação 
procedure TACBrNFSeXDANFSeClass.SalvarDANFSeBMP(NFSe: TNFSe);
begin
  ErroAbstract('SalvarDANFSeBMP');
end;

ACBrNFSeXDANFSeRLClass.pas

///declaração 
procedure SalvarDANFSeBMP(NFSe: TNFSe = nil); overload; override;

///implementação 
procedure TACBrNFSeXDANFSeRL.SalvarDANFSeBMP(NFSe: TNFSe);
var
  i: integer;
begin
  TfrlXDANFSeRLRetrato.QuebradeLinha(TACBrNFSeX(ACBrNFSe).Provider.ConfigGeral.QuebradeLinha);

  if NFSe = nil then
  begin
    for i := 0 to TACBrNFSeX(ACBrNFSe).NotasFiscais.Count - 1 do
    begin
      if Trim(self.NomeDocumento) <> ''  then
        FPArquivoPDF := PathWithDelim(Self.PathPDF) + self.NomeDocumento + '.bmp'
      else
        FPArquivoPDF := PathWithDelim(Self.PathPDF) +
          TACBrNFSeX(ACBrNFSe).NumID[TACBrNFSeX(ACBrNFSe).NotasFiscais.Items[i].NFSe] + '.bmp';

      TfrlXDANFSeRLRetrato.SalvarBMP(Self, TACBrNFSeX(ACBrNFSe).NotasFiscais.Items[i].NFSe, FPArquivoPDF);
    end;
  end
  else
  begin
    if Trim(self.NomeDocumento) <> ''  then
      FPArquivoPDF := PathWithDelim(Self.PathPDF) + self.NomeDocumento + '.bmp'
    else
      FPArquivoPDF := PathWithDelim(Self.PathPDF) + TACBrNFSeX(ACBrNFSe).NumID[NFSe] + '.bmp';

    TfrlXDANFSeRLRetrato.SalvarBMP(Self, NFSe, FPArquivoPDF);
  end;
end;

ACBrNFSeXDANFSeRL.pas

///declaração 
class procedure SalvarBMP(ADANFSe: TACBrNFSeXDANFSeRL; ANFSe: TNFSe; AFile: String); overload;

///implementação 
class procedure TfrlXDANFSeRL.SalvarBMP(ADANFSe: TACBrNFSeXDANFSeRL; ANFSe: TNFSe; AFile: String);
var
  DANFSeReport: TfrlXDANFSeRL;
  Bitmap: TBitmap;
  i: integer;
  NomeArquivo: string;
begin
  DANFSeReport := Create(nil);
  try
    DANFSeReport.fpNFSe := ANFSe;
    DANFSeReport.fpDANFSe := ADANFSe;
    if ADANFSe.AlterarEscalaPadrao then
    begin
      DANFSeReport.Scaled := False;
      DANFSeReport.ScaleBy(ADANFSe.NovaEscala , Screen.PixelsPerInch);
    end;

    TDFeReportFortes.AjustarReport(DANFSeReport.RLNFSe, DANFSeReport.fpDANFSe);

    DANFSeReport.RLNFSe.Prepare;

     for i := 0 to DANFSeReport.RLNFSe.Pages.PageCount - 1 do
     begin
       Bitmap := NeedAuxBitmap;
       Bitmap.Width := DANFSeReport.RLNFSe.Pages[i].Width;
       Bitmap.Height := DANFSeReport.RLNFSe.Pages[i].Height;
       Bitmap.PixelFormat := pf32bit;

       Bitmap.Canvas.Brush.Color := clWhite;
       Bitmap.Canvas.Brush.Style := bsSolid;
       Bitmap.Canvas.FillRect(Rect(0, 0, Bitmap.Width, Bitmap.Height));

       DANFSeReport.RLNFSe.Pages[i].PaintTo(Bitmap.Canvas, Rect(0, 0, Bitmap.Width, Bitmap.Height));
       NomeArquivo := ChangeFileExt(AFile, '');
       Bitmap.SaveToFile(NomeArquivo + FormatCurr('000', I+1) + '.bmp');
     end;

  finally
    FreeAndNil(DANFSeReport);
  end;
end;

[]'s

ACBrNFSeXDANFSeClass.pas ACBrNFSeXDANFSeRL.pas ACBrNFSeXDANFSeRLClass.pas

Link para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • Administradores

Boa tarde,

Nos desculpe a demora no retorno...mas poderia explicar qual foi a necessidade que motivou esta implementação?

At.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...

Sim claro, tenho um pequeno sistema de controle de cobrança do qual existe uma funcionalidade que gera uma "previsão" de envio de cobrança, onde ele apresenta a mensagem que será enviada por e-mail "traduzida" de acordo com uma configuração de tags dinâmicas na mensagem original, e também apresenta a imagem do boleto gerado e a imagem da nota fiscal, tudo de uma maneira bastante simples, separado por 3 abas (Mensagem, Boleto, NFSe) para que o usuário visualize rapidamente essas informações antes de fazer o envio por e-mail. Se eu fosse utilizar o método de pré-visualização do componente de impressão não seria possível obter o mesmo resultado, nem mesmo utilizando o arquivo PDF gerado, que me forçaria a utilizar componentes externos para visualizar o seu conteúdo, por isso utilizei a implementação de geração de imagem de boleto que já existia e a refiz no ACBRNFSeX, pois inclusive quando a nota fiscal é gerada eu já gravo a imagem da mesma no banco para ser utilizada nessa pré-visualização de cobrança, resultando em uma operação muito mais rápida do que executar novamente o componente do ACBRNFSeX para montar a exibição da nota fiscal.

[]'s

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Moderadores

Boa tarde.

discutimos entre os consultores e caimos na seguinte situação, se implementarmos isso será necessário colocar em fast report também, além de todos os demais impressos.

uma sugestão é tu colocar um visualizador de pdf dentro de sua aplicação e abrir. como sugestão chegou a testar esse https://www.gnostice.com/PDFtoolkit_VCL.asp

  • Curtir 2
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

Boa tarde, então, antes de implementar isso pesquisei e vi esse PDFToolkit, ele é pago... outras soluções disponíveis dependem da instalação da aplicação para abrir o pdf na maquina do usuário e não funcionaram muito bem, por isso acabei implementando a exportação de imagem mesmo.

No entanto... entendo que faz sentido ter o mesmo recurso de uma engine de relatório para os outros já existentes, mas também entendo que uma coisa não exclui a outra, se alguém tiver a necessidade de fazer a mesma coisa que eu fiz para outro engine como o fast, que implemente, ja tem até o exemplo do código funcional pra isso... afinal eh um código aberto. Enfim, é uma pequena contribuição que fiz para o Fortes, um recurso a mais para o ACBRNFSeX, mas se não for aceita vou viver fazendo merge aqui só 🤣

Link para o comentário
Compartilhar em outros sites

  • Moderadores

uma outra solução pra ti não viver com merge. é tu fazer um helper no delphi e dai só declara a uses onde for usar e chamar vai fazer o seu método.

Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
 

 

Link para o comentário
Compartilhar em outros sites

  • Administradores

Boa tarde,

20 horas atrás, Ivan Orosco disse:

entendo que faz sentido ter o mesmo recurso de uma engine de relatório para os outros já existentes, mas também entendo que uma coisa não exclui a outra, se alguém tiver a necessidade de fazer a mesma coisa que eu fiz para outro engine como o fast, que implemente,

Ficamos muito gratos por sua iniciativa, mas para que evitemos os problemas relativos a falta de padrão entre os reports, vamos aguardar um colega da comunidade nos enviar as alterações para o fast.

At.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 667 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.