<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pablo Fumarola</title>
    <description>The latest articles on DEV Community by Pablo Fumarola (@ajest).</description>
    <link>https://dev.to/ajest</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F446788%2F336532e8-7244-471a-b387-f419c8c5b9af.jpeg</url>
      <title>DEV Community: Pablo Fumarola</title>
      <link>https://dev.to/ajest</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajest"/>
    <language>en</language>
    <item>
      <title>De HTML a PDF</title>
      <dc:creator>Pablo Fumarola</dc:creator>
      <pubDate>Mon, 07 Nov 2022 14:13:48 +0000</pubDate>
      <link>https://dev.to/ajest/de-html-a-pdf-2gmb</link>
      <guid>https://dev.to/ajest/de-html-a-pdf-2gmb</guid>
      <description>&lt;p&gt;Para todo aquel que esté necesitando crear archivos PDF de forma programática en base a contenido dinámico en un navegador web o con una API, comparto mi experiencia y las conclusiones que fui sacando en base a la rápida investigación que realicé y en las prueba que hice.&lt;/p&gt;

&lt;p&gt;Podemos decir que este problema se puede resolver de varias formas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;"Imprimir" la página entera que queremos transformar en PDF (del lado del cliente).&lt;/li&gt;
&lt;li&gt;Utilizar una librería llamada html2pdf (del lado del cliente).&lt;/li&gt;
&lt;li&gt;Utilizar una librería llamada jsPDF (del lado del cliente y del servidor)&lt;/li&gt;
&lt;li&gt;Utilizar un paquete de PHP llamado DOMPDF (del lado del servidor)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Analicemos estas posibles soluciones y sus pros y contras:&lt;/p&gt;

&lt;h2&gt;
  
  
  1.- Imprimir
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p3x2OP3k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1fn9kpu995q7h694j9r0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p3x2OP3k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1fn9kpu995q7h694j9r0.png" alt="Ejemplo de Mercado Libre " width="880" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El primer enfoque quizás pueda ser el más fácil. Podemos maquetar la página con la tecnología que se nos ocurra para que luego el navegador y su opción de "Guardar como PDF" haga el resto.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No necesitamos instalar ninguna dependencia&lt;/li&gt;
&lt;li&gt;El navegador intentará "renderizar" aquello que es texto como tal (etiquetas a, p, h1, h2, etc)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Los sistemas operativos brindarán distintas opciones a la hora de elegir esta opción, esto significa que incluso puede no aparecer la opción "Guardar como PDF"&lt;/li&gt;
&lt;li&gt;Muchas veces el menú de "Imprimir" ofrecerá distintos tamaños de hoja, lo que hará que nuestra maqueta tenga que adaptarse a muchos tipos de tamaño si queremos evitar que alguien cree un archivo PDF que se rompa. Los tamaños pueden ser muy variados&lt;/li&gt;
&lt;li&gt;Si bien mencionamos como un punto a favor la capacidad del navegador de entender qué es un texto y renderizarlo como tal, esta funcionalidad no es perfecta. Se verá afectada por las reglas CSS que estemos usando&lt;/li&gt;
&lt;li&gt;El menú de imprimir no es un mini navegador, es decir que interpretará las instrucciones CSS de forma distinta que nuestra navegador, y esto incluso variará de navegador a navegador, así que hacerlo compatible requerirá de que trabajemos con muchos navegadores relevantes para nosotros&lt;/li&gt;
&lt;li&gt;Esta funcionalidad es del lado del cliente y requiere que estemos en la página en sí, no podemos automatizarlo de forma sencilla, quizás habría que utilizar alguna herramienta del tipo Puppeteer o Playwright o levantar un popup de html&lt;/li&gt;
&lt;li&gt;Requiere dos o tres clicks hasta obtener el resultado deseado lo cual puede ser molesto e incluso imposible de entender para algunos usuarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por último, se debe mencionar que ya que el menú de imprimir no interpretará de forma perfecta nuestro CSS, lo más posible es que tengamos que crear otro documento de CSS especialmente diseñado para imprimir. Esto no es necesariamente algo negativo, por eso no está dentro del listado de contras, pero sí que generará la necesidad de hacer algo de trabajo extra.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.- html2pdf
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fhubhDj0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sf1z2dyfmern2rkjc8qs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fhubhDj0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sf1z2dyfmern2rkjc8qs.png" alt="html2pdf" width="880" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta librería escrita en Javascript está disponible en &lt;em&gt;npmjs&lt;/em&gt; (&lt;a href="https://www.npmjs.com/package/html2pdf.js/v/0.9.0"&gt;https://www.npmjs.com/package/html2pdf.js/v/0.9.0&lt;/a&gt;). Es en una herramienta para tomar lo que aparece en la página y exportarla a PDF. La técnica que usa es, dicho de forma coloquial, sacarle una "foto" a la página utilizando canvas, crear una imagen e incrustarla en el archivo PDF resultante.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Podemos usar la maqueta y tecnología que más nos guste ya que esta librería se encargará de que llegue al PDF de forma idéntica. (Hay excepciones)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Al ser una suerte de imagen incrustada en el archivo PDF, las piezas de nuestra composición que sean TEXTO no se renderizará como tal, con todo lo que eso implica, por ejemplo que se pixelará al hacer Zoom. (Los links sí funcionan)&lt;/li&gt;
&lt;li&gt;Si bien el concepto es bastante simple, se requiere entender y ajustar las opciones de configuración de esta librería para obtener el resultado deseado.&lt;/li&gt;
&lt;li&gt;Las imágenes deben contemplar el problema de CORS, para lo cual muchos sencillamente optan por utilizar imágenes vía base64&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3.- jsPDF
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UmaQscp3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4w2jiz1fx8ev0qnnj993.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UmaQscp3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4w2jiz1fx8ev0qnnj993.png" alt="jsPDF" width="588" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Otra librería para la creación de documentos PDF, pero en este caso no solo depende de una página sino que también se puede crear un documento de forma programática utilizando la API provista. (&lt;a href="https://parall.ax/products/jspdf"&gt;https://parall.ax/products/jspdf&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permite dos enfoques para resolver el mismo problema, lo cuál puede ser conveniente en algún caso&lt;/li&gt;
&lt;li&gt;Podemos usar la maqueta y tecnología que más nos guste ya que esta librería se encargará de que llegue al PDF de forma idéntica, ya que tiene la capacidad de utilizar la misma técnica de convertir la página a CANVAS para luego crear el documento deseado&lt;/li&gt;
&lt;li&gt;Es una librería muy utilizada y tiene buen soporte, está vigente&lt;/li&gt;
&lt;li&gt;Tiene una opción que intenta resolver el problema de textos cortados a la mitad cuando pasamos de una página a otra&lt;/li&gt;
&lt;li&gt;Se puede utilizar en Node.js&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si se decide utilizar la funcionalidad de crear el documento en base a la API provista, no será tan fácil crear composiciones complejas que quizás con tecnologías web sí es más sencillo de resolver&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4.- DOMPDF
&lt;/h2&gt;

&lt;p&gt;Ya que hablamos de tecnologías web, hablemos de PHP. Si necesitamos una solución similar a la de jsPDF pero del lado del servidor y con PHP, este es el paquete a elegir. Incluso tiene una adaptación para que se instale sin problemas en Laravel. Este es el sitio oficial: &lt;a href="https://dompdf.github.io/"&gt;https://dompdf.github.io/&lt;/a&gt;&lt;br&gt;
Este paquete puede ser utilizando con dos enfoques: Crear el documento con la API que nos provee (similar a jsPDF) ó crearlo en base a un HTML que le proveamos, no convertirá el HTML en canvas pero intentará resolver las piezas visuales  que aparezcan.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permite dos enfoques para resolver el mismo problema, lo cuál puede ser conveniente en algún caso&lt;/li&gt;
&lt;li&gt;Es una librería muy utilizada y tiene buen soporte, está vigente&lt;/li&gt;
&lt;li&gt;La transformación de HTML a PDF contempla el correcto renderizado de los textos excepto para elementos de formularios (inputs, textareas, etc)&lt;/li&gt;
&lt;li&gt;Puede resolver el problema de textos cortados a la mitad cuando pasamos de una página a otra&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contras:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La compatibilidad con CSS es oficialmente la de CSS 2.1 y no de CSS3, aunque es cierto que sí interpreta bien algunas cosas de CSS3.&lt;/li&gt;
&lt;li&gt;Si se decide utilizar la funcionalidad de crear el documento en base a la API provista, no será tan fácil crear composiciones complejas que quizás con tecnologías web sí es más sencillo de resolver&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Otras alternativas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Browsershot &lt;a href="https://github.com/spatie/browsershot"&gt;https://github.com/spatie/browsershot&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;Quizás la conclusión más sencilla sería la de utilizar jsPDF, pero eso dependerá más factores relacionados con el scope y características del proyecto en el que estamos trabajando.&lt;br&gt;
Espero que este breve artículo pueda ser útil para aquel que esté necesitando una guía rápida y sencilla de esta funcionalidad.&lt;br&gt;
Otro buen recurso es una pregunta que hicieron en stackoverflow (en inglés): &lt;a href="https://stackoverflow.com/questions/18191893/generate-pdf-from-html-in-div-using-javascript"&gt;https://stackoverflow.com/questions/18191893/generate-pdf-from-html-in-div-using-javascript&lt;/a&gt;&lt;br&gt;
Este recurso tiene incluso algunos ejemplos de implementación y técnicas para evitar algunos problema de las soluciones antes mencionadas. &lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>webdev</category>
      <category>php</category>
    </item>
    <item>
      <title>Estimado programador, estás usando Tests?</title>
      <dc:creator>Pablo Fumarola</dc:creator>
      <pubDate>Thu, 22 Apr 2021 23:26:08 +0000</pubDate>
      <link>https://dev.to/ajest/estimado-programador-estas-usando-tests-3i0i</link>
      <guid>https://dev.to/ajest/estimado-programador-estas-usando-tests-3i0i</guid>
      <description>&lt;p&gt;Una vez pregunté a un programador experimentado y conocido en la industria: Puede un sistema mediano / grande estar "bien hecho" sin el uso de testing automatizado?&lt;/p&gt;

