Ir para conteúdo
  • Cadastre-se

dev botao

Erro Ao Imprimir Lista De Boletos No Fortes Report


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

Recommended Posts

Olá.

 

Estou com o seguinte problema...

 

Ao tentar imprimir uma lista de boletos, 16 pra ser mais exato.

Tenho a seguinte mensagem: Project *.exe raised excepiton class Exception with message 'File is corrupted!'

 

Estou usando a versao 3,71 do fortes e delphi xe2

 

ja tentei reinstalar o acbrboleto, o fortes e tbm o ACBrBoletoFCFortes e nada de funcionar..

 

O impressionante é que fiz o teste no demo do acbr boleto e lá funciona perfeitamente com qualquer quantidade de boletos na lista..

 

Se alguem puder me ajudar ficarei muito grato.

post-733-0-92524500-1362679606_thumb.png

Link para o comentário
Compartilhar em outros sites

Olá Marcio Rossato.

 

Obrigado pela dica. 

 

Já fiz esta alteração segue o codigo

 

 

procedure TDmContasReceber.GerarPDFBoletos;
var
  CaminhoArquivo: AnsiString;
begin
  CaminhoArquivo := DMPrinc.CaminhoExe + 'Boletos\' +
    FormatDateTime('yyyymm', ACBrBoleto1.ListadeBoletos.Objects[0].DataDocumento);
  if not DirectoryExists(CaminhoArquivo) then
    ForceDirectories(CaminhoArquivo);
  ACBrBoleto1.ACBrBoletoFC.NomeArquivo := CaminhoArquivo + '\' + ACBrBoleto1.ListadeBoletos.Objects[0].NumeroDocumento + '.PDF' ;
  ACBrBoleto1.GerarPDF;
end;
 
 
também já tentei comentar este código e não resolveu..
 
Só pra confirmar o erro se dá ao imprimir em tela (preview)...
 
Obrigado..
Link para o comentário
Compartilhar em outros sites

o problema acontece só quando são vários boletos ? quando é apenas 1 imprime normalmente ?

Olá Danilo

 

Sim o erro acontece apenas quando é mais de um boleto... quando é so 1 imprime normalmente...

 

Ao imprimir aparece a barra de progresso mas quanto vai mostrar na tela dá o erro...

 

Estou enviando a tela do fortes apos o erro...

 

 

Obrigado

post-733-0-78580700-1362683127_thumb.jpg

Link para o comentário
Compartilhar em outros sites

qual código vc usa para mandar imprimir a lista ?

primeiro eu passo os dados do banco

 

 

with ACBrBoleto1 do
      begin
        if cdsContaLAYOUTARQ.AsString = '240' then
          LayoutRemessa := c240
        else
        if cdsContaLAYOUTARQ.AsString = '400' then
          LayoutRemessa := c400;
 
        // dados da conta
        Banco.Nome := cdsContaRZSOCIALBAN.AsString;
        Banco.Numero := cdsContaNUMBAN.AsInteger;
        Banco.Digito := cdsContaDIGITOBAN.AsInteger;
 
        case cdsContaNUMBAN.AsInteger of
          1             : Banco.TipoCobranca := cobBancoDoBrasil;
          004           : Banco.TipoCobranca := cobBancoDoNordeste;
          756           : Banco.TipoCobranca := cobBancoob;
          021           : Banco.TipoCobranca := cobBanestes;
          041           : Banco.TipoCobranca := cobBanrisul;
          237           : Banco.TipoCobranca := cobBradesco;
          070           : Banco.TipoCobranca := cobBRB;
          104           : Banco.TipoCobranca := cobCaixaSicob;
          399           : Banco.TipoCobranca := cobHSBC;
          341           : Banco.TipoCobranca := cobItau;
          389           : Banco.TipoCobranca := cobBancoMercantil;
          33,53,008     : Banco.TipoCobranca := cobSantander;
          748           : Banco.TipoCobranca := cobSicred;
        else
          Banco.TipoCobranca := cobNenhum;
        end;
 
        ACBrBoletoFCFortes1.DirLogo := DMPrinc.CaminhoExe + '\\LogosBoletos\Colorido\';
        if Layout = lbPadrao then
        begin
        //  ACBrBoletoFCQuick1.FastReportFile := DMPrinc.CaminhoExe + '\Report\Boleto.fr3';
          ACBrBoletoFCFortes1.LayOut := lPadrao;
        end
        else
        if Layout = lbCarne then
        begin
    //      ACBrBoletoFCQuick1.FastReportFile := DMPrinc.CaminhoExe + '\Report\BoletoCarne.fr3';
          ACBrBoletoFCFortes1.LayOut := lCarne;
        end;
      end;
 
 
