{"id":2566,"date":"2018-01-05T09:54:51","date_gmt":"2018-01-05T09:54:51","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=2566"},"modified":"2018-01-05T09:54:51","modified_gmt":"2018-01-05T09:54:51","slug":"la-impresion-en-odoo","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2018\/01\/05\/la-impresion-en-odoo\/","title":{"rendered":"La impresi\u00f3n en odoo &#8230;"},"content":{"rendered":"<p>&#8230; aspectos t\u00e9cnicos sobre la versi\u00f3n 8 (aunque aplicable a versiones superiores) y otras rarezas.<\/p>\n<p><!--more--><\/p>\n<p>Dado que me ha tocado medio mantener una instalaci\u00f3n odoo (versi\u00f3n 8) he tenido que aprender mucho m\u00e1s de lo que quer\u00eda sobre c\u00f3mo imprime. Y no es mal sistema, desde luego, pero me sorprende que una parte tan b\u00e1sica como la obtenci\u00f3n de informes impresos quede en manos de un programa de terceros tan peculiar como <em>wkhtmltopdf<\/em>.<\/p>\n<p>\u00bf C\u00f3mo interact\u00faan ? Pues es simple: odoo crea los informes como p\u00e1ginas web, con hojas de estilo muy concretas, que luego convierte a documentos PDF con la citada herramienta.<\/p>\n<p>La parte de odoo est\u00e1 clara, \u00bf no ? Una p\u00e1gina HTML es m\u00e1s una declaraci\u00f3n de intenciones que un contenido concreto, y crearla desde cualquier lenguaje de programaci\u00f3n est\u00e1 chupado. Si adem\u00e1s le a\u00f1adimos un buen pu\u00f1ado de hojas de estilo, que pretenden moldear la presentaci\u00f3n del contenido en pantalla, ya hemos resuelto lo principal. Podemos lavarnos las manos con tranquilidad. Oye, que esto he dicho que va centrado; si no es as\u00ed es cosa del navegador o de cualquier otro menos yo.<\/p>\n<p>Bien, quedan detalles adaptativos como por ejemplo los saltos de p\u00e1gina arbitrarios y las cifras que cambian con ellos (subtotales los llam\u00e1bamos), pero si los consideramos vestigios podemos m\u00e1s o menos ignorarlos o, en el mejor de los casos, hacer alg\u00fan apa\u00f1o que simule su falta. Son otros tiempos.<\/p>\n<p>Y ahora que tenemos un precioso documento HTML vamos a ver c\u00f3mo funciona <em>wkhtmltopdf<\/em>. Este programa parte de una p\u00e1gina web, bien obtenida como archivo, bien mediante una URL. Luego,\u00a0 y empleando un juego de herramientas externo como <a href=\"https:\/\/webkit.org\/\">Webkit<\/a>, dibuja la p\u00e1gina como previo a convertirla en un documento PDF. Ojo, eso incluye cargar referencias externas como las hojas de estilo y las im\u00e1genes.<\/p>\n<p>Sencillo mientras la p\u00e1gina lo sea. Es l\u00f3gico pensar que no va a poder con todas tal y como est\u00e1 el patio de las p\u00e1ginas web pero en general hace un trabajo muy bueno. As\u00ed que el esquema queda como en el siguiente gr\u00e1fico:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2018\/01\/odoo-y-wkhtmltopdf.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2568 size-large\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2018\/01\/odoo-y-wkhtmltopdf-1024x724.png\" alt=\"\" width=\"1024\" height=\"724\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2018\/01\/odoo-y-wkhtmltopdf-1024x724.png 1024w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2018\/01\/odoo-y-wkhtmltopdf-300x212.png 300w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2018\/01\/odoo-y-wkhtmltopdf-768x543.png 768w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2018\/01\/odoo-y-wkhtmltopdf.png 1450w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/p>\n<p>El documento que recibe de <em>odoo<\/em> incluye un buen paquete de referencias a hojas de estilo referentes al servidor local que <em>wkhtmltopdf<\/em>, convenientemente instruido, solicita al servidor local que viene a ser el propio programa <em>odoo<\/em>. De esta forma se puede controlar desde la aplicaci\u00f3n qu\u00e9 contenidos generales como encabezados y logotipos deben aparecer, y qu\u00e9 forma van a tener en el resultado final.<\/p>\n<p>El mecanismo es ingenioso pero tiene un par de puntos d\u00e9biles: la versi\u00f3n empleada de <em>wkhtmltopdf<\/em> debe ser muy concreta; en el caso de <em>odoo<\/em> 8 ser\u00eda la 0.12.1. Cualquier variaci\u00f3n har\u00e1 que los listados salgan descolocados o no lleguen a salir de ninguna manera. En este \u00faltimo caso <em>odoo<\/em> env\u00eda la p\u00e1gina web previa para que el usuario la vea y la imprima empleando el mecanismo de su navegador.<\/p>\n<p>El otro punto d\u00e9bil es que, por mucho que nos empe\u00f1emos, todo el mecanismo se basa en adaptar un contenido destinado a un medio voluble -y casi intangible- como una pantalla de ordenador, a un medio con l\u00edmites f\u00e9rreos como es el papel. No estamos hablando de usar un programa final que sabe que va a imprimir y controla tipograf\u00edas, m\u00e1rgenes f\u00edsicos o modos de impresi\u00f3n.<\/p>\n<p>Y aunque el conjunto funciona con bastante \u00e9xito sigue siendo algo confuso al usuario habitual de listados en papel. No llega a entender muy bien por qu\u00e9 todo pasa por el PDF que descarga y luego tiene que mandar a imprimir. Pasos que antes, al menos en Linux, no exist\u00edan.<\/p>\n<p>&nbsp;<\/p>\n<h3>Enlaces y referencias<\/h3>\n<ul>\n<li><a href=\"https:\/\/github.com\/odoo\/odoo\/issues\/4806\">Qweb report sale.report_saleorder missing footer at PDF #4806<\/a><\/li>\n<li><a href=\"https:\/\/wkhtmltopdf.org\/index.html\">https:\/\/wkhtmltopdf.org\/index.html<\/a><\/li>\n<li><a href=\"https:\/\/www.odoo.com\/documentation\/8.0\/reference\/reports.html\">Los informes en odoo 8<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>&#8230; aspectos t\u00e9cnicos sobre la versi\u00f3n 8 (aunque aplicable a versiones superiores) y otras rarezas.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[2],"tags":[594,222,671],"class_list":["post-2566","post","type-post","status-publish","format-standard","hentry","category-software","tag-odoo","tag-pdf","tag-wkhtmltopdf"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2566","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=2566"}],"version-history":[{"count":3,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2566\/revisions"}],"predecessor-version":[{"id":2570,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2566\/revisions\/2570"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=2566"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=2566"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=2566"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}