PHP: Importando e assinando digitalmente arquivos PDF

Posted on

Manipular arquivos PDF não é uma tarefa simples e muitas vezes precisamos apenas realizar uma pequena manipulação nestes arquivos, ou seja, será apenas uma parte muito pequena do nosso sistema, tornando inviável o desenvolvimento dessas funcionalidades “do zero”.

Para PHP temos várias bibliotecas disponíveis e gratuitas, entre elas a TCPDF, que pra mim é uma das melhores, mas, falta nela a opção de importação. Com uma boa pesquisada na Internet encontrei o FPDI, que tem a função de importar PDFs em bibliotecas já existentes, como a já citada TCPDF. O funcionamento e uso são simples: o FPDI estende a classe TCPDF e acrescenta a funcionalidade de importação. Então, neste artigo vamos usar essas duas bibliotecas. Durante o desenvolvimento de um projeto(no qual trabalho enquanto escrevo este artigo) tive um problema durante a assinatura do arquivo usando as bibliotecas:

Warning: openssl_pkcs7_sign(): error getting private key in...

Depois de muito pesquisar, recorri à comunidade do PHPBA, onde o Marcio Albuquerque(@mlalbuquerque) me ajudou e o problema foi resolvido. Se você não participa de uma comunidade, aconselho que procure a comunidade da sua região, é muito bom. Voltando, a ideia é que os arquivos do certificado devem ser passados como stream, necessitando de file:// antes do endereço do arquivo para funcionar corretamente. Então, fique atento ao código para não deixar esse detalhe passar.

A instalação via composer, como sempre é bem simples: composer require setasign/fpdi ou para instalação manual, consulte a documentação oficial: https://github.com/Setasign/FPDI. Instale também o TCPDF: composer require tecnickcom/tcpdf. E veja como fica o código com uso simples:

//Endereço do arquivo do certificado
//Obs.: Tentei usar o certificado no formato PFX e não funcionou
//Para converter use o comando no Prompt do Windows ou Terminal do Linux:
//openssl pkcs12 -in certificado.pfx -out tcpdf.crt -nodes
$cert = 'C:\tcpdf.crt';

//Informações da assinatura - Preencha com os seus dados
$info = array(
   'Name' => 'Nome',
   'Location' => 'Localidade',
   'Reason' => 'Descreva o motivo da assinatura',
   'ContactInfo' => 'Dados de contato',
);

$pdf = new Fpdi();
//Configura a assinatura. Para saber mais sobre os parâmetros
//consulte a documentação do TCPDF, exemplo 52.
//Não esqueça de mudar 'senha' para a senha do seu certificado
$pdf->setSignature('file://'.$cert, 'file://'.realpath($cert), 'senha','', 2, $info);

//Importa uma página
$pdf->AddPage();
$pdf->setSourceFile("C:\documento.pdf");
$tplId = $pdf->importPage(1);
$pdf->useTemplate($tplId, 0, 0); //Importa nas medidas originais

//Manda o PDF pra download
$pdf->Output('teste.pdf', 'D');

O código acima importa apenas a primeira página, caso necessite importar mais de uma página basta fazer um loop. Então é isso, agradeço por ter lido, caso tenha dúvida deixe seu comentário. Abraço!

Leave a Reply

Your email address will not be published. Required fields are marked *