Camarão é uma ferramenta incrivelmente configurável e flexível para a geração de PDF. Ele permite que você crie um estilo financeiro chato PDFs que podem quase imitar uma planilha (estática) Excel, e também pode criar uma carta convite parte convincente.
Uma das muitas ferramentas do camarão para permitir este tipo de flexibilidade é o repetidor. Ele permite que você defina uma seção do seu PDF, e reutilizá-lo repetidamente, essencialmente estampagem ele em cada página (ou apenas em páginas ímpares, ou nas primeiras 10 páginas, etc, você também pode configurar isso).
Vamos criar um documento PDF simples como exemplo:
app/pdfs/base_pdf.rb:
classe BasePdf < Camarão::Documento def inicializar super() gerar pdf fim def gerar pdf repetir :todos fazer texto Teste fim 3.vezes { start new page } fim fimapp/controllers/application_controller.rb:
def relatório enviar dados BasePdf.novo.renderização, tipo: «aplicação/pdf», disposição: 'inline' fim
Agora precisamos ir para localhost:3000/report.pdf (depois de configurar a rota) e o PDF será exibido, que conterá 3 páginas com o mesmo texto 'Teste' impresso em cada uma delas.
Vamos agora entender como isso acontece: Quando esse código chama repeat :all, e passar um bloco para ele, é essencialmente dizendo camarão para:
- Criar um novo
Stamp(Pense nisso como um selo real). - Repetir este carimbo todos páginas do PDF (3 no nosso exemplo). Também não importa se você ligou.
repeatdepois de chamarstart_new_pageantes, ele irá renderizar o repetidor em cada Page. - Renderize o que estiver dentro do bloco para este novo selo (no nosso caso, um texto simples), então quando o camarão "marcas" ele vai carimbar exatamente a mesma coisa várias vezes.
No entanto, este "stamping" não acontece imediatamente, nem acontece quando uma nova página é iniciada. O camarão só "fará" o repetidor após a definição do documento completo, quando o método render é chamado. Normalmente queres ligar. render quando você quiser enviar o PDF para o usuário, então ele sempre estará no final.
O problema com repetidores dinâmicos
E se quiseres mudar o que está dentro disto? Stamp? Vamos imaginar uma nova situação, mais parecida com o mundo real, onde eu tenho um PDF com muitas páginas, e eu preciso imprimir informações diferentes sobre o cabeçalho para diferentes páginas. Se você já sabe o número exato de páginas que o PDF terá e que página tem que informações, você pode fazer algo assim:
app/pdfs/base_pdf.rb
def cabeçalho repetir :todos, dinâmico: verdadeiro fazer se (número de página < 5) texto 'Uma coisa' outro texto Outra coisa fim fim fim
Está tudo bem até te meteres numa situação destas:
app/pdfs/base_pdf.rb
# Quero imprimir o nome do país da primeira cidade na página atual def país cabeçalho repetir :todos, dinâmico: verdadeiro fazer texto @ current country fim fim Assumiremos que as cidades são um haxixe, onde cada chave é um país e contém uma série de cidades para cada país def print cities of the world(all cities) all cities.cada fazer □País, cidades□ @ current country = País cidades.cada fazer □cidade□ texto cidade fim fim fim
É por isso que existem repetidores dinâmicos. Eles permitem que você mude o conteúdo do selo para cada página.