depois preencho a lista de boletos
=====================================================================================================================================
 
with ACBrBoleto1, DMConta, DMEmpresa do
    begin
      // dados cedente
      Cedente.Agencia := cdsContaAGENCIA.AsString;
      Cedente.AgenciaDigito := cdsContaDIGITOAG.AsString;
      Cedente.Bairro := CdsEmpresaBAIRROEMPRESA.AsString;
      Cedente.CEP := CdsEmpresaCEPEMPRESA.AsString;
      Cedente.Cidade := CdsEmpresaNOMECID.AsString;
      if cdsContaCPFCON.AsString <> ''  then
        Cedente.CNPJCPF := cdsContaCPFCON.AsString
      else
        Cedente.CNPJCPF := cdsEmpresaCNPJEMPRESA.AsString;
      Cedente.CodigoCedente := cdsContaCEDENTE.AsString;
      Cedente.CodigoTransmissao := cdsContaCODIGOTRANSMISSAO.AsString;
      Cedente.Complemento := CdsEmpresaCOMPLEMPRESA.AsString;
      Cedente.Conta := cdsContaNUMCONTA.AsString;
      Cedente.ContaDigito := cdsContaDIGITOCC.AsString;
      Cedente.Convenio := cdsContaCONVENIO.AsString;
      Cedente.Logradouro := CdsEmpresaENDEEMPRESA.AsString;
      Cedente.Modalidade := cdsContaMODALIDADE.AsString;
      Cedente.Nome := cdsContaNOMECEDENTE.AsString;
      Cedente.NumeroRes := CdsEmpresaNUMEMPRESA.AsString;
      Cedente.ResponEmissao := tbCliEmite;
      Cedente.TipoInscricao := pJuridica;
      Cedente.UF := CdsEmpresaUF.AsString;
 
      CdsFaturas.First;
      ACBrBoleto1.ListadeBoletos.Clear;
      while not CdsFaturas.Eof do
      begin
                Application.ProcessMessages;
        Titulo := ACBrBoleto1.CriarTituloNaLista;
        with Titulo do
        begin
          if cdsContaACEITE.AsString = 'SIM' then
            Titulo.Aceite := atSim
          else
            Titulo.Aceite := atNao;
 
          Titulo.Carteira := cdsContaCARTEIRA.AsString;
          Titulo.DataDocumento := CdsFaturasDATAFATURA.AsDateTime;
          Titulo.DataProcessamento := DMPrinc.DataServidor;
//          Titulo.DescricaoMotivoRejeicaoComando := '';
//          Titulo.DataOcorrencia :=
//          Titulo.DataCredito :=
//          Titulo.DataAbatimento :=
//          Titulo.DataDesconto :=
//          Titulo.DataMoraJuros :=
          Titulo.DataProtesto := CdsFaturasVENCIMENTO.AsDateTime +
                          cdsContaDIASPROTESTO.AsInteger;
//          Titulo.DataBaixa :=
          Titulo.EspecieDoc := cdsContaESPECIEDOC.AsString;
          Titulo.EspecieMod := cdsContaESPECIE.AsString;
//          Titulo.Instrucao1 :=
//          Titulo.Instrucao2 :=
          Titulo.LocalPagamento := cdsContaLOCALPAGTO.AsString;
//          Titulo.Mensagem :=
//          Titulo.MotivoRejeicaoComando :=
          Titulo.NumeroDocumento := CdsFaturasDOCPRINCIPAL.AsString;
          Titulo.NossoNumero := CdsFaturasNOSSONUMERO.AsString;
//          Titulo.OcorrenciaOriginal.Tipo := TipoOcorrencia;
          Titulo.TotalParcelas := CdsFaturasQTDPARCELAS.AsInteger;
          Titulo.Parcela := CdsFaturasPARCELA.AsInteger;
          Titulo.PercentualMulta := cdsContaPERCMULTA.AsFloat;
