En lisant la mailing de fop je suis tombé sur un problème très particulier de rendu d'un document volumineux. Dans les réponses données à cet demande d'aide je suis tombé sur l'utilitaire Pdftk.
Pdftk à l'air d'être intéressant pour pouvoir recoller des parties de pdf. Par exemple, on peut couper un traitement volumineux en plusieurs petits traitement et recoller les résultats avec pdftk.
La dernière version stable de HAProxy est sorite le 5 Mars 2010.
HAProxy est un logiciel libre qui permet de monter un système de load balancing performant. J'ai hâte de pouvoir tester HAProxy sur une application GWT. Rappelons que GWT se prête bien à ce genre d'exercice de part son architecture qui permet d'obtenir des applications sans états.
Lorsque l'on refond une application, il faut souvent reprendre les données existantes afin de les intégrer à la nouvelle application.
Ça n'est pas un travail facile, car il faut dès fois faire du E-Archéologie, souvent on doit choisir des données par défaut pour les extensions fonctionnelles et les batch de reprises sont une source d'intérogation technique et fonctionnelle.
Sur mon dernier projet, nous avons choisi de définir un schéma de base de donnée le plus stricte possible, afin de pouvoir garantir au mieux la cohérence des données. Nous avons utilisé des Validateurs Hibernate pour remonter des messages utilisateurs clairs et localisés.
Placer des contraintes fortes du côté de la base de donnée garantie une haute cohérence des données, mais cela pose quelques problèmes techniques et fonctionnels pour la reprise des données.
Premièrement, l'existant est souvent incohérent. La mauvaise nouvelle c'est qu'il va y avoir du travail en plus. Il va falloir demander au MOA de s'investir dans un travail en binome avec un MOE pour orienter une correction des données existantes afin de rendre le système cohérent. La bonne nouvelle est que ce travail va permettre au MOA de détecter précisément les erreurs qu'il se traine depuis dès fois plusieurs années (voir dizaine d'années dans le cas de mon projet :)
Les Pojos de la nouvelle application ne permettent pas une reprise des données directe, à cause des contraintes d'unicité ou de non-nullités. La solution que nous avons choisi est de passer par une pseudo BDD intermédiaire qui ne possède pas de contraintes.
Nous avons utilisé Lucene d'Apache, qui stock les Pojos en les sérialisant dans des fichiers. Cet outil est très puissant, car flexible, avec possibilité de création d'index.
Nous avons donc fait un export des données existantes au format CSV. Nous avons lu les données avec un batch maison écrit en Java et stocké les objets dans Lucene, le temps de les remplir correctement avec des règles de reprise de données. Une fois que les objets sont cohérent dans Lucene, il suffit de les persister dans la base de données réelle.
Suite à l'article où je parlais rapidement de l'importance du choix du navigateur, et plus généralement de l'utilisation de logiciels. Je fais une petite pub pour le site openchoice qui explique avec des mots simples l'importance du choix de son navigateur.
Suite à la demande de Tristan, je vous fais part de mon ressenti en quelques lignes sur le sujet du choix du navigateur Internet.
Le navigateur Web n'est pas un logiciel quelconque. Il permet d'avoir accès à l'information qui se trouve sur Internet. C'est donc un élément essentiel de votre liberté aujourd'hui, la liberté d'avoir accès à l'information, la liberté de pouvoir améliorer le navigateur selon vos besoins. Personnellement j'ai fais le choix d'utiliser Firefox pour garantir ma liberté, mais aussi parce qu'il améliore notre société de par sa licence.
Une entreprise qui crée un site Internet va créer son site pour ses utilisateurs. Si tout le monde utilise un navigateur Web propriétaire qui utilise des fonctionnalités fermées, le marché se fermera et nous n'auront plus le choix que d'un unique fournisseur. C'est un peu ce qui c'est passé à la fin de la guerre des navigateurs lorsque Microsoft a écrasé Netscape à coup de monopole de son système d'exploitation grand public.
Comme on peut le voir sur ce schéma, la réponse de la communauté avec Firefox est claire. C'est le choix de l'ouverture pour la liberté.
Les standards ouverts permettent l'indépendance technologique. Cette indépendance est primordiale pour ne pas que le consommateur soit en position de dominé face à une entreprise. Les logiciels libres sont la seule réponse pérenne à cette indépendance. Les logiciels ne sont que des idées, personnes ne devrait vous interdire d'utiliser une idée ou d'améliorer une idée. Pourtant les entreprises fournissant des logiciels privateurs vous vendent une idée, tout en vous empêchant de pouvoir l'améliorer ou même de corriger les bugs. Les logiciels libres, au contraire, nourrissent un cercle vertueux en offrant à la société des logiciels que tout le monde peut utiliser, sans restriction, et que tout le monde peut améliorer. Les développeurs ne sont donc plus obliger de réinventer la roue, ils peuvent s'appuyer sur ce qui a été fait avant pour améliorer les logiciels avenir.
Les logiciels libres ne se bases que sur des standards ouvert ce qui permet l'intéropérabilité des systèmes. Le grand nombre de contributeurs à travers le monde rendent les logiciels libre plus sûr et plus performant, d'autant plus que ce sont les meilleurs développeurs qui sont attirés par ce genre de projets. Le travail collaboratif augmente les compétences des développeurs par l'entraide et le travail en commun. Le Web s'améliore grâce à cette synergie.
Les standards sont en train de s'imposer. Ca aura été dur, mais on y arrive. Microsoft vient tout juste de se rendre compte de l'erreur qu'il a commis en essayant de fermer le web avec IE6. Tous le monde en a marre et à envie d'utiliser autre chose que IE. Google a senti le vent tourner et a mis sur le marché son propre navigateur, basé sur du logiciel libre mais contenant tout de même une sur-couche privatrice bien regrettable. Néanmoins, les standards ce sont imposés et le Web a l'air, d'après moi, de prendre une bonne direction du point de vue de l'accessibilité.
Pour moi, ce qui est important, c'est que tous le monde ai accès au contenu. Le fond est plus important que la forme.
La création et l'innovation est accéléré par un Web ouvert qui permet l'accès à de l'information libre. La liberté et le fondement de la démocratie. La démocratie est donc fortement liée au système d'information. Les navigateurs Web ont une place déterminantes dans cette équation. Dans ce contexte, choisir un navigateur libre comme Firefox est donc simplement évident.
Un billet très pragmatique présentant un dashboard, sur qualitystreet, ma bien plus.
Je l'ai testé sur mon bureau et j'en profite pour partager avec vous le résultat.
Ce résulat, vous pouvez l'obtenir facilement en installant sur votre machine la distribution Gnu/Linux Ubuntu. Je l'utilise tous les jours en entreprise et c'est un régale de travailler dessus. Si vous ne savez, ou ne pouvez pas l'utilisez, n'hésitez pas à le réclamer à votre responsable Informatique, lui saura vous l'installer. Il n'y a aucune restriction à son utilisation alors faites vous plaisir :)
Comment générer des fichiers pdf avec une application GWT ?
La solution que j'ai choisi sur mon projet est simple, efficace, et techniquement élégante car elle utilise les normes XSL du W3C.
Je m'amuse d'utiliser des technologies parallèles à ce que l'on a l'habitude d'utiliser en Java. Les standards du Web permettent de ne pas avoir à réinventer la roue car ils sont puissants et bien pensés.
J'ai dû gérer la création de patron de courrier et proposer des écrans afin d'imprimer les courrier en pouvant ajouter du texte aux patrons.
Le patron se compose d'un nom de document, d'un libellé, d'une référence de courrier, et de deux zones de texte qui composent le corp du courrier.
Le texte saisie au niveau du patron de courrier est sauvegardé en texte brut en base de donnée, via un appel Rpc standard.
Lorsque un utilisateur utilise un patron pour générer un courrier pdf, il va aller sur un écran sur lequel il va voir le patron. Le texte brut est alors transformé en pseudo html afin de remplacer les double retours chariot par des balises p, et les simples retours chariot restant par des balises br.
J'ai laissé la possibilité à l'utilisateur de pouvoir utiliser quelques balises html pour pouvoir mettre en italic, en gras ou en souligné.
Utiliser du Html à l'avantage de pouvoir afficher le texte du patron au niveau de l'écran de génération du courrier.
Pour une raison de sécurité je n'autorise que les balises html cité ci-dessus. Pour cela, j'ai utiliser la validation Xml avec une simple dtd n'autorisant que ces balises.
Sur l'écran de génération Pdf, l'utilisateur a selectionné un patron. Il voit donc le texte du patron dans des espaces dédiés qui ne sont que de simple div html réalisé par un FlowPanel Gwt.
L'utilisateur peut entrer un texte qui sera afficher au milieu du corp du courrier. Ce texte est régie par les mêmes règles que lors de la création du patron. Les retours chariots sont automatiquement transformés en balises p etc..
Une fois le texte saisie dans un textArea, on enregistre ce texte en base de données via une requête Rpc qui aura préalablement validé le flux avec une dtd (toujours la même) et sur le retour de l'AsyncCallBack, on effecture une requete vers une servlet dans laquel on aura injecté le texte formaté html en paramètre de la requete.
On a donc créé une simple Servlet qui reçois un flux. Il ne s'agit donc pas d'un appel Rpc. le but est de pouvoir renvoyer au navigateur le flux Pdf.
Cette servlet récupère donc le texte du courrier qui a été saisie dans différent champs. On a plus qu'à faire une transformation Xsl pour transformer le Html en Xslfo et demander à Fop de générer du Pdf et le tour est joué.
Si cette solution vous intéresse et que vous aimeriez bien quelques lignes de code pour mieux comprendre cette théorie, vous n'avez qu'à me demander en commentaire de ce billet.