Modelos de PDF

imagemHabrahabr, queridos colegas!



O problema de imprimir dados em um documento PDF não é novo, eu não sou o primeiro e não sou o último a se deparar com ele, então decidi compartilhar minha experiência de resolver e ao mesmo tempo apresentar à sua atenção uma pequena teia aplicação neste tópico.



1. O formato PDF é bom porque não é editável. Em qualquer caso, é improvável que um usuário comum esteja envolvido na edição de um documento PDF. Isso significa que o formato PDF é adequado para a troca de documentos legalmente significativos.



2. O formato PDF é ruim porque não é editável). modelar, preencher um conjunto de dados de um formulário de documento PDF no modo automático é difícil e o modo manual requer a instalação de aplicativos pesados ​​pagos.



Como programador, estou principalmente preocupado com o segundo ponto. Como imprimo o conjunto de dados necessário em um documento PDF em um aplicativo de software?



Outra busca no Google sobre o assunto não trouxe resultados.

Eu só conseguiu google que tudo é ruim com digitação ( Por que é tão difícil de extrair texto de PDF? , PDF a partir do ponto de vista de um programador ) e há uma opção ao modelo o arquivo docx em primeiro lugar, isso não é difícil a fazer ( Preenchendo documentos no Microsoft Word ... ) e, a seguir, converta o arquivo docx do libreoffice (librewrite) do console em PDF. Tudo isso pode ser feito automaticamente a partir do aplicativo.



Mas, primeiro, tal decisão significa que o projeto terá uma forte dependência do libreoffice.



E em segundo lugar, ao converter docx para PDF no libreoffice, o documento parece um pouco diferente de como parece no word e / ou PDF gerado no word a partir de um arquivo docx.



Finalmente, vamos passar para a essência da solução em consideração. Claro, "modelar" neste caso é uma palavra alta, mas a solução proposta é bastante adequada e útil.



Em python (e php) existem várias bibliotecas (não difíceis de pesquisar no Google) que permitem imprimir strings e imagens em arquivos PDF, usamos pdfrw + reportlab.Canvas. Ou seja, em princípio não há problema em digitar os dados, o problema com essas bibliotecas é que para cada campo você precisa definir suas coordenadas exatas no documento, o que significa que



1.Precisamos de algum tipo de funcionalidade unificada que armazenaria as coordenadas dos campos não dentro do código-fonte, mas em um arquivo separado. Esclarecerei imediatamente que, por experiência própria, recomendo armazenar essas coordenadas em arquivos e sob controle de versão, ou seja, confirme as coordenadas junto com os formulários e métodos PDF correspondentes que geram um determinado conjunto de documentos. E não coloque essas coordenadas no banco de dados, porque isso dificultará a reversão para versões anteriores (coordenadas) de documentos, se necessário. Tudo parece estar claro aqui.



2. Essas coordenadas devem ser calculadas de alguma forma, e essa é uma tarefa triste se você fizer isso manualmente.



A ideia principal aqui é criar elementos div móveis no navegador, usar o mouse para ajustar sua posição no local desejado no documento e salvar as coordenadas dos elementos obtidos no navegador em um arquivo no backend. Na verdade, esses dois pontos são implementados no aplicativo.



Modo de aplicação



Parece um pequeno aplicativo da web com front-end e back-end, ou seja, emiti-lo como um pacote python, talvez, não funcione.



1. Baixe as fontes do gita



2. Instale as dependências



3. Leia README.md (instale e configure o nginx para arquivos estáticos)



4. Na pasta de documentos, crie uma subpasta com o nome do documento que precisa ser gerado e dentro esta subpasta cria dois arquivos e (se necessário) um diretório com imagens:



- form.pdf # formulário do documento no qual você precisa

imprimir os dados - fields.json # parâmetros dos campos que precisam ser impressos

- images # é opcional, um conjunto de imagens que precisam ser digitadas,

recomendo que você salve também o arquivo docx original (se houver), que não está envolvido na geração do documento, mas será útil se você precisar faça alterações e

gere novamente o formulário do documento PDF - form.docx # não é necessário, nenhum nome



O arquivo fields.json tem a seguinte estrutura, por exemplo:



{
    "0": [
        [32.25, 710.25, "fio", "DejaVuSans", 12, 420],
        [425.25, 681.75, "gender", "DejaVuSans", 12, 18],
        [206.25, 681.75, "birth_date", "DejaVuSans", 12, 173],
        [462.75, 681.53, "foto.jpg", "DejaVuSans", 12, 92],
        [146.25, 665.25, "birth_place", "DejaVuSans", 12, 418],
        [228.0, 634.5, "registration", "DejaVuSans", 12, 340]
    ],
    "1": [
        [132.0, 720.76, "1_work", "DejaVuSans", 10, 260],
        [132.0, 697.51, "2_work", "DejaVuSans", 10, 260],
        [132.0, 673.51, "3_work", "DejaVuSans", 10, 141]
    ]
}

      
      





Adicionar / remover linhas a este arquivo adiciona / remove campos que são impressos no formulário



5. Abra a página para definir campos (http://127.0.0.1/tpdf/positioning?pdf_name=ZayavlenieNaZagranpasport&page_num=1)



6. Ajuste a posição de os campos com o mouse no navegador e salve esta posição



7. O mouse nem sempre é capaz de definir com precisão a posição desejada dos campos, a fim de ajustar a posição dos campos, você pode abrir o arquivo fieldd.json e corrigir o coordenadas manualmente. Os dados no arquivo são ordenados pela coordenada Y e cada campo é armazenado em sua própria linha no arquivo. Aqueles. o arquivo com as coordenadas dos campos é formatado de forma organizada, o que permite que você faça manualmente e com facilidade os ajustes necessários.



oito.Criamos outro método para imprimir este tipo de documento (se você precisar de alguma forma preparar os dados iniciais e / ou retirá-los não pela frente, mas pelo backend).



9. Se tudo estiver em ordem, comprometa o conjunto de dados resultante fields.json e arquivos (não apenas para meu git, mas para seu git local, embora se o documento puder ser útil para outra pessoa, você pode coletar um banco de documentos público , isso é uma ideia).



O arquivo resultante com as coordenadas pode ser usado em outro projeto, em outra linguagem de programação, por exemplo php, porque as coordenadas no arquivo são gravadas em unidades de medida (pontos) que são usadas em arquivos PDF.



Se você tiver um projeto Python, o código-fonte deste aplicativo pode ser simplesmente incorporado ao projeto e, por meio do uso da classe Tpdf principal, gerar PDF em qualquer lugar conveniente do código.



Freqüentemente, é necessário gerar não apenas um documento de várias páginas, mas reunir vários documentos em um arquivo PDF, cada um dos quais deve ser impresso na ordem correta e alguns deles mais de uma vez. A classe principal desta aplicação possui um método especial para essas necessidades que gera um conjunto de documentos, consulte o método de processamento / tpdf / exemplo /.



Os dados devem ser passados ​​para a classe principal ao instanciá-la. A classe principal pode ser estendida com propriedades (@property), que serão calculadas com base nos dados de entrada e inseridas no PDF por nome da propriedade = nome do campo. Portanto, no exemplo, o campo fio é exibido e os dados são transmitidos last_name, first_name, middle_name. Você



pode implantar este pequeno aplicativo como um serviço independente e todos os outros aplicativos no ambiente irão acessá-lo para o documento necessário na rede , mas aí haverá custos de transmissão pela rede, os arquivos PDFs não são muito "leves", a geração do documento em si é rápida.



Em vez de centenas de palavras, às vezes é melhor assistir a um vídeo de instrução (não gravei nenhum som).





Experiência de implementação (rake).



  1. PyPDF2, 28 3 , - . , , , , , , , - . , — . , pdfrw , , . .. 28 0.3 . : , , , .
  2. ajax, , .
  3. PDF. , , 3/4, PDF. , , .


(TODO)



  1. .



    , / / / () fields.json
  2. , , .
  3. , PDF-.
  4. Um método genérico que usa um conjunto de dados como entrada e retorna uma coleção de documentos.



All Articles