//          titulo.Referencia :=
//          Titulo.Sacado.Avalista :=
          Titulo.Sacado.Bairro := CdsFaturasBAIRROPES.AsString;
          Titulo.Sacado.CNPJCPF := CdsFaturasCPFCNPJCHQ.AsString;
          Titulo.Sacado.Complemento := CdsFaturasCOMPLEMENTO.AsString;
          Titulo.Sacado.Cidade := CdsFaturasNOMECID.AsString;
          Titulo.Sacado.CEP := CdsFaturasCEPPES.AsString + ' - ' + CdsFaturasBAIRROPES.AsString;
          Titulo.Sacado.Email := CdsFaturasEMAILCOBRANCAPES.AsString;
//          Titulo.Sacado.Fone :=
          Titulo.Sacado.Logradouro := CdsFaturasENDERECOPES.AsString;
          Titulo.Sacado.NomeSacado := CdsFaturasCODPES.AsString + ' - ' + CdsFaturasNOMEPES.AsString;
          Titulo.Sacado.Numero := CdsFaturasNUMEROPES.AsString;
          if Length(CdsFaturasCPFCNPJPES.AsString) > 11 then
            Titulo.Sacado.Pessoa := pJuridica
          else
            Titulo.Sacado.Pessoa := pFisica;
          Titulo.Sacado.UF := CdsFaturasUF.AsString;
          Titulo.SeuNumero := CdsFaturasDOCUMENTO.AsString;
          Titulo.Vencimento := CdsFaturasVENCIMENTO.AsDateTime;
          Titulo.ValorDocumento := CdsFaturasVLRABERTO.AsFloat;
          Titulo.ValorDespesaCobranca := 0;
          Titulo.ValorAbatimento := 0;
          Titulo.ValorDesconto := 0;
          Titulo.ValorMoraJuros := ((CdsFaturasVALOR.AsFloat / 100) *
                            (cdsContaPERCJUROSATRASO.AsFloat / 30));
          Titulo.ValorIOF := 0;
          Titulo.ValorOutrasDespesas := 0;
          Titulo.ValorOutrosCreditos := 0;
//          Titulo.ValorRecebido := 0;
          Titulo.Versao := '1.0';
          //  ACBrBoleto1.AdicionarMensagensPadroes(Titulo,Mensagem);
              Application.ProcessMessages;
                frmInfoOperacao.pgbInfo.Position := frmInfoOperacao.pgbInfo.Position + 1;
              Application.ProcessMessages;
          CdsFaturas.Next;
        end;
      end;
 
      if Vizualizar then
        ACBrBoleto1.Imprimir;
    end;
 
============================================
 
 
uso a mesma função para imprimir 1 boleto ou vários....
 
 
Link para o comentário
Compartilhar em outros sites

quanto a essa parte:

 

  if Vizualizar then
        ACBrBoleto1.Imprimir;

 

-já tentou tirar esse if ... deixar o metodo imprimir direto ? 

-no ACBrBoletoFCFortes1 vc já tentou usando false ? 

 

não me lembro o pq, mas eu tive problemas com o preview, então eu mando gerar um pdf e em seguida abrir esse pdf.. 

Link para o comentário
Compartilhar em outros sites

Se eu utilizar o componente acbrboletofcquick funciona perfeitamente.... mas nao consigo deixar ele maximizado na hora do preview...

 

vc usa algum componente para skin ? 

 

eles costumam interferir no preview, seria recomendável desabilitar a aplicação do skin nos forms de preview.

Link para o comentário
Compartilhar em outros sites

quanto a essa parte:

 

  if Vizualizar then
        ACBrBoleto1.Imprimir;

 

-já tentou tirar esse if ... deixar o metodo imprimir direto ? tentei tirar esse if e não resolveu....

-no ACBrBoletoFCFortes1 vc já tentou usando false ? me desculpe mas nao entendi essa dica....

 

não me lembro o pq, mas eu tive problemas com o preview, então eu mando gerar um pdf e em seguida abrir esse pdf.. 

 

 

procedure TACBrBoletoFCClass.GerarPDF;
var
   FiltroAntigo         : TACBrBoletoFCFiltro;
   MostrarPreviewAntigo : Boolean;
   MostrarSetupAntigo   : Boolean;
begin
   if NomeArquivo = '' then
      raise Exception.Create( ACBrStr('NomeArquivo não especificado')) ;
 
   FiltroAntigo         := Filtro;
   MostrarPreviewAntigo := MostrarPreview;
   MostrarSetupAntigo   := MostrarSetup;
   try
     Filtro         := fiPDF;
     MostrarPreview := false;
     MostrarSetup   := false;
 
     Imprimir;  ====>>> aqui é onde dá o erro quando tento gerar o pdf (o mesmo erro);
   finally
     Filtro         := FiltroAntigo;
     MostrarPreview := MostrarPreviewAntigo;
     MostrarSetup   := MostrarSetupAntigo;
   end;
end;

 

 

Obrigado

Link para o comentário
Compartilhar em outros sites

quanto a essa parte:

 

  if Vizualizar then
        ACBrBoleto1.Imprimir;

 

-já tentou tirar esse if ... deixar o metodo imprimir direto ? 

-no ACBrBoletoFCFortes1 vc já tentou usando false ? 

 

não me lembro o pq, mas eu tive problemas com o preview, então eu mando gerar um pdf e em seguida abrir esse pdf.. 

segue função que fiz para gerar pdf e abrir o mesmo....

 

 

 

procedure TDmContasReceber.GerarPDFBoletos;
var
  CaminhoArquivo: AnsiString;
begin
  CaminhoArquivo := DMPrinc.CaminhoExe + 'Boletos\' +
    FormatDateTime('yyyymm', ACBrBoleto1.ListadeBoletos.Objects[0].DataDocumento);
  if not DirectoryExists(CaminhoArquivo) then
    ForceDirectories(CaminhoArquivo);
 
  ACBrBoleto1.ACBrBoletoFC.NomeArquivo := CaminhoArquivo + '\' + ACBrBoleto1.ListadeBoletos.Objects[0].NumeroDocumento + '.PDF' ;
 
  ACBrBoleto1.GerarPDF;
  ShellExecute(Handle, nil, ACBrBoleto1.ACBrBoletoFC.NomeArquivo , nil, nil, SW_SHOWNORMAL);
end;
 
Obrigado Pela Ajuda Danilo.
Link para o comentário
Compartilhar em outros sites

quanto a essa parte:

 

  if Vizualizar then
        ACBrBoleto1.Imprimir;

 

-já tentou tirar esse if ... deixar o metodo imprimir direto ? 

-no ACBrBoletoFCFortes1 vc já tentou usando false ? 

 

não me lembro o pq, mas eu tive problemas com o preview, então eu mando gerar um pdf e em seguida abrir esse pdf.. 

 

procedure TACBrBoletoFCFortes.Imprimir;
 
var
  frACBrBoletoFortes : TACBRBoletoFCFortesFr;
  RLFiltro : TRLCustomSaveFilter;
  RLLayout: TRLReport;
begin
  inherited Imprimir;    // Executa verificações padroes
 
  {$IFDEF FPC}
   LoadPortugueseStrings;
  {$ELSE}
   // Para que serve esse método ?? //
   SetVersion( CommercialVersion, ReleaseVersion, CommentVersion );
  {$ENDIF}
 
  frACBrBoletoFortes := TACBrBoletoFCFortesFr.Create(Self);
  try
     with frACBrBoletoFortes do
     begin
        case LayOut of
           lCarne : RLLayout:= BoletoCarne;
        else
           RLLayout:= LayoutBoleto;
        end;
 
        RLPrinter.Copies     := NumCopias ;  // Aparentemente isso está errado... :(
        RLLayout.PrintDialog := MostrarSetup;
 
        if Filtro = fiNenhum then
         begin
           if MostrarPreview then
              RLLayout.PreviewModal
           else
              RLLayout.Print;
         end
        else
         begin
            if RLLayout.Prepare then
            begin
               case Filtro of
                 fiPDF  : RLFiltro := RLPDFFilter1;
                 fiHTML : RLFiltro := RLHTMLFilter1;
               else
                 exit ;
               end ;
 
              {$IFDEF FPC}
                RLFiltro.Copies := NumCopias ;
              {$ENDIF}
              RLFiltro.FileName := NomeArquivo ;
 
              {$IFDEF FPC}
                RLFiltro.Pages := RLLayout.Pages ;
                RLFiltro.FirstPage := 1;
                RLFiltro.LastPage := RLLayout.Pages.PageCount;
                RLFiltro.Run;
              {$ELSE}
                RLFiltro.FilterPages( RLLayout.Pages ); // quando passa por esta linha que o erro acontece.....até aqui vai tudo bem....esta é a função imprimir que falei mais acima
              {$ENDIF}
            end;
         end;
     end;
  finally
     frACBrBoletoFortes.Free ;
  end;
end;
Link para o comentário
Compartilhar em outros sites

  • 3 meses depois ...
  • 1 ano depois...
  • 7 meses depois ...

Boa tarde.

Enfrentei esse mesmo problema e o resolvi fazendo a seguinte alteração no Fortes Report na unit "RLMetaFile.pas" no procedimento "TRLGraphicSurface.LoadFromStream":

procedure TRLGraphicSurface.LoadFromStream(AStream: TStream);
  procedure LoadHeaderFromStream(AStream: TStream);
  var
  data: AnsiString;
  ch: char;
  I: Integer;
  begin
  SetLength(data, MaxSurfaceHeader);
  I := 0;
  while (I < MaxSurfaceHeader) and (AStream.Read(ch, 1) = 1) do
  begin
    Inc(I);
    data[I] := AnsiChar(ch);
    if AnsiChar(ch) = #26 then // Alterado aqui.
    Break;
  end;
  SetLength(data, I);
  if data <> SurfaceHeaderStr then
    raise Exception.Create('File is corrupted!');
  end;
  procedure LoadBoundsFromStream(AStream: TStream);
  begin
  AStream.Read(FWidth, SizeOf(FWidth));
  AStream.Read(FHeight, SizeOf(FHeight));
  end;
  procedure LoadMacrosFromStream(AStream: TStream);
  var
  count, len, I: Integer;
  ln: AnsiString;
  begin
  AStream.Read(count, SizeOf(count));
  // grava símbolos e seus valores
  for I := 0 to count - 1 do
  begin
    // lê length + nome
    AStream.Read(len, SizeOf(len));
    SetLength(ln, len);
    AStream.Read(ln[1], len);
    //
    FMacros.Add(ln);
  end;
  end;
  procedure LoadFontsFromStream(AStream: TStream);
  var
  count, len, I: Integer;
  name: AnsiString;
  begin
  AStream.Read(count, SizeOf(count));
  // carrega nomes das fontes
  for I := 0 to count - 1 do
  begin
    AStream.Read(len, SizeOf(len));
    SetLength(name, len);
    AStream.Read(name[1], len);
    FFonts.Add(name);
  end;
  end;
  procedure LoadObjectsFromStream(AStream: TStream);
  var
  count: Integer;
  size: Integer;
  kind: TGraphicObjectKind;
  creator: TRLGraphicObjectClass;
  I: Integer;
  begin
  AStream.Read(count, SizeOf(count));
  for I := 0 to count - 1 do
  begin
    AStream.Read(kind, SizeOf(kind));
    AStream.Read(size, SizeOf(size));
    creator := GraphicObjectClass(kind);
    // se a classe não for conhecida, salta o segmento
    if creator <> nil then
    creator.Create(Self).LoadFromStream(AStream)
    else
    AStream.Position := AStream.Position + size; 
  end;
  end;
begin
  Clear;
  LoadHeaderFromStream(AStream);
  LoadBoundsFromStream(AStream);
  LoadMacrosFromStream(AStream);
  LoadFontsFromStream(AStream);
  LoadObjectsFromStream(AStream);
end;

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Bom dia!

chegaram a olhar o anuncio na tela principal do fórum?

http://www.projetoacbr.com.br/forum/announcement/12-novo-fortes-report-ce-e-projeto-acbr/

  • Curtir 1
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

Bom dia.

Estou com o mesmo problema no Delphi XE5. No Delphi 7 isso não acontece.

Percebi que isso ocorre sempre que a lista de boletos tem mais que 5.

Tentei usar a solução do amigo Jacinto Junior, mas não resolveu.

Obrigado.

Olá brsamn, se fizer essa mudança e fazer um build no pacto do componente Fortes Report seguramente irá resolver. O problema ocorre acima de cinco páginas devido ao fato de uma característica do próprio componente que faz armazenamento em disco para impressões maiores que cinco páginas, e o problema ocorre justamente ao recuperar esse arquivo armazenado.

Como exposto pelo Juliomar, recentemente foram corrigidos alguns bugs no Fortes, então talvez esse já tenha sido sanado com outra estratégia.

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

  • Este tópico foi criado há 2977 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.

The popup will be closed in 10 segundos...