Outra forma de gerar PDF. Gerador de PDF gratuito do PDF24 no seu computador ou online Crie um rodapé de página e um texto introdutório

11.03.2024

Uma das partes importantes de qualquer sistema de gerenciamento de projetos é a capacidade de relatar a situação atual. Isso permite avaliar com mais precisão a situação atual. Para os usuários, esse relatório pode ser não apenas uma análise necessária para o trabalho, mas também uma forma exclusiva de relatório. Por isso, Revizto dá muita atenção ao lado técnico da geração de relatórios.

Para alguns clientes, os relatórios são PDFs grandes com dezenas de milhares de páginas. É claro que esses relatórios pesam gigabytes e sua geração leva muito tempo. Diante de mais um aumento no tamanho do relatório, decidimos analisar nossa arquitetura de geração de PDF.

Tradicionalmente, a geração de PDF na web consiste em duas etapas:

  • Gerando uma página html, que mais tarde se tornará um pdf
  • Tradução de html para pdf
  • A primeira etapa no nosso caso demorou bastante, mas a segunda pode durar mais de uma hora. Portanto, fizemos uma pequena comparação sobre quais oportunidades de código aberto existem para a geração de PDFs:

    Comando sendo cronometrado: "phantomjs --ssl-protocol=any ./capture.js 1.html 1.pdf" Tempo do usuário (segundos): 2240,56 Tempo do sistema (segundos): 6,96 Porcentagem da CPU que este trabalho obteve: 83% Decorrido ( relógio de parede) hora (h:mm:ss ou m:ss): 44:35,89 Tamanho médio do texto compartilhado (kbytes): 0 Tamanho médio dos dados não compartilhados (kbytes): 0 Tamanho médio da pilha (kbytes): 0 Tamanho médio total (kbytes) ) ): 0 Tamanho máximo do conjunto residente (kbytes): 1821840 Tamanho médio do conjunto residente (kbytes): 0 Falhas de página principais (que exigem E/S): 28 Falhas de página secundárias (recuperação de um quadro): 489364 Mudanças de contexto voluntárias: 53462 Contexto involuntário switches: 31797 Swaps: 0 Entradas do sistema de arquivos: 4576 Saídas do sistema de arquivos: 233848 Mensagens de soquete enviadas: 0 Mensagens de soquete recebidas: 0 Sinais entregues: 0 Tamanho da página (bytes): 4096 Status de saída: 0

    Comando sendo cronometrado: "/usr/bin/google-chrome-stable --headless --disable-gpu --print-to-pdf 1.html" Tempo do usuário (segundos): 54,22 Tempo do sistema (segundos): 7,32 Por cento de CPU que este trabalho obteve: 5% Tempo decorrido (relógio de parede) (h:mm:ss ou m:ss): 18:49,74 Tamanho médio do texto compartilhado (kbytes): 0 Tamanho médio dos dados não compartilhados (kbytes): 0 Tamanho médio da pilha ( kbytes): 0 Tamanho total médio (kbytes): 0 Tamanho máximo do conjunto residente (kbytes): 951796 Tamanho médio do conjunto residente (kbytes): 0 Falhas de página principais (que exigem E/S): 2 Falhas de página secundárias (recuperação de um quadro): 938614 Trocas de contexto voluntárias: 184497 Trocas de contexto involuntárias: 37463 Trocas: 0 Entradas do sistema de arquivos: 368 Saídas do sistema de arquivos: 174352 Mensagens de soquete enviadas: 0 Mensagens de soquete recebidas: 0 Sinais entregues: 0 Tamanho da página (bytes): 4096 Status de saída: 0

  • Comando Wkhtmltopdf encerrado com status diferente de zero 1 Comando sendo cronometrado: "wkhtmltopdf 1.html 1.pdf" Tempo do usuário (segundos): 3356,13 Tempo do sistema (segundos): 7,12 Por cento da CPU que este trabalho obteve: 99% Decorrido (relógio de parede) tempo (h:mm:ss ou m:ss): 56:21,54 Tamanho médio do texto compartilhado (kbytes): 0 Tamanho médio dos dados não compartilhados (kbytes): 0 Tamanho médio da pilha (kbytes): 0 Tamanho médio total (kbytes): 0 Tamanho máximo do conjunto residente (kbytes): 3457744 Tamanho médio do conjunto residente (kbytes): 0 Falhas de página principais (que exigem E/S): 8 Falhas de página secundárias (recuperação de um quadro): 977440 Trocas de contexto voluntárias: 38567 Trocas de contexto involuntárias: 47975 Trocas : 0 Entradas do sistema de arquivos: 1240 Saídas do sistema de arquivos: 197480 Mensagens de soquete enviadas: 0 Mensagens de soquete recebidas: 0 Sinais entregues: 0 Tamanho da página (bytes): 4096 Status de saída: 1
  • A partir do teste acima, fica claro que o melhor resultado é obtido no Chrome, então o phantomJs é duas vezes pior e o Wkhtmltopdf é ainda pior. Este resultado ecoa problemas com o desenvolvimento de phantomJs

    Por outro lado, o Chrome depende do X11, portanto haverá significativamente mais problemas com ele no servidor do que com phantomJs.

    Se tirarmos uma pequena conclusão, então para testar uma máquina com um desktop Chrome é o vencedor indiscutível. Faz sentido usá-lo em um servidor se você não tem medo de colocar o X11 lá, caso contrário, phantomJs será a melhor opção

    Para gerar um arquivo PDF a partir de HTML, utilizaremos a biblioteca DomPDF para PHP. E com ele poderemos obter arquivos PDF gerados de alta qualidade com caracteres russos.

    Então vamos começar. Primeiro você precisa baixar a própria biblioteca em:

    Ou instale-o via compositor:

    Compositor requer dompdf/dompdf

    No entanto, é importante notar que a versão padrão NÃO suporta caracteres do idioma russo. Portanto, você terá que pesquisar muito na Internet e tentar, tentar, tentar. Para reduzir o seu tempo, já recolhemos tudo. Abaixo você pode baixar uma biblioteca com suporte para caracteres do idioma russo.

    Se você quiser usar a compilação padrão, basta substituir os arquivos deste arquivo (916 KB).

    Você precisará substituir os arquivos na pasta:

    ../dompdf/lib/fonts

    Com este script você poderá gerar arquivos PDF complexos com tabelas, imagens, que serão incorporados do HTML ao arquivo PDF.

    Usamos esta biblioteca para gerar PDF com uma solicitação ajax. No arquivo baixado você encontrará o arquivo index.php, que processa os dados recebidos e conecta o modelo, que já possui imagens incorporadas. Carregamos para você uma versão totalmente funcional e usada (5 MB).

    Baixe um exemplo do arquivo PDF gerado (580 KB)

    Se você baixou a biblioteca, conecte-a ao seu arquivo PHP usando a conexão do autoloader:

    Require_once "dompdf/autoload.inc.php";

    Ou use GIT:

    Clone do Git https://github.com/dompdf/dompdf.git
    cd dompdf
    clone do git https://github.com/PhenX/php-font-lib.git lib/php-font-lib
    cd lib/php-font-lib
    git check-out 0.5.1
    CD..
    clone git https://github.com/PhenX/php-svg-lib.git php-svg-lib
    cd php-svg-lib
    git check-out v0.3

    O manipulador em si se parece com isto:

    //conecta o autoloader include_once "autoload.inc.php"; //função para limpar código de dados maliciosos function challsrt($data)( $array1=array("\"","*","%","0x","&","\0","\n " ,"\r","\s","\t","\\","`","^","$","(",")","[","]", "(",")","wss","blob","localhost","–","