&lt;p&gt;El respondió que sí. Personalmente he conocido muy buenos programadores que, aún sin usar testing en lo absoluto, al destacar en la "consistencia" de sus diseños y convenciones de trabajo, entregaban buenas piezas de software. La pregunta que surge es: Es esto aplicable a un equipo de 5, 10 o más personas? Difícil responder sí.&lt;/p&gt;

&lt;p&gt;Eso nos lleva a la realidad de que eminencias de la industria dirán que no se puede pensar en la idea de un sistema bien realizado sin el apoyo de una buena suite de tests.&lt;/p&gt;

&lt;p&gt;Es innegable que, cuando contamos con el respaldo de tests automatizados, no solo el sistema con el que trabajamos es más confiable, sino que el uso de los mismos nos obliga a mejorar nuestros diseños de software.&lt;/p&gt;

&lt;p&gt;Por esa razón, comparto algunas preguntas junto a sus modestas respuestas para los que recién se acercan a este mundo:&lt;/p&gt;

&lt;h1&gt;
  
  
  1 - Por qué debo testear?
&lt;/h1&gt;

&lt;p&gt;Los tests nos protegen contra los bugs (sí, es muy posible que estés lidiando con muchos bugs y por eso te estés acercando al mundo del testing), nos ahorra tiempo en el corto o mediano plazo, nos ayudan a pensar más en el diseño de nuestra sistema, en muchos casos nos suben el nivel técnico y por ende nos profesionaliza. Hay que detenerse un poco a pensar en todos los beneficios que esto conlleva, no son pocos.&lt;/p&gt;

&lt;h1&gt;
  
  
  2 - Cuáles son los tipos de tests más usados?
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Test de Aceptación ó e2e (End to End):&lt;/em&gt; Estos son aquellos que probarán nuestro sistema desde cada punto de entrada deseado, tratando de que este recorra la mayor cantidad posible del circuito de nuestro sistema. El objetivo es que interactúe con todos los elementos necesarios, conectándose a sistemas externos y levantado todos los servicios necesarios para su funcionamiento como si lo estuviese usando el "usuario final".&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Test de Integración:&lt;/em&gt; Este tipo de test probará como se integra nuestro sistema con otros sistemas externos. Un ejemplo es la base de datos. Otro ejemplo sería que un módulo de nuestro sistema se conecta a otro. Prueba circuitos más específicos y normalmente más cortos que los e2e.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Test Unitario:&lt;/em&gt; Este tipo de test, como su nombre lo indica, probará unidades de comportamiento de forma independiente. Tiene como propósito concentrarse en el modelo de negocio de nuestro sistema en vez de en cómo se integra a otros servicios. Trata de atacar a la lógica fundamental, el core del negocio, del sistema con el que trabajamos.&lt;/p&gt;

&lt;h1&gt;
  
  
  3 - Cómo deben ser los test?
&lt;/h1&gt;

&lt;p&gt;Deben ser simples, puntuales, fáciles de entender, descriptivos. Un solo método debería poder resolver toda la lógica, no debería esconderse ninguna lógica. No debe saber muchos detalles de implementación del componente ó sistema bajo test. Los tests suelen tener una misma fisionomía, una separación en tres grandes pasos (AAA): Arrange (Armado), Action (Acción), Assert (Afirmar).&lt;/p&gt;

&lt;h1&gt;
  
  
  4 - Qué debo testear?
&lt;/h1&gt;

&lt;p&gt;Debemos esforzarnos por testear, de forma directa o indirecta todos los flujos de nuestro sistema. El énfasis debe ser puesto en la lógica de negocio, en las piezas de nuestro software más importantes.&lt;/p&gt;




&lt;p&gt;Programar tests lleva tiempo, al principio no es fácil, y puede que lo hayamos intentado en más de una ocasión sin éxito. La clave está en perseverar y en entender que vale la pena el esfuerzo.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>design</category>
    </item>
  </channel>
</rss>
