[DÚVIDA] Mais de um recibo por página usando o PDF Designer Boa tarde galera. Estou montando um sistema de geração de recibos(honorários). Já montei o layout pelo PDF Designer e gostaria de saber se há alguma maneira de gerar mais de um recibo por página, pois eu consigo gerar um por página. Antes de jogar os dados do banco fiz um teste mas só gera um por página. Alguém tem uma solução? segue o código do loop public function onGeraBo...
LC
[DÚVIDA] Mais de um recibo por página usando o PDF Designer  
Boa tarde galera.
Estou montando um sistema de geração de recibos(honorários). Já montei o layout pelo PDF Designer e gostaria de saber se há alguma maneira de gerar mais de um recibo por página, pois eu consigo gerar um por página. Antes de jogar os dados do banco fiz um teste mas só gera um por página. Alguém tem uma solução? segue o código do loop
public function onGeraBoleto(){ try { $designer = new TPDFDesigner; $designer->fromXml('app/reports/honorarios.pdf.xml'); $designer->SetFont('Arial', 'B', 12); //$designer->setFontColorRGB( '#4C4491' ); $designer->SetAutoPageBreak(TRUE, 2); //loop para gerar os boletos for ($i=0;$i<12;$i++){ $designer->generate(); $designer->writeAtAnchor('nDocumento', '1'); $designer->writeAtAnchor('nDocumento1', '1'); $designer->writeAtAnchor('nParcela', '1/1'); $designer->writeAtAnchor('nParcela1', '1/1'); $designer->writeAtAnchor('dVencimento', '24/01/2017'); $designer->writeAtAnchor('dVencimento1', '24/01/2017'); $designer->writeAtAnchor('vDocumento', '3500,00'); $designer->writeAtAnchor('vDocumento1', '3500,00'); //$designer->writeAtAnchor('lPagamento', 'Solimar Contabilidade'); $designer->writeAtAnchor('nCarne', '01'); $designer->writeAtAnchor('tEspecie', utf8_decode('R$')); $designer->writeAtAnchor('dProcessamento', '24/01/2017'); //$designer->writeAtAnchor('nCedente', utf8_decode('SOLIMAR CONTABILIDADE')); $designer->writeAtAnchor('nSacado', 'Teste'); $designer->writeAtAnchor('nEndereco', 'Rua de teste - Centro'); $designer->writeAtAnchor('nCPFPJ', '000.000.000-00'); $designer->writeAtAnchor('nInstrucao01', utf8_decode('Instrução 01')); //$designer->writeAtAnchor('nInstrucao02', utf8_decode('Instrução 02')); $designer->writeAtAnchor('nReferencia', utf8_decode('Honorários Contábeis - Mensalidade')); //$designer->addPage(); }//endfor $file = 'app/output/honorarios.pdf'; if (!file_exists($file) OR is_writable($file)) { $designer->save($file); parent::openFile($file); } else { throw new Exception(_t('Permission denied') . ': ' . $file); } new TMessage('info',_t( 'Report generated. Please, enable popups in the browser (just in the web).')); } catch (Exception $e) // in case of exception { new TMessage('error', '<b>Error</b> ' . $e->getMessage()); } }

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (7)


NR

Como as âncoras tem posições fixas acho que não é possível. Você teria que criar no designer uma âncora diferente para cada recibo desejado.
LC

Obrigado pelas informações. Busquei em outros fóruns mas também nada rsr
CS

Estes dias fiz um teste e aceita mais de uma ancora com o mesmo nome, Então acho que seria o caso de colocar estas ancoras duas vezes no form na posição que vc precisa.

[]'s

Stclara.
LC

Carlos, eu resolvi de uma forma, meio robusta mas atende minhas necessidades, da seguinte maneira:
1 - Criei um layout com três recibos/boletos em uma mesma página mas com âncoras diferentes;
2 - Como o sistema vai gerar sempre 12 boletos, criei um loop pra buscar no banco de dados (ainda em desenvolvimento rsrs) que irá jogar os dados nas âncoras dependendo do número da parcela do boleto. Ex: parcela 1, 4, 7 e 10 sempre estarão no primeiro boleto da página.

Falta integrar ao banco de dados mas nos testes já funcionou perfeitamente.
Segue um trecho do código pra ajudar alguém que esteja com o mesmo problema:

<php
public function onGeraBoletoAnual(){
try
{
$designer = new TPDFDesigner;
$designer->fromXml('app/reports/honorarios3.pdf.xml');

$designer->SetFont('Arial', 'B', 12);
//$designer->setFontColorRGB( '#4C4491' );
$designer->SetAutoPageBreak(TRUE, 2);

//loop para gerar os boletos
//for ($i=1;$i<12;$i++){
$i=1;
while ($i<=12){
//GERA BOLETOS 1, 4, 7 E 10 NO PRIMEIRO MODELO DA PÁGINA
$designer->generate();
if (($i == 1) or ($i == 4) or ($i == 7) or ($i == 10)){

//$designer->generate();

$designer->writeAtAnchor('nDocumento1', $i);
$designer->writeAtAnchor('nDocumento2', '1');
$designer->writeAtAnchor('nParcela1', '1/1');
$designer->writeAtAnchor('nParcela2', '1/1');
$designer->writeAtAnchor('dVencimento1', '24/01/2017');
$designer->writeAtAnchor('dVencimento2', '24/01/2017');
$designer->writeAtAnchor('vDocumento1', '3500,00');
$designer->writeAtAnchor('vDocumento2', '3500,00');
$designer->writeAtAnchor('nCarne1', '01');
$designer->writeAtAnchor('tEspecie1', utf8_decode('R$'));
$designer->writeAtAnchor('dProcessamento1', '24/01/2017');
$designer->writeAtAnchor('nSacado1', 'Teste');
$designer->writeAtAnchor('nEndereco1', 'Rua de teste - Centro');
$designer->writeAtAnchor('nCPFPJ1', '000.000.000-00');
$designer->writeAtAnchor('tMensagem1', utf8_decode('Instrução 01'));
$designer->writeAtAnchor('tReferencia1', utf8_decode('Honorários Contábeis - Mensalidade'));
$i++;
//$designer->addPage();
}//endif

//GERA BOLETOS 2, 5, 8 E 11 NO SEGUNDO MODELO DA PÁGINA

if (($i == 2) or ($i == 5) or ($i == 8) or ($i == 11)){
//$designer->generate();
$designer->writeAtAnchor('nDocumento3', $i);
$designer->writeAtAnchor('nDocumento4', '1');
$designer->writeAtAnchor('nParcela3', '1/1');
$designer->writeAtAnchor('nParcela4', '1/1');
$designer->writeAtAnchor('dVencimento3', '24/01/2017');
$designer->writeAtAnchor('dVencimento4', '24/01/2017');
$designer->writeAtAnchor('vDocumento3', '3500,00');
$designer->writeAtAnchor('vDocumento4', '3500,00');
$designer->writeAtAnchor('nCarne2', '01');
$designer->writeAtAnchor('tEspecie2', utf8_decode('R$'));
$designer->writeAtAnchor('dProcessamento2', '24/01/2017');
$designer->writeAtAnchor('nSacado2', 'Teste');
$designer->writeAtAnchor('nEndereco2', 'Rua de teste - Centro');
$designer->writeAtAnchor('nCPFPJ2', '000.000.000-00');
$designer->writeAtAnchor('tMensagem2', utf8_decode('Instrução 01'));
$designer->writeAtAnchor('tReferencia2', utf8_decode('Honorários Contábeis - Mensalidade'));
$i++;
}

//GERA BOLETOS 3, 6, 9 E 12 NO TERCEIRO MODELO DA PÁGINA

if (($i == 3) or ($i == 6) or ($i == 9) or ($i == 12)){
//$designer->generate();
$designer->writeAtAnchor('nDocumento5', $i);
$designer->writeAtAnchor('nDocumento6', '1');
$designer->writeAtAnchor('nParcela5', '1/1');
$designer->writeAtAnchor('nParcela6', '1/1');
$designer->writeAtAnchor('dVencimento5', '24/01/2017');
$designer->writeAtAnchor('dVencimento6', '24/01/2017');
$designer->writeAtAnchor('vDocumento5', '3500,00');
$designer->writeAtAnchor('vDocumento6', '3500,00');
$designer->writeAtAnchor('nCarne3', '01');
$designer->writeAtAnchor('tEspecie3', utf8_decode('R$'));
$designer->writeAtAnchor('dProcessamento3', '24/01/2017');
$designer->writeAtAnchor('nSacado3', 'Teste');
$designer->writeAtAnchor('nEndereco3', 'Rua de teste - Centro');
$designer->writeAtAnchor('nCPFPJ3', '000.000.000-00');
$designer->writeAtAnchor('tMensagem3', utf8_decode('Instrução 01'));
$designer->writeAtAnchor('tReferencia3', utf8_decode('Honorários Contábeis - Mensalidade'));
$i++;
}

}//endwhile


$file = 'app/output/honorarios.pdf';

if (!file_exists($file) OR is_writable($file))
{
$designer->save($file);
parent::openFile($file);
}
else
{
throw new Exception(_t('Permission denied') . ': ' . $file);
}

new TMessage('info','Relatório gerado com sucesso. Desbloqueie as Pop ups');
}
catch (Exception $e) // in case of exception
{
new TMessage('error', 'Error ' . $e->getMessage());
}
}
?>
PS

Leildon Santos Carvalho, você conseguiu integrar com o Banco de Dados?
Se sim, poste aqui para tirar minha dúvida também por gentileza.
LC

Bom dia Paulo. Consegui sim. Vou postar parte do código.
 
  1. <?php
  2. public function onGeraBoletoAnual(){
  3. try
  4. {
  5. $designer = new TPDFDesigner;
  6. $designer->fromXml('app/reports/honorarios3.pdf.xml');
  7. $designer->SetFont('Arial', 'B', 12);
  8. //$designer->setFontColorRGB( '#4C4491' );
  9. $designer->SetAutoPageBreak(TRUE, 2);
  10. //loop para gerar os boletos
  11. //for ($i=1;$i<12;$i++){
  12. //CRIAÇÃO DO REPOSITÓRIO DE BOLETOS
  13. TTransaction::open('conexao'); //Abre a transação
  14. $data = $this->form->getData();
  15. $criteria = new TCriteria;
  16. $criteria->add (new TFilter('idclienteboleto','=', $data->idclienteboleto));
  17. $criteria->add (new TFilter('status','=', 'A'));
  18. $criteria->add (new TFilter('numdocumento', '=', $data->numdocumento)); //alteração 29/01/2019
  19. $repository = new TRepository('BoletosHonorarios');
  20. $boletos = $repository->load($criteria);
  21. //CRIA UMA MATRIZ PARA RECEBER OS VALORES
  22. $boleto = array (array());
  23. //INSERE OS DADOS NA MATRIZ BOLETO
  24. $x = 1;
  25. foreach($boletos as $documentos){
  26. $boleto[$x]['numdocumento'] = $documentos->numdocumento;
  27. $boleto[$x]['numparcela'] = $documentos->numparcela;
  28. $boleto[$x]['datavencimento'] = TDate::date2br(date($documentos->datavencimento));
  29. $boleto[$x]['dataemissao'] = TDate::date2br(date($documentos->dataemissao));
  30. $boleto[$x]['valor'] = $documentos->valor;
  31. $boleto[$x]['cliente'] = $documentos->cliente->NomeRazao;
  32. $boleto[$x]['cpfcnpj'] = $documentos->cliente->CPFCNPJ;
  33. $boleto[$x]['endereco'] = $documentos->cliente->Logradouro . ',' . $documentos->cliente->Bairro . ' ' . $documentos->cliente->Cidade . '-' . $documentos->cliente->UF;
  34. //$boleto[$x]['datavencimento'] = $documentos->datavencimento;
  35. //$boleto[$x]['datavencimento'] = $documentos->datavencimento;
  36. //$boleto[$x]['datavencimento'] = $documentos->datavencimento;
  37. $x++;
  38. }
  39. $i=1; //CONTADOR PARA VERIFICAR EM QUAL PÁGINA/MODELO O BOLETO SERÁ GERADO
  40. while ($i<=12){
  41. //GERA BOLETOS 1, 4, 7 E 10 NO PRIMEIRO MODELO DA PÁGINA
  42. $designer->generate();
  43. if (($i == 1) or ($i == 4) or ($i == 7) or ($i == 10)){
  44. $designer->writeAtAnchor('nDocumento1', $boleto[$i]['numdocumento']);
  45. $designer->writeAtAnchor('nDocumento2', $boleto[$i]['numdocumento']);
  46. $designer->writeAtAnchor('nParcela1', $boleto[$i]['numparcela']);
  47. $designer->writeAtAnchor('nParcela2', $boleto[$i]['numparcela']);
  48. $designer->writeAtAnchor('dVencimento1', $boleto[$i]['datavencimento']);
  49. $designer->writeAtAnchor('dVencimento2', $boleto[$i]['datavencimento']);
  50. $designer->writeAtAnchor('vDocumento1', $boleto[$i]['valor']);
  51. $designer->writeAtAnchor('vDocumento2', $boleto[$i]['valor']);
  52. $designer->writeAtAnchor('nCarne1', '01');
  53. $designer->writeAtAnchor('tEspecie1', utf8_decode('R$'));
  54. $designer->writeAtAnchor('dProcessamento1', $boleto[$i]['dataemissao']);
  55. $designer->writeAtAnchor('nSacado1', $boleto[$i]['cliente']);
  56. $designer->writeAtAnchor('nEndereco1', utf8_decode($boleto[$i]['endereco']));
  57. $designer->writeAtAnchor('nCPFPJ1', $boleto[$i]['cpfcnpj']);
  58. $designer->writeAtAnchor('tMensagem1', utf8_decode('Instrução 01'));
  59. $designer->writeAtAnchor('tReferencia1', utf8_decode('Honorários Contábeis - Mensalidade'));
  60. $i++;
  61. //$designer->addPage();
  62. }//endif
  63. //GERA BOLETOS 2, 5, 8 E 11 NO SEGUNDO MODELO DA PÁGINA
  64. if (($i == 2) or ($i == 5) or ($i == 8) or ($i == 11)){
  65. //if (($boletos->numparcela == '2/12') or ($boletos->numparcela == '5/12') or ($boletos->numparcela == '8/12') or ($boletos->numparcela == '11/12')){
  66. //$designer->generate();
  67. $designer->writeAtAnchor('nDocumento3', $boleto[$i]['numdocumento']);
  68. $designer->writeAtAnchor('nDocumento4', $boleto[$i]['numdocumento']);
  69. $designer->writeAtAnchor('nParcela3', $boleto[$i]['numparcela']);
  70. $designer->writeAtAnchor('nParcela4', $boleto[$i]['numparcela']);
  71. $designer->writeAtAnchor('dVencimento3', $boleto[$i]['datavencimento']);
  72. $designer->writeAtAnchor('dVencimento4', $boleto[$i]['datavencimento']);
  73. $designer->writeAtAnchor('vDocumento3', $boleto[$i]['valor']);
  74. $designer->writeAtAnchor('vDocumento4', $boleto[$i]['valor']);
  75. $designer->writeAtAnchor('nCarne2', '01');
  76. $designer->writeAtAnchor('tEspecie2', utf8_decode('R$'));
  77. $designer->writeAtAnchor('dProcessamento2', $boleto[$i]['dataemissao']);
  78. $designer->writeAtAnchor('nSacado2', $boleto[$i]['cliente']);
  79. $designer->writeAtAnchor('nEndereco2', utf8_decode($boleto[$i]['endereco']));
  80. $designer->writeAtAnchor('nCPFPJ2', $boleto[$i]['cpfcnpj']);
  81. $designer->writeAtAnchor('tMensagem2', utf8_decode('Instrução 01'));
  82. $designer->writeAtAnchor('tReferencia2', utf8_decode('Honorários Contábeis - Mensalidade'));
  83. $i++;
  84. }
  85. //GERA BOLETOS 3, 6, 9 E 12 NO TERCEIRO MODELO DA PÁGINA
  86. if (($i == 3) or ($i == 6) or ($i == 9) or ($i == 12)){
  87. //if (($boletos->numparcela == '3/12') or ($boletos->numparcela == '6/12') or ($boletos->numparcela == '9/12') or ($boletos->numparcela == '12/12')){
  88. //$designer->generate();
  89. $designer->writeAtAnchor('nDocumento5', $boleto[$i]['numdocumento']);
  90. $designer->writeAtAnchor('nDocumento6', $boleto[$i]['numdocumento']);
  91. $designer->writeAtAnchor('nParcela5', $boleto[$i]['numparcela']);
  92. $designer->writeAtAnchor('nParcela6', $boleto[$i]['numparcela']);
  93. $designer->writeAtAnchor('dVencimento5', $boleto[$i]['datavencimento']);
  94. $designer->writeAtAnchor('dVencimento6', $boleto[$i]['datavencimento']);
  95. $designer->writeAtAnchor('vDocumento5', $boleto[$i]['valor']);
  96. $designer->writeAtAnchor('vDocumento6', $boleto[$i]['valor']);
  97. $designer->writeAtAnchor('nCarne3', '01');
  98. $designer->writeAtAnchor('tEspecie3', utf8_decode('R$'));
  99. $designer->writeAtAnchor('dProcessamento3', $boleto[$i]['dataemissao']);
  100. $designer->writeAtAnchor('nSacado3', $boleto[$i]['cliente']);
  101. $designer->writeAtAnchor('nEndereco3', utf8_decode($boleto[$i]['endereco']));
  102. $designer->writeAtAnchor('nCPFPJ3', $boleto[$i]['cpfcnpj']);
  103. $designer->writeAtAnchor('tMensagem3', utf8_decode('Instrução 01'));
  104. $designer->writeAtAnchor('tReferencia3', utf8_decode('Honorários Contábeis - Mensalidade'));
  105. $i++;
  106. }
  107. }//endwhile
  108. $file = 'app/output/honorarios.pdf';
  109. if (!file_exists($file) OR is_writable($file))
  110. {
  111. $designer->save($file);
  112. parent::openFile($file);
  113. }
  114. else
  115. {
  116. throw new Exception(_t('Permission denied') . ': ' . $file);
  117. }
  118. new TMessage('info','Relatório gerado com sucesso. Desbloqueie as Pop ups');
  119. TTransaction::close(); //fecha a transação
  120. }
  121. catch (Exception $e) // in case of exception
  122. {
  123. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  124. }
  125. }
  126. ?>
PS

Boa tarde Leildon, veja o código que digitei, porém, o recibo (pdf) abre em branco, ou seja os campos não são preenchidos. Poderia analisar o código pra mim amigo? Desde já agrdeço.

 
  1. <?php
  2. //CRIA AÇÃO DE IMPRESSÃO
  3. $action_pdf = new TDataGridAction(array($this, 'onPrintRecibo'));
  4. $action_pdf->setLabel(_t('Edit'));
  5. $action_pdf->setImage('fa:pencil-square-o blue fa-lg');
  6. $action_pdf->setField('id');
  7. $this->datagrid->addAction($action_pdf);
  8. public function onPrintRecibo()
  9. {
  10. try
  11. {
  12. $designer = new TPDFDesigner;
  13. $designer->fromXml('app/reports/recibo.pdf.xml');
  14. $designer->SetFont('Arial', 'B', 10);
  15. $designer->SetAutoPageBreak(TRUE, 2);
  16. // Abre Conexão
  17. TTransaction::open('pedido');
  18. //$data = $this->form->getData('Recibos');
  19. $data = $this->form->getData();
  20. // load all customers
  21. $criteria = new TCriteria;
  22. $criteria->add (new TFilter('id','=', $data->id));
  23. $repository = new TRepository('Recibos');
  24. $recibos = $repository->load($criteria);
  25. //CRIA UMA MATRIZ PARA RECEBER OS VALORES
  26. $recibo = array (array());
  27. //INSERE OS DADOS NA MATRIZ BOLETO
  28. $x = 1;
  29. foreach($recibo as $documentos){
  30. $recibo[$x]['id'] = $documentos->id;
  31. $recibo[$x]['nome'] = $documentos->nome;
  32. $recibo[$x]['valor'] = $documentos->valor;
  33. $recibo[$x]['refere'] = $documentos->refere;
  34. $x++;
  35. }
  36. $designer->generate();
  37. //$designer->setFontColorRGB( '#4C4491' );
  38. $designer->writeAtAnchor('pagador', $recibo[$i]['nome']);
  39. $designer->writeAtAnchor('valorreal', $recibo[$i]['valor']);
  40. $designer->writeAtAnchor('referente', $recibo[$i]['refere']);
  41. $file = 'app/output/recibo.pdf';
  42. if (!file_exists($file) OR is_writable($file))
  43. {
  44. $designer->save($file);
  45. parent::openFile($file);
  46. }
  47. else
  48. {
  49. throw new Exception(_t('Permission denied') . ': ' . $file);
  50. }
  51. TTransaction::close();
  52. }
  53. catch (Exception $e) // in case of exception
  54. {
  55. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  56. }
  57. } //fim do onPrintNota
  58. ?>