PHP: Importando e assinando digitalmente arquivos PDF

Imagem de Darwin Laganzon por Pixabay

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!

Cledilson Nascimento

Blog pessoal onde trato de tecnologias, principalmente desenvolvimento de software.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store