Différence de rendu PDF avec wkhtmltopdf entre environnement local et production (Rails, Wicked_PDF)

Il m’est arrivé une mésaventure en polissant une fonctionnalité. Je devais réaliser un document PDF en pixel perfect :
– dans l’environnement de développement, le document est prêt, le résultat attendu est obtenu
– passage en pré-production, environnement pourtant réputé identique à la production, le problème présenté ci-dessous survient

À gauche, le rendu wkhtmltopdf sous Ubuntu Server 12.04.
À droite, le rendu sous Ubuntu Desktop 18.04.

Une font est appliquée en CSS sur le texte, la très classique sans-serif. Comment expliquer une telle différence ? La police semble pourtant bien être la même… à quelques exceptions près (observez attentivement le « 1 »). Tirons ça au clair :

$ fc-match sans-serif
DejaVuSans.ttf: "DejaVu Sans" "Book"

Cette commande retourne quelle police sur votre système correspond au mieux. Les deux machines m’ont retourné le même résultat. Sous Ubuntu les fonts sont stockées dans /usr/share/fonts/, et il apparaît que DejaVu date de 2011 d’un côté et de 2016 de l’autre. Il est donc simple de vérifier via un scp si l’évolution de DejaVu explique à elle seule le problème : il s’avère que non.

Côté Wicked_PDF, j’ai essayé de modifier le zoom ou les DPI du document, mais l’écart entre l’environnement local et l’environnement distant était conservé.

J’ai trouvé ici et les traces d’un bug Webkit concernant l’utilisation de polices non-OTF. La solution semble de convertir la police TTF au format OTF. Ça semble incroyable, mais cela a fixé la différence de rendu.

Il existe un tas de convertisseurs de polices TTF vers OTF en ligne qu’on peut trouver sur Google. Une fois convertie, que faire de la police ? Vous pourriez replacer la font dans /usr/share/fonts/ sur les deux environnements, le plus sage reste de l’emporter dans votre projet, cela évitera à un autre développeur de rencontrer la même tuile.

Voici le bout de code à ajouter dans votre fichier CSS :

@font-face {
  font-family: "fixFont";
  src: url('file://<%= Rails.root.join("public", "fonts", "DejaVuSans.otf") %>'), /* Chemin absolu pour le fichier HTML tampon généré par Wicked côté serveur */
       url('/fonts/DejaVuSans.otf'); /* Pour afficher le HTML coté navigateur */
}

L’utilisation de la dernière version en date de wkhtmltopdf (0.12.4) n’a pas résolu ce problème, bien qu’elle semble uniformiser d’autres problèmes de rendus entre différents systèmes d’exploitation.

Modéliser des objets en 3D avec OpenSCAD, un pseudo langage JavaScript-like pour impression 3D

Comment créer un objet quand on ne sait pas utiliser les logiciels de CAO bien connus pour réaliser des modèles 3D ? Si vous savez développer du code informatique, vous allez vous amuser !

Je vous propose de visionner la conférence d’introduction à la création d’objets assistée par ordinateur, que j’ai donné au siège de Cloud Temple en 2017 :

OpenSCAD est un logiciel libre de modélisation disponible sous Linux, Mac et Windows. Il se divise basiquement en deux volets, un éditeur de texte sur la gauche et une visualisation en temps réel de la modélisation sur la droite.
L’API d’OpenSCAD est complète et permet de créer toutes sortes de formes, en 2D comme en 3D, de réaliser toute sorte de combinaisons par ajout ou suppression de formes, et de réaliser des opérations telles que des rotations, translations, agrandissements etc.
On peut ensuite exporter sa création, en 2D ou en 3D, dans un format ouvert et standardisé. La plupart des machines à commandes numériques utilisent des formats tels que le SVG, le DXF ou le STL.

Voici le développement en temps réel d’une maquette de libellule en 3D :

L’objet a été réalisé en impression 3D :

Puis peint pour en recouvrir les aspérités :

Si la création d’objets vous intéresse, n’hésitez pas à réagir sous l’article, à poser vos questions ou à faire part de projets que vous avez réalisé.

Réaliser des tests en navigateur avec Selenium sur Bash for Windows 10 [et sa démo en Ruby/Capybara]

Introduction

Windows 10 propose un Windows Subsystem for Linux (WSL) permettant d’obtenir un terminal Ubuntu sans émulation ni virtualisation. Il s’agit plutôt d’une couche de compatibilité permettant d’exécuter nativement des binaires Linux sous Windows, similaire à ce que fait Wine sous Linux.

En ces termes, vous comprenez rapidement l’intérêt du WSL : tous les outils de développement Unix s’ouvrent à vous sous Windows 10.

Lire la suite

Remplacer TeamViewer sous Linux par VNC, SSH et un serveur relais transperceur de NAT

Nous allons étudier une alternative de prise de contrôle à distance à base de logiciels libres permettant d’effacer la plupart des limites réseau.

Supposons que Camille est à Caen et que Paul est à Paris. Camille veut dépanner Paul en prenant le contrôle de son ordinateur. Le problème, c’est que Camille et Paul sont derrière des box ADSL comportant un NAT : ils peuvent sortir sur Internet mais Internet ne peut pas entrer chez eux.

Lire la suite