Como funcionam os repetidores de camarão?

Read this article in:

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 fim

app/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:

  1. Criar um novo Stamp (Pense nisso como um selo real).
  2. Repetir este carimbo todos páginas do PDF (3 no nosso exemplo). Também não importa se você ligou. repeat depois de chamar start_new_page antes, ele irá renderizar o repetidor em cada Page.
  3. 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.

Please login to post comments: