[ Pob's corner ]

Wicked_pdf #4 : Un beau header, des marges et des numéros

April 28, 2015 | about 3 minutes read

De retour sur notre "wicked_pdf’s road-trip" avec la personnalisation du header et du footer, la numérotation de nos pages, un petit mode "debug" et des marges sur mesures !

Le header et le footer se gèrent de la même manière, cependant il existe plusieurs techniques pour les afficher. Soit c’est un simple texte et on peut le faire dans le controller, soit on souhaite apporter du style et des images et là il faut passer par un template spécifique. Nous allons voir comment ajouter un footer mais c’est exactement la même chose pour le header.

# app/controllers/mon_objet_controller.rb
def show
  respond_to do |format|
    format.html {}
    format.pdf {
      render layout: "mon_layout.pdf", 
      header: { html: { template: "mon_objet/pdf_header.pdf.erb", layout: false }},
      (...)
    }
  end
end

On spécifie un fichier pour notre header dans lequel nous allons pouvoir insérer le contenu que l’on souhaite. Ce fichier est placé dans app/views/mon_objet/pdf_header.pdf.erb.

2 – Des numéros pour nos pages

Très souvent utile sur les documents avec plusieurs pages : la possibilité d’indiquer le numéro. Plusieurs méthodes existent, une manière très simple de le faire depuis le controller :

# app/controllers/mon_objet_controller.rb
def show
  respond_to do |format|
    format.html {}
    format.pdf {
      render layout: "mon_layout.pdf", 
      footer: { center: 'Page [page] / [topage]' }
    }
  end
end

Les termes [page] et [topage] sont à utiliser, libre à vous de formater le rendu final comme vous le voulez (dans notre exemple cela donne en bas de page : Page 2 / 4 par ex). Possibilité également de le centrer (:center) ou de le mettre à gauche ou à droite (:left, :right).

3 – Un mode debug ?

Concevoir un PDF via du code HTML c’est très pratique, mais quand on remarque une anomalie sur un PDF on ne peut pas “inspecter l’élément” comme sur nos pages web. Petite astuce, toujours dans votre controller :

# app/controllers/mon_objet_controller.rb
def show
  respond_to do |format|
    format.html {}
    format.pdf {
      render layout: "mon_layout.pdf", 
      show_as_html: params[:debug].present?
    }
  end
end

Pour l’utiliser il suffit, dans votre url, de rajouter “?debug=true” à la fin de cette manière http://localhost:3000/mon_objet/show.pdf?debug=true

Attention toutefois ce mode debug passe en mode html et n’affiche pas exactement la même chose que le rendu PDF (mais trouve son utilité dans certains cas).

4 – La gestion des marges

Wicked_pdf gère les marges par défaut (à 10) mais vous pouvez les personnaliser dans le controller :

# app/controllers/mon_objet_controller.rb
def show
  respond_to do |format|
    format.html {}
    format.pdf {
      render layout: "mon_layout.pdf", 
      margin: { top: 25, bottom: 15, left: 10, right: 10 }
    }
  end
end

Attention toutefois à bien différencier l’impression (Fichier > Imprimer) depuis le navigateur de l’impression du fichier PDF enregistré sur votre ordinateur, au niveau des marges ça n’a rien à voir.

La liste complète des options est disponible ici même, nous essaierons d’en aborder d’autre. La prochaine fois on se penchera du côté des PDFs en pièces jointes dans les mails et de la génération de PDF à la volée !

Originally published at Sois-net.