Lo que he aprendido: exportar todas las imágenes fig de una carpeta a pdf con Matlab

Hoy os vengo a contar una de estas cosas que te parece que vas a poder hacer en un ratín pero se acaban conviertiendo en algo del estilo del camino al Calvario. Os sitúo un poco en el contexto: estoy escribiendo la tesis y tengo que tener los gráficos con un determinado formato. Para ello pensé que lo más cómodo era hacerme una pequeña función en Matlab que hiciera los gráficos a mi gusto y guardarlos en formato fig por si quería hacer algún cambio. Hasta aquí todo bien. Después quería meter estos gráficos en el documento, claro. Como supondréis, estoy escribiendo en Markdown (tengo una plantilla muy guapa que ya os pasaré cuando acabe con todo 😉 ) y por algún motivo no me carrulaba bien el tema al usar figuras en formato eps así que pensé en exportalas en pdf. Ya que estaba, pensé en ir haciendo las figuras y luego exportarlas con otra funcioncilla todas juntas. Aquí empieza el lío bananero. Os lo cuento.

La leyenda mágica

El primer problema que me encontré fue el problema de que a pesar de que en la pantalla yo veía el gráfico perfecto, al exportar la letra de la leyenda se volvía loca y se salía del cuadrado o hacia cosas locas en general del estilo de esto:

Esto parece ser que ocurre por las diferencias de tamaño de la imagen en sí y el papel y una búsqueda en el interneto (abajo tenéis las fuentes) me llevó a la conclusión de que se solucionaba ajustando el tamaño del gráfico de la pantalla al que tendría en el papel, es decir, haciendo algo del estilo de:

pu = get(gcf,'PaperUnits');
pp = get(gcf,'PaperPosition');
set(gcf,'Units',pu,'Position',pp)

¡Primer problema solucionado! Vayamos a por el segundo.

El cacho blanco gigantérrimo

El siguiente problema fue que, vale, me hacía el gráfico bien, pero hacía un borde blanco gigantesco alrededor y eso luego era una liada al incluirlo en el texto. Otra búsqueda me llevó a las siguientes conclusiones:

  • Usando pdfcrop, una herramienta incluida en MikTeX (que resulta ser mi cacharro de compilar Latex), podía definir cómo tenían que ser los márgenes de gordos

  • Exportando a eps y luego convirtiendo a pdf supuestamente no me hacía en trozaco blanco. Para eso necesitaba otra herramienta incluida en MikTeX: epstopdf, que ya había usado anteriormente y me creaba sentimientos encontrados.

Opté por la primera opción que me pareció así de primeras más fácil. Aunque como enseguida veremos, me equivocaba de parte a parte.

Error 127 de pdfcrop

Usar pdfcrop no tiene más que hacer:

pdfcrop --margins '<left> <top> <right> <bottom>' input.pdf output.pdf

Poniendo el valor del margen que queremos dejar en cada lado. Dentro de Matlab lo podemos usar sin problema con la función system, además. Pues estaba yo muy contenta hasta ver esto:

PDFCROP 1.38, 2012/11/02 - Copyright (c) 2002-2012 by Heiko Oberdiek.
!!! Error: Ghostscript exited with error code 127!

Este error tan informativo él significa que pdfcrop necesita GhostScript para funcionar. Y yo justo no lo tengo instalado y no me apetece instalarlo tampoco. Así que no nos queda otra que pasarnos a la opción b: exportar en eps y transformar.

El problema loco de los line endings de Windows

Pues nada, cambio el código y llamo a epstopdf con la función system y me aparece esto:

Error: /undefined in guageLevel:
Operand stack:

Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1926 1 3 %oparray_pop 1925 1 3 %oparray_pop --nostringval-- 1909 1 3 %oparray_pop 1803 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval--
Dictionary stack:
--dict:1169/1684(ro)(G)-- --dict:0/20(G)-- --dict:81/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
MiKTeX GPL Ghostscript 9.05: Unrecoverable error, exit code 1
epstopdf: Invalid argument

Aun más raro, me crea el pdf pero está en blanco. De nuevo recurrimos a Internet y nos damos cuenta de que ¡oh! es por el tema de cómo acaba Windows las líneas (con \r\n en vez del mítico \n) que no sé qué líos se monta con el epstopdf. Eso es fácil de solucionar, lo podemos hacer en el propio Matlab (en los links está mejor explicado):

    eps = fileread(archivo);
    fd = fopen(archivo, 'wt');
    fwrite(fd, eps);
    fclose(fd);

Así que esto ya lo tenemos.

La solución final

Bien, pues juntando todo nos queda algo tipo esto:

que coge las figuras de la carpeta que le digamos y crea los pdfs y los mete en la carpeta correspondiente. ¿Qué os parece? 😀

Fuentes

Cargar fig sin mostrarla

Ajustar tamaño

Sobre el bug de la leyenda

Problemas al crear pdf desde eps en Matlab

Error 127

Relación entre figuras y archivos mat

Funciones lambda y celdas

ACTUALIZACIÓN

Lo he puesto en GitHub

Anuncios

Un pensamiento en “Lo que he aprendido: exportar todas las imágenes fig de una carpeta a pdf con Matlab

  1. Pingback: Compilación: Matlab | Onda Hostil

¡Opina sin miedo! (Puedes usar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s