Alinhamento de campo no PDF Designer Boa noite pessoal. Criei um PDF no Studio com o Designer, ficou do jeito que eu queria. Só queria acertar dois detalhes: 1 - Alinhar os campos de valores a direita 2 - Exibir o texto de alguns campos ao invés do ID. Obrigado antecipadamente. ...
CM
Alinhamento de campo no PDF Designer  
Boa noite pessoal.
Criei um PDF no Studio com o Designer, ficou do jeito que eu queria.
Só queria acertar dois detalhes:

1 - Alinhar os campos de valores a direita
2 - Exibir o texto de alguns campos ao invés do ID.


Obrigado antecipadamente.


<$php


function onGenerate()
{
try
{
// open a transaction with database 'samples'
TTransaction::open('zeromeia');

// load all customers
$repository = new TRepository('OrdemServico');
$criteria = new TCriteria;
$OrdemServico = $repository->load($criteria);

$data = $this->form->getData();
$this->form->validate();

$designer = new TPDFDesigner;
$designer->fromXml('app/reports/Orcamento.pdf.xml');
$designer->replace('{Id_os}', $data->Id_os );
$designer->replace('{DataAbertura}', $data->DataAbertura);
$designer->replace('{Hora_OS}', $data->Hora_OS);
$designer->replace('{Atendente}', utf8_decode($data->Atendente));
$designer->replace('{status_id}', utf8_decode($data->status_id)); // trazer o texto ao invés do id
$designer->replace('{Cliente_id}', utf8_decode($data->Cliente_id)); // trazer o texto ao invés do id
$designer->replace('{DataVencimento}', $data->DataVencimento);
$designer->replace('{LocalServico}', utf8_decode($data->LocalServico));
$designer->replace('{Setor}', utf8_decode($data->Setor)); // trazer o texto ao invés do id
$designer->replace('{TempoExecucao}', $data->TempoExecucao);
$designer->replace('{TituloServico}', utf8_decode($data->TituloServico));
$designer->replace('{Servico}', utf8_decode($data->Servico));
$designer->replace('{Valor_Inicial}', $data->Valor_Inicial); // este campo a direita
$designer->replace('{Desconto}', $data->Desconto); // este campo a direita
$designer->replace('{Acrescimos}', $data->Acrescimos); // este campo a direita
$designer->replace('{ValorTotal}', $data->ValorTotal); // este campo a direita


$designer->generate();



if ($OrdemServico)
{
foreach ($OrdemServico as $OrdemServico)
{
$designer->gotoAnchorX('');


// cabeçalho
$designer->Image('zeromeia.com/apps/zeromeia/app/images/ZeroMeia_640x286.jpg',20,18,-300);
$designer->SetY(75);
$designer->SetFont('Arial', '', 18);
$designer->setFontColorRGB( '#000000' );
$designer->SetxY(50,86);
$designer->SetFont('Arial', '', 10);
$designer->setFontColorRGB( '#000000' );
$designer->Cell(0, 10, utf8_decode('www.zeromeia.com'),0,0,'L');


// rodapé
$designer->SetY(-12);
$designer->SetFont('Arial', '', 8);
$designer->setFontColorRGB( '#000000' );
$designer->Cell(590, 10, utf8_decode('Pág. ').$designer->PageNo().' de {nb}',0,0,'R');
$designer->SetY(-12);
$designer->Cell(122, 10, utf8_decode('Zero Meia Tecnologia © 2018 '),0,0,'R');
$designer->SetY(-12);
$designer->Cell(340,10,utf8_decode("Impresso em ".date("d/m/Y H:i:s"."")),0,1,'R');
$designer->SetY(-12);
$designer->Cell(410,10,utf8_decode(" - ".TSession::getValue('username')),0,1,'R'); //nome do usuário

// grid background

}
}

$file = 'app/output/OrdemServico.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. Por favor, habilite os popups no seu navegador.');

// close the transaction
TTransaction::close();
}
catch (Exception $e) // in case of exception
{
new TMessage('error', 'Error ' . $e->getMessage());
TTransaction::rollback();
}
}
?>

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

Para alinhar campos a direita você pode usar a função Cell. Um de seus parâmetros corresponde ao alinhamento desejado. Então a ideia seria usar uma âncora para posicionar no local correto e em seguida usar a função Cell.

Para exibir a descrição, desde que haja a associação entre os modelos:
adianti.com.br/framework_files/tutor/index.php?class=AssociationView
CM

Olá Nataniel, obrigado por sua resposta.
Para alinhar com Cell eu sei como fazer, o problema é que estou usando o replace porquê só assim consigo chamar um único registro.
Se eu usar o Cell o sistema exibe todos os registros.

Para exibir o texto ao invés do id eu consigo fazer nas grids normalmente, mas no pdf usando replace não estou conseguido.
Ainda estou engatinhando no Adianto.
Obrigado pela ajuda.
CM

A parte do alinhamento consegui resolver usando a Cell, ficou legal.
Mas a parte pra trazer o exto ao invés do ID está difícil, já fiz de todas as formas e não vai.
Uso em todas as grids o mesmo procedimento e funciona perfeitamente, mas no PDF tá brabo!
Fiz assim:

$designer->Cell(80, 10, $data->Cliente_id->cliente->descricao, 0, 0, 'L');
CM

Boa noite.
Alguém para dar uma força?
Obrigado
NR

A função getData por padrão retorna um objeto genérico contendo as informações do formulário, dessa forma não é possível usar as associações. Mas é possível informar o tipo de classe:
 
  1. <?php
  2. $data = $this->form->getData('OrdemServico');
  3. ?>

Se o campo Cliente_id estiver preenchido no formulário:
 
  1. <?php
  2. $designer->Cell(80, 10, $data->cliente->descricao, 0, 0, 'L');
  3. ?>

Achei o código um pouco confuso, qual a ideia de usar o foreach? Você não está trabalhando com uma ordem de serviço por vez?
CM

Obrigado Nataniel.
Show de bola essa dica. Funcionou perfeitamente.
Na verdade eu já havia reformulado todo o código do PDF. Está mais limpo e menos confuso.
Inclusive já havia removido o foreach também.

Ficou assim.
Obrigado pela ajuda amigo.

 
  1. <?php
  2. function onGenerate()
  3. {
  4. try
  5. {
  6. // open a transaction with database 'samples'
  7. TTransaction::open('zeromeia');
  8. // load all customers
  9. $repository = new TRepository('OrdemServico');
  10. $criteria = new TCriteria;
  11. $OrdemServico = $repository->load($criteria);
  12. $data = $this->form->getData('OrdemServico');
  13. $this->form->validate();
  14. $designer = new TPDFDesigner;
  15. $designer->fromXml('app/reports/Orcamento.pdf.xml');
  16. $designer->generate();
  17. $fill = TRUE;
  18. $designer->gotoAnchorX('');
  19. $designer->SetXY(530,72);
  20. $designer->SetFont('Arial', 'B', 18);
  21. $designer->Cell(30,10, $data->Id_os, 0, 1, 'R');
  22. $designer->SetFont('Arial', '', 10);
  23. $designer->SetXY(16,136);
  24. $designer->Cell(20,10, DateTime::createFromFormat('Y-m-d', $data->DataAbertura)->format( 'd/m/Y' ));
  25. $designer->SetXY(148,136);
  26. $designer->Cell(20,10, $data->Hora_OS, 0, 1, 'L');
  27. $designer->SetXY(256,136);
  28. $designer->Cell(30,10, utf8_decode($data->Atendente), 0, 1, 'L');
  29. $designer->SetXY(432,136);
  30. $designer->Cell(30,10, utf8_decode($data->Status->descricao), 0, 0, 'L');
  31. $designer->SetXY(16,190);
  32. $designer->Cell(300, 10, utf8_decode($data->Cliente->descricao), 0, 0, 'L');
  33. $designer->SetXY(432,190);
  34. $designer->Cell(20,10, DateTime::createFromFormat('Y-m-d', $data->DataVencimento)->format( 'd/m/Y' ));
  35. $designer->SetXY(16,245);
  36. $designer->Cell(200, 10, utf8_decode($data->LocalServico), 0, 1, 'L');
  37. $designer->SetXY(246,245);
  38. $designer->Cell(180,10, utf8_decode($data->Setor->descricao), 0, 1, 'L');
  39. $designer->SetXY(432,245);
  40. $designer->Cell(30,10, $data->TempoExecucao, 0, 1, 'L');
  41. $designer->SetXY(16,300);
  42. $designer->Cell(400, 10, utf8_decode($data->TituloServico), 0, 1, 'L');
  43. $designer->SetXY(16,360);
  44. $designer->MultiCell(550, 10, utf8_decode($data->Servico), 0, 1, 'L');
  45. $designer->SetXY(60,655);
  46. $designer->Cell(80, 10, number_format((double)$data->Valor_Inicial, 2, ',', '.'), 0, 0, 'R');
  47. $designer->Cell(132, 10, number_format((double)$data->Desconto, 2, ',', '.'), 0, 0, 'R');
  48. $designer->Cell(140, 10, number_format((double)$data->Acrescimos, 2, ',', '.'), 0, 0, 'R');
  49. $designer->SetXY(90,655);
  50. $designer->SetFont('Arial', 'B', 13);
  51. $designer->Cell(475, 10, number_format((double)$data->ValorTotal,2, ',', '.'), 0, 0, 'R');
  52. $designer->SetXY(100,760);
  53. $designer->SetFont('Arial', '', 10);
  54. $designer->Cell(90,10, $data->Setor->descricao, 0, 1, 'C');
  55. // cabeçalho
  56. $designer->Image('http://zeromeia.com/apps/zeromeia/app/images/ZeroMeia_640x286.jpg',20,18,-300);
  57. $designer->SetY(75);
  58. $designer->SetFont('Arial', '', 18);
  59. $designer->setFontColorRGB( '#000000' );
  60. $designer->SetxY(50,86);
  61. $designer->SetFont('Arial', '', 10);
  62. $designer->setFontColorRGB( '#000000' );
  63. $designer->Cell(0, 10, utf8_decode('www.zeromeia.com'),0,0,'L');
  64. // rodapé
  65. $designer->SetY(-12);
  66. $designer->SetFont('Arial', '', 8);
  67. $designer->setFontColorRGB( '#000000' );
  68. $designer->Cell(590, 10, utf8_decode('Pág. ').$designer->PageNo().' de {nb}',0,0,'R');
  69. $designer->SetY(-12);
  70. $designer->Cell(122, 10, utf8_decode('Zero Meia Tecnologia © 2018 '),0,0,'R');
  71. $designer->SetY(-12);
  72. $designer->Cell(340,10,utf8_decode("Impresso em ".date("d/m/Y H:i:s"."")),0,1,'R');
  73. $designer->SetY(-12);
  74. $designer->Cell(410,10,utf8_decode(" - ".TSession::getValue('username')),0,1,'R'); //nome do usuário
  75. // grid background
  76. $fill = !$fill;
  77. $file = 'app/output/OrdemServico.pdf';
  78. if (!file_exists($file) OR is_writable($file))
  79. {
  80. $designer->save($file);
  81. parent::openFile($file);
  82. }
  83. else
  84. {
  85. throw new Exception(_t('Permission denied') . ': ' . $file);
  86. }
  87. // new TMessage('info', 'Relatório gerado. Por favor, habilite os popups no seu navegador.');
  88. // close the transaction
  89. TTransaction::close();
  90. }
  91. catch (Exception $e) // in case of exception
  92. {
  93. new TMessage('error', '<b>Error</b> ' . $e->getMessage());
  94. TTransaction::rollback();
  95. }
  96. }
  97. ?>

CM

O único campo que não retorna nem a pau é o Setor.
Todos os outros estão retornando corretamente.

Na Model eu coloquei o código assim:

 
  1. <?php
  2. // Busca Clientes
  3. public function get_cliente()
  4. {
  5. if (empty($this->cliente))
  6. $this->descricao = new Clientes($this->Cliente_id);
  7. return $this->descricao;
  8. }
  9. // Busca Status
  10. public function get_status()
  11. {
  12. if (empty($this->status))
  13. $this->descricao = new StatusOs($this->status_id);
  14. return $this->descricao;
  15. }
  16. // Busca Setor
  17. public function get_setor()
  18. {
  19. if (empty($this->setor))
  20. $this->descricao = new Setores($this->setor_id);
  21. return $this->descricao;
  22. }
  23. ?>