Ir para conteúdo
  • Cadastre-se

dev botao

Manipular PDF do FortesReport CT-e


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

Recommended Posts

Boa tarde galera.

é a primeira vez que crio um tópico, e, toda ajuda e puxão de orelha será bem-vindo.

Estou precisando fazer o seguinte...

Tenho um cliente potencial que está com o operacional em uma cidade e o galpão em outra e o operacional emite os ctes (média de 125/dia) e envia o PDF para o galpão por e-mail para imprimir.

Para facilitar, na minha aplicação, eu carrego o ACBrCTe varias vezes usando o LoadFromFile sem limpar, aponto MostraPreview para True e dou o comando imprimir.

Feito isso, ele exibe no FortesReport uma única vez todos os DACTes, um por página.... é aí que o cliente clica em salvar, escolhe PDF e ele gera um único PDF com todos os CTes, óbvio, facilitando o envio de arquivo único para impressão.

O que gostaria de fazer, é manipular este salvamento, indicando: local e nome_específico deste PDF único para que minha aplicação facilite mais ainda abrindo o outlook já com o arquivo em anexo...

Mas não estou conseguindo.

Lembrando que já tentei usar o ImprimirPDF, mas ele só gera o PDF com um CTe e normalmente o último, já tentei o ImprimirPDF seguido do Imprimir e acontece a mesma coisa.

Acho que no ACBrCTe, estes comandos de Imprimir e ImprimirPDF limpam ou vão para o ultimo registro, não sei... mas para não perder, será que pode-se criar um ImprimirPDF2?? risos...

Segue comando que uso e agradeço a ajuda ou sugestões....

  LerCTe2;
  DM.ImprimirCtes.SQL.Clear;
  DM.ImprimirCtes.SQL.Add('SELECT * FROM conhecimentos WHERE ');
  DM.ImprimirCtes.SQL.Add('marca_cte = "X" AND beneficiario = "' + DM.Global.FieldByName('nome').AsString + '"');
  DM.ImprimirCtes.Open;
  DM.ImprimirCtes.First;
  Form102.ACBrCTe1.Conhecimentos.Clear;
  while not DM.ImprimirCtes.Eof do
  begin
    DM.XMLCte.SQL.Clear;
    DM.XMLCte.SQL.Add('SELECT * FROM xml_cte WHERE ');
    DM.XMLCte.SQL.Add('cte = "' + DM.ImprimirCtes.FieldByName('cte').AsString + '" AND beneficiario = "' + DM.Global.FieldByName('nome').AsString + '"');
    DM.XMLCte.SQL.Add('AND sts = "OK"');
    DM.XMLCte.Open;

    If DM.XMLCte.RecordCount = 1 Then
    begin
      TBlobField(DM.XMLCte.FieldByName('arquivo')).SaveToFile(DM.Global.FieldByName('unidade_sistema').AsString + '\' + DM.Global.FieldByName('pasta_cte').AsString + '\' + DM.ImprimirCtes.FieldByName('cte_chave').AsString + '-cte.xml');
      Form102.ACBrCTe1.Conhecimentos.LoadFromFile(DM.Global.FieldByName('unidade_sistema').AsString + '\' + DM.Global.FieldByName('pasta_cte').AsString + '\' + DM.ImprimirCtes.FieldByName('cte_chave').AsString + '-cte.xml');
    end;
    DM.ImprimirCtes.Next;
  end;
  Form102.ACBrCTeDACTeRL1.MostraPreview := True;
  Form102.ACBrCTe1.Conhecimentos.Imprimir;
//  Form102.ACBrCTe1.Conhecimentos.ImprimirPDF;
  Form102.ACBrCTeDACTeRL1.MostraPreview := False;

Link para o comentário
Compartilhar em outros sites

  • Consultores

Boa tarde Igor,

Analisando o código abaixo que se encontra na unit ACBrCTeDACTeRLClass, o componente deveria salvar em disco os PDF de cada CT-e carregado no componente.

O local onde será salvo é definido na propriedade de configuração PathPDF e os nomes dos PDF seguem o seguinte formato: <chave>-cte.pdf

    for i := 0 to TACBrCTe(ACBrCTe).Conhecimentos.Count - 1 do
    begin
      FPArquivoPDF := PathWithDelim(TACBrCTe(ACBrCTe).DACTE.PathPDF) +
          OnlyNumber(TACBrCTe(ACBrCTe).Conhecimentos.Items[i].CTe.infCTe.ID) + '-cte.pdf';

      TACBrCTe(ACBrCTE).Conhecimentos.Items[i].NomeArqPDF := FPArquivoPDF;
//      if i < TACBrCTe(ACBrCTe).Conhecimentos.Count - 1 then
//        FPArquivoPDF := FPArquivoPDF + sLinebreak;

      case TamanhoPapel of
        tpA5: TfrmDACTeRLRetratoA5.SalvarPDF(Self, TACBrCTe(ACBrCTe).Conhecimentos.Items[i].CTe, FPArquivoPDF);
        else TfrmDACTeRLRetrato.SalvarPDF(Self, TACBrCTe(ACBrCTe).Conhecimentos.Items[i].CTe, FPArquivoPDF);
      end;
    end;

 

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

Já tive a mesma necessidade para NF-e onde precisava que várias DANFEs fossem anexadas a um único PDF. Acabei utilizando a dll gsdll32.dll do GhostScript que é capaz de manipular PDFs e inclusive mesclar vários arquivos em um único arquivo. Se não conseguir de outra forma, da um toque que anexo aqui as units.

Link para o comentário
Compartilhar em outros sites

23 minutos atrás, Italo Jurisato Junior disse:

Boa tarde Igor,

Analisando o código abaixo que se encontra na unit ACBrCTeDACTeRLClass, o componente deveria salvar em disco os PDF de cada CT-e carregado no componente.

O local onde será salvo é definido na propriedade de configuração PathPDF e os nomes dos PDF seguem o seguinte formato: <chave>-cte.pdf


    for i := 0 to TACBrCTe(ACBrCTe).Conhecimentos.Count - 1 do
    begin
      FPArquivoPDF := PathWithDelim(TACBrCTe(ACBrCTe).DACTE.PathPDF) +
          OnlyNumber(TACBrCTe(ACBrCTe).Conhecimentos.Items[i].CTe.infCTe.ID) + '-cte.pdf';

      TACBrCTe(ACBrCTE).Conhecimentos.Items[i].NomeArqPDF := FPArquivoPDF;
//      if i < TACBrCTe(ACBrCTe).Conhecimentos.Count - 1 then
//        FPArquivoPDF := FPArquivoPDF + sLinebreak;

      case TamanhoPapel of
        tpA5: TfrmDACTeRLRetratoA5.SalvarPDF(Self, TACBrCTe(ACBrCTe).Conhecimentos.Items[i].CTe, FPArquivoPDF);
        else TfrmDACTeRLRetrato.SalvarPDF(Self, TACBrCTe(ACBrCTe).Conhecimentos.Items[i].CTe, FPArquivoPDF);
      end;
    end;

 

Oi Italo, boa tarde.

Então, entendi, mas pelo que vejo ele está fazendo um laço.... então ele não estaria (no meu caso) respeitando que eu carreguei varias vezes o ACBrCTe com varios xmls, pegando, acho eu, sempre o último e só gera do último, mas isso somente quando eu carrego varios xmls sem usar o clear e ao usar o ImprimirPDF.

Já com o Imprimir com a propriedade MostrarPreview como True é que eu consigo na tela, ver que estão todos ali e aí é que está, sou obrigado a salvar como pdf manualmente...

Veja quando carrego varias vezes o xml na ferramenta e mando imprimir com o mostrarpreview como true aparece como na imagem, porém, manualmente clico em salvar e etc.... escolho local e nome... ai sim da certo, mas a ideia é eu passar um nome por uma variavel e gerar o pdf...

dacte.png

20 minutos atrás, everson.turossi disse:

Já tive a mesma necessidade para NF-e onde precisava que várias DANFEs fossem anexadas a um único PDF. Acabei utilizando a dll gsdll32.dll do GhostScript que é capaz de manipular PDFs e inclusive mesclar vários arquivos em um único arquivo. Se não conseguir de outra forma, da um toque que anexo aqui as units.

Oi Everson, obrigado pela pronta resposta.

Vamos ver o que consigo, mas se der BIGODE aí a gente parte pra DLL.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Igor,

veja essa rotina:

  OpenDialog1.Title := 'Selecione o CTe';
  OpenDialog1.DefaultExt := '*-cte.xml';
  OpenDialog1.Filter := 'Arquivos CTe (*-cte.xml)|*-cte.xml|Arquivos XML (*.xml)|*.xml|Todos os Arquivos (*.*)|*.*';
  OpenDialog1.InitialDir := ACBrCTe1.Configuracoes.Arquivos.PathSalvar;

  if OpenDialog1.Execute then
  begin
    ACBrCTe1.Conhecimentos.Clear;
    ACBrCTe1.Conhecimentos.LoadFromFile(OpenDialog1.FileName);
  end;

  OpenDialog1.Title := 'Selecione o CTe';
  OpenDialog1.DefaultExt := '*-cte.xml';
  OpenDialog1.Filter := 'Arquivos CTe (*-cte.xml)|*-cte.xml|Arquivos XML (*.xml)|*.xml|Todos os Arquivos (*.*)|*.*';
  OpenDialog1.InitialDir := ACBrCTe1.Configuracoes.Arquivos.PathSalvar;

  if OpenDialog1.Execute then
  begin
    ACBrCTe1.Conhecimentos.LoadFromFile(OpenDialog1.FileName);
    ACBrCTe1.Conhecimentos.ImprimirPDF;
  end;

Inicialmente ela pede o primeiro XML, limpa o componente e carrega o XML.

Depois pede o segundo XML (chave diferente do primeiro), carrega o XML e executa o método ImprimirPDF.

Desta forma essa rotina gerou o PDF dos dois DACTE e salvou eles na pasta definida em PathPDF.

A única diferença é que não gera um único PDF com os dois DACTE que acredito que é o que você deseja.

Mas talvez seria possível criar uma rotina para gerar um ZIP com todos os PDF.

  • Curtir 1
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

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