commit c8b337236eda1c9d25d6beb37a0f3b88d1234ad0 Author: luisgulo Date: Sun Feb 9 16:09:45 2025 +0100 Version final diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d761353 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +# ignorar imagenes en formato .webp +webp/* + diff --git a/README.md b/README.md new file mode 100644 index 0000000..2a7ecf3 --- /dev/null +++ b/README.md @@ -0,0 +1,98 @@ +# Generador de Portadas para Libros + +Para generar una portada a incluir en documentos Markdown y que +se puedan generar documentos con **Pandoc** que lleven la imagen de la portada incluida. + +## Imágenes + +Las imágenes que se utilizan para la parte del medio de la portada son todas +las que encuentre en la ruta `./imagenes/` + +Se comprueba si existe en la ruta de ejecución el fichero `imagen.png`. +Si no existe localiza *aleatoriamente* una de la ruta imagenes para usarla. + +Si quieres preseleccionar usar, lo mejor es crear un enlace a la imagen de la +carpeta en donde tengas la imagen que quieras usar: + +``` +ln -sf /ruta/foto.png imagen.png +``` +> Sólo se permiten imagenes en formato **PNG** + +# Editar y Compilar el Código + +El fichero fuente en Go (Golang) se llama `portada.go` + +Tras cualquier cambio puedes generar un nuevo binario (con golang instalado) +simplemente ejecutando: + +``` +go build -o portada +``` + +El binario/aplicación generado es: `portada` + +## Ejecución y portada generada + +El programa no necesita entorno gráfico para funcionar. + +Simplemente inicialo desde un terminal: +``` +./portada +``` + +Completa los datos que te pide: +``` + GENERADOR DE PORTADAS PARA LIBROS + Título: + TITULO DE MI LIBRO + SubTítulo: + Un libro que lo explica casi todo + Autor: + Anónimo Veneciano + Editorial: + LETRAS CURVAS + Color de Portada [ N:Negro, R:Rojo, V:Verde, A:Azul, M:Amarillo ] + V + + Generando Portada. Espere por favor.... + Se ha generado 'portada.png +``` +Tras unos segundos tendrás tu portada generada: + +![Ejemplo de Portada](portada.png) + +## Incluir portada en fichero Markdown para uso con Pandoc + +Si usas Markdown para crear tu documentación y luego generar el Manual/Guía +resultando con Pandoc, puedes modificar tu fichero `Portada.md` para incluir +la imagen de la portada y que quede perfecta la presentación: + +``` +--- +title: | + ![](portada.png) + MANUAL PARA GENERACIÓN DE PORTADA DE LIBROS +subtitle: Ejemplo de portada generada con la aplicación realizada en Go +author: Luis Gutiérrez López +date: Marzo 2024 +abstract: | + Una forma sencilla de incluir una portada a tus publicaciones realizadas + con Pandoc con texto sencillo realizado con Markdown y LaTeX. + + Totalmente personalizable tanto en imágenes, título y subtítulos, asi como + en los colores del tema de la portada final del Libro. +--- +\thispagestyle{empty} +\pagebreak + +``` + +El truco es indicar en *title* que se trata de un párrafo (no de una línea), +para ello usamos el símbolo de *pipe* `|` +En la primera línea indicamos la imagen de la portada generada, +y en la segunda línea escribimos el titulo de forma normal. + +Cuando generemos mediante *Pandoc* el Libro/Manual/Guía el resultado final será el siguiente: + +![Vista de las página con portada incrustada](dos-paginas.png) diff --git a/dos-paginas.png b/dos-paginas.png new file mode 100644 index 0000000..d308a2c Binary files /dev/null and b/dos-paginas.png differ diff --git a/fuentes/Bebas.ttf b/fuentes/Bebas.ttf new file mode 100644 index 0000000..76e22b8 Binary files /dev/null and b/fuentes/Bebas.ttf differ diff --git a/fuentes/Hand.ttf b/fuentes/Hand.ttf new file mode 100644 index 0000000..9609908 Binary files /dev/null and b/fuentes/Hand.ttf differ diff --git a/fuentes/Roboto.ttf b/fuentes/Roboto.ttf new file mode 100644 index 0000000..647c3e3 Binary files /dev/null and b/fuentes/Roboto.ttf differ diff --git a/fuentes/Sketch.ttf b/fuentes/Sketch.ttf new file mode 100644 index 0000000..4951675 Binary files /dev/null and b/fuentes/Sketch.ttf differ diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..495456a --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module portada + +go 1.20 + +require github.com/fogleman/gg v1.3.0 + +require ( + github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect + golang.org/x/image v0.15.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c1f751f --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= +golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= diff --git a/imagen.png b/imagen.png new file mode 120000 index 0000000..c8ae2fe --- /dev/null +++ b/imagen.png @@ -0,0 +1 @@ +imagenes/cangrejo.png \ No newline at end of file diff --git a/imagenes/abisal.png b/imagenes/abisal.png new file mode 100755 index 0000000..a9e904c Binary files /dev/null and b/imagenes/abisal.png differ diff --git a/imagenes/araña.png b/imagenes/araña.png new file mode 100755 index 0000000..d42db3e Binary files /dev/null and b/imagenes/araña.png differ diff --git a/imagenes/atun.png b/imagenes/atun.png new file mode 100755 index 0000000..f1a5989 Binary files /dev/null and b/imagenes/atun.png differ diff --git a/imagenes/avestruz.png b/imagenes/avestruz.png new file mode 100755 index 0000000..bba35fe Binary files /dev/null and b/imagenes/avestruz.png differ diff --git a/imagenes/avispa.png b/imagenes/avispa.png new file mode 100755 index 0000000..cfbf767 Binary files /dev/null and b/imagenes/avispa.png differ diff --git a/imagenes/ballena.png b/imagenes/ballena.png new file mode 100755 index 0000000..d36686b Binary files /dev/null and b/imagenes/ballena.png differ diff --git a/imagenes/buho.png b/imagenes/buho.png new file mode 100755 index 0000000..968f7f3 Binary files /dev/null and b/imagenes/buho.png differ diff --git a/imagenes/burro.png b/imagenes/burro.png new file mode 100755 index 0000000..d833f1e Binary files /dev/null and b/imagenes/burro.png differ diff --git a/imagenes/caballo.png b/imagenes/caballo.png new file mode 100755 index 0000000..4ec3b10 Binary files /dev/null and b/imagenes/caballo.png differ diff --git a/imagenes/camaleon.png b/imagenes/camaleon.png new file mode 100755 index 0000000..68a6557 Binary files /dev/null and b/imagenes/camaleon.png differ diff --git a/imagenes/cangrejo.png b/imagenes/cangrejo.png new file mode 100755 index 0000000..6f618ac Binary files /dev/null and b/imagenes/cangrejo.png differ diff --git a/imagenes/canguro.png b/imagenes/canguro.png new file mode 100755 index 0000000..0b55943 Binary files /dev/null and b/imagenes/canguro.png differ diff --git a/imagenes/castor.png b/imagenes/castor.png new file mode 100755 index 0000000..9ab55ff Binary files /dev/null and b/imagenes/castor.png differ diff --git a/imagenes/cebra.png b/imagenes/cebra.png new file mode 100755 index 0000000..076da82 Binary files /dev/null and b/imagenes/cebra.png differ diff --git a/imagenes/ciervo.png b/imagenes/ciervo.png new file mode 100755 index 0000000..5824f70 Binary files /dev/null and b/imagenes/ciervo.png differ diff --git a/imagenes/cocodrilo.png b/imagenes/cocodrilo.png new file mode 100755 index 0000000..4988f68 Binary files /dev/null and b/imagenes/cocodrilo.png differ diff --git a/imagenes/elefante.png b/imagenes/elefante.png new file mode 100755 index 0000000..92510aa Binary files /dev/null and b/imagenes/elefante.png differ diff --git a/imagenes/escarabajo.png b/imagenes/escarabajo.png new file mode 100755 index 0000000..1b13f04 Binary files /dev/null and b/imagenes/escarabajo.png differ diff --git a/imagenes/gallo.png b/imagenes/gallo.png new file mode 100755 index 0000000..57fbcf2 Binary files /dev/null and b/imagenes/gallo.png differ diff --git a/imagenes/ganso.png b/imagenes/ganso.png new file mode 100755 index 0000000..dba32fc Binary files /dev/null and b/imagenes/ganso.png differ diff --git a/imagenes/gato.png b/imagenes/gato.png new file mode 100755 index 0000000..f94271e Binary files /dev/null and b/imagenes/gato.png differ diff --git a/imagenes/gatoenfadado.png b/imagenes/gatoenfadado.png new file mode 100755 index 0000000..bbab4ee Binary files /dev/null and b/imagenes/gatoenfadado.png differ diff --git a/imagenes/gerbil.png b/imagenes/gerbil.png new file mode 100755 index 0000000..3dab7a9 Binary files /dev/null and b/imagenes/gerbil.png differ diff --git a/imagenes/gorila.png b/imagenes/gorila.png new file mode 100755 index 0000000..b5e9567 Binary files /dev/null and b/imagenes/gorila.png differ diff --git a/imagenes/jerbo.png b/imagenes/jerbo.png new file mode 100755 index 0000000..6e01b99 Binary files /dev/null and b/imagenes/jerbo.png differ diff --git a/imagenes/jirafa.png b/imagenes/jirafa.png new file mode 100755 index 0000000..6bcdd01 Binary files /dev/null and b/imagenes/jirafa.png differ diff --git a/imagenes/koala.png b/imagenes/koala.png new file mode 100755 index 0000000..8306398 Binary files /dev/null and b/imagenes/koala.png differ diff --git a/imagenes/lemur.png b/imagenes/lemur.png new file mode 100755 index 0000000..3c7f747 Binary files /dev/null and b/imagenes/lemur.png differ diff --git a/imagenes/llama.png b/imagenes/llama.png new file mode 100755 index 0000000..7b4b2fb Binary files /dev/null and b/imagenes/llama.png differ diff --git a/imagenes/loro.png b/imagenes/loro.png new file mode 100755 index 0000000..3a14417 Binary files /dev/null and b/imagenes/loro.png differ diff --git a/imagenes/mapache.png b/imagenes/mapache.png new file mode 100755 index 0000000..e92fe4c Binary files /dev/null and b/imagenes/mapache.png differ diff --git a/imagenes/mariposa.png b/imagenes/mariposa.png new file mode 100755 index 0000000..c7c9c7b Binary files /dev/null and b/imagenes/mariposa.png differ diff --git a/imagenes/medusa.png b/imagenes/medusa.png new file mode 100755 index 0000000..b970e04 Binary files /dev/null and b/imagenes/medusa.png differ diff --git a/imagenes/murcielago.png b/imagenes/murcielago.png new file mode 100755 index 0000000..493cc05 Binary files /dev/null and b/imagenes/murcielago.png differ diff --git a/imagenes/nutria.png b/imagenes/nutria.png new file mode 100755 index 0000000..473bbde Binary files /dev/null and b/imagenes/nutria.png differ diff --git a/imagenes/orangutan.png b/imagenes/orangutan.png new file mode 100755 index 0000000..70c9ef7 Binary files /dev/null and b/imagenes/orangutan.png differ diff --git a/imagenes/oso.png b/imagenes/oso.png new file mode 100755 index 0000000..120f2d2 Binary files /dev/null and b/imagenes/oso.png differ diff --git a/imagenes/paloma.png b/imagenes/paloma.png new file mode 100755 index 0000000..81c945b Binary files /dev/null and b/imagenes/paloma.png differ diff --git a/imagenes/pavo.png b/imagenes/pavo.png new file mode 100755 index 0000000..e80e317 Binary files /dev/null and b/imagenes/pavo.png differ diff --git a/imagenes/perro.png b/imagenes/perro.png new file mode 100755 index 0000000..231f598 Binary files /dev/null and b/imagenes/perro.png differ diff --git a/imagenes/perro2.png b/imagenes/perro2.png new file mode 100755 index 0000000..594ecba Binary files /dev/null and b/imagenes/perro2.png differ diff --git a/imagenes/pezluna.png b/imagenes/pezluna.png new file mode 100755 index 0000000..1f02438 Binary files /dev/null and b/imagenes/pezluna.png differ diff --git a/imagenes/pezvolador.png b/imagenes/pezvolador.png new file mode 100755 index 0000000..425aae2 Binary files /dev/null and b/imagenes/pezvolador.png differ diff --git a/imagenes/pinguino.png b/imagenes/pinguino.png new file mode 100755 index 0000000..19dbcbf Binary files /dev/null and b/imagenes/pinguino.png differ diff --git a/imagenes/pterodactilo.png b/imagenes/pterodactilo.png new file mode 100755 index 0000000..0bb8fd6 Binary files /dev/null and b/imagenes/pterodactilo.png differ diff --git a/imagenes/pulpo.png b/imagenes/pulpo.png new file mode 100755 index 0000000..caec280 Binary files /dev/null and b/imagenes/pulpo.png differ diff --git a/imagenes/puma.png b/imagenes/puma.png new file mode 100755 index 0000000..2dedfe8 Binary files /dev/null and b/imagenes/puma.png differ diff --git a/imagenes/rana.png b/imagenes/rana.png new file mode 100755 index 0000000..0e0c139 Binary files /dev/null and b/imagenes/rana.png differ diff --git a/imagenes/rape.png b/imagenes/rape.png new file mode 100755 index 0000000..f6696ab Binary files /dev/null and b/imagenes/rape.png differ diff --git a/imagenes/raya.png b/imagenes/raya.png new file mode 100755 index 0000000..a7719b7 Binary files /dev/null and b/imagenes/raya.png differ diff --git a/imagenes/siluro.png b/imagenes/siluro.png new file mode 100755 index 0000000..17ae7bb Binary files /dev/null and b/imagenes/siluro.png differ diff --git a/imagenes/tiburon.png b/imagenes/tiburon.png new file mode 100755 index 0000000..3b03eb7 Binary files /dev/null and b/imagenes/tiburon.png differ diff --git a/imagenes/tigre.png b/imagenes/tigre.png new file mode 100755 index 0000000..b1652ca Binary files /dev/null and b/imagenes/tigre.png differ diff --git a/imagenes/toro.png b/imagenes/toro.png new file mode 100755 index 0000000..9cfb157 Binary files /dev/null and b/imagenes/toro.png differ diff --git a/imagenes/tortuga.png b/imagenes/tortuga.png new file mode 100755 index 0000000..d473bda Binary files /dev/null and b/imagenes/tortuga.png differ diff --git a/imagenes/vaca.png b/imagenes/vaca.png new file mode 100755 index 0000000..93a746f Binary files /dev/null and b/imagenes/vaca.png differ diff --git a/imagenes/zorro.png b/imagenes/zorro.png new file mode 100755 index 0000000..6353edd Binary files /dev/null and b/imagenes/zorro.png differ diff --git a/portada b/portada new file mode 100755 index 0000000..79d204c Binary files /dev/null and b/portada differ diff --git a/portada.go b/portada.go new file mode 100644 index 0000000..50f8fea --- /dev/null +++ b/portada.go @@ -0,0 +1,216 @@ +package main + +import ( + "github.com/fogleman/gg" + "image"; "image/png"; "image/color" + "fmt"; "os" + "bufio"; "strings" + "math/rand"; "time" +) + + +// Pagina A4 (2480 x 3508) +var pagAncho = 2480 +var pagAlto = 3508 +var portada = gg.NewContext(pagAncho, pagAlto) // Tamaño de Portada A4 para la Imagen (Ancho x Alto) +var AltoAreaTitulo = 920 // Altura en pixeles del Area de Titulo +// Colores/Temas +var colorTema = color.RGBA{60, 92, 153, 255} // Color del Tema del Libro (defectoa es Azul) +var colorRojo = color.RGBA{202, 31, 0, 255} +var colorVerde = color.RGBA{29, 149, 27, 255} +var colorAzul = color.RGBA{60, 92, 153, 255} // Azul con transparencia +var colorAmarillo = color.RGBA{223, 217, 26, 255} +var colorBlanco = color.RGBA{255, 255, 255, 255} // Blanco con transparencia +var colorNegro = color.RGBA{0, 0, 0, 255} // Negro con transparencia +// Texto +var colorTextoTitulo = (color.RGBA{255, 255, 255, 230}) // Blanco con transparencia reducida +var colorTextoResumen = (color.RGBA{0, 0, 0, 230}) // Negro con transparencia reducida + +func main() { + // Generador de Portadas de Libro + fmt.Println("GENERADOR DE PORTADAS PARA LIBROS") + + // Pedir datos + leer := bufio.NewReader(os.Stdin) + + fmt.Println("Título: ") + inTitulo, _ := leer.ReadString('\n') + inTitulo = strings.Replace(inTitulo, "\n", "", -1) + + fmt.Println("SubTítulo: ") + inSubtitulo, _ := leer.ReadString('\n') + inSubtitulo = strings.Replace(inSubtitulo, "\n", "", -1) + + fmt.Println("Autor: ") + inAutor, _ := leer.ReadString('\n') + inAutor = strings.Replace(inAutor, "\n", "", -1) + + fmt.Println("Editorial: ") + inEditorial, _ := leer.ReadString('\n') + inEditorial = strings.Replace(inEditorial, "\n", "", -1) + + // Color Portada + fmt.Println("Color de Portada [ N:Negro, R:Rojo, V:Verde, A:Azul, M:Amarillo ] ") + inColor, _ := leer.ReadString('\n') + inColor = strings.Replace(inColor, "\n", "", -1) + switch inColor { + case "N": // Negro + colorTema = colorNegro + //colorTema = color.RGBA{0, 0, 0, 255} + case "R": // Rojo + colorTema = colorRojo + //colorTema = color.RGBA{202, 31, 0, 255} + case "V": // Verde + colorTema = colorVerde + //colorTema = color.RGBA{29, 149, 27, 255} + case "A": // Azul + colorTema = colorAzul + //colorTema = color.RGBA{60, 92, 153, 255} + case "M": // Amarillo + colorTema = colorAmarillo + //colorTema = color.RGBA{223, 217, 26, 255} + default: // defecto es Azul + colorTema = colorAzul + } + + fmt.Println("Generando Portada. Espere por favor....") + + + // Fondo portada (x, y, ancho/width, alto/height) + DibujaRectanguloColor(colorBlanco, 0, 0, portada.Width(), portada.Height()) + DibujaRectanguloColor(colorTema, 0, 200, portada.Width(), AltoAreaTitulo) + + // Localizar imagen deseada: imagen.png -es un link de imagen en ruta ./imagen/ + // Si no existe escoger imagen al azar + if _, err := os.Stat("./imagen.png"); err == nil { + LeerIncluirImagen("./imagen.png", 200, AltoAreaTitulo+400) + } else { + // imagen random + f, err := os.Open("./imagenes") + if err != nil { + fmt.Println(err) + return + } + files, err := f.Readdir(0) + if err != nil { + fmt.Println(err) + return + } + // Random + rand.Seed(time.Now().UnixNano()) + min := 0 + max := len(files)-1 + posRandom := rand.Intn(max - min) + min + LeerIncluirImagen("./imagenes/"+files[posRandom].Name(), 200, AltoAreaTitulo+400) + } + + PonerTextoTitulo(inTitulo, 150, 135) + PonerTextoResumen(inSubtitulo, 150, 72) + + PonerTextoEditorial(inEditorial, 100) + PonerTextoAutor(inAutor, 72) + + // Banda superior + DibujaRectanguloColor(colorTema, 60, 0, portada.Width()-120, 20) + // Banda inferior + DibujaRectanguloColor(colorTema, 60, pagAlto-20, portada.Width()-120, 20) + + portada.SavePNG("portada.png") + fmt.Println("Se ha generado 'portada.png") +} + + +func DibujaRectanguloColor(c color.Color, x, y, w, h int) { + portada.SetColor(c) + portada.DrawRectangle(float64(x), float64(y), float64(w), float64(h)) + portada.Fill() +} + +func LeerIncluirImagen(fichImagen string, x, y int) { + backgroundImage, err := gg.LoadImage(fichImagen) + if err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(1) + } + portada.DrawImage(backgroundImage, x, y) +} + +func PonerTextoTitulo(titulo string, margin int, size int) { + // Leer el fichero de la fuente ttf y fijar tamaño fuente + if err := portada.LoadFontFace("./fuentes/Roboto.ttf", float64(size)); err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(1) + } + // Fijar color del texto y mostrar el titulo + // usando un margen definido - centrando el texto mostrado + // area con el Area del Titulo + portada.SetColor(colorTextoTitulo) + portada.DrawStringWrapped(titulo, + float64(portada.Width())/2, float64(AltoAreaTitulo)/2+200, // x, y + 0.5, 0.5, + float64(portada.Width()-(margin*2)), + 1.5, // alto linea + gg.AlignLeft) +} + +func PonerTextoResumen(resumen string, margin int, size int) { + // Leer el fichero de la fuente ttf y fijar tamaño fuente + if err := portada.LoadFontFace("./fuentes/Roboto.ttf", float64(size)); err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(1) + } + // Fijar color del texto y mostrar el titulo + // usando un margen definido - centrando el texto mostrado + // area con el Area del Titulo + portada.SetColor(colorTextoResumen) + portada.DrawStringWrapped(resumen, + float64(portada.Width())/2, float64(80), // x, y + 0.5, 0.5, + float64(portada.Width()-(margin*2)), + 1.5, // alto linea + gg.AlignLeft) +} + + +func PonerTextoAutor(autor string, size int) { + // Leer el fichero de la fuente ttf y fijar tamaño fuente + if err := portada.LoadFontFace("./fuentes/Bebas.ttf", float64(size)); err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(1) + } + // Fijar color y situarlo (si amarillo autor en negro) + if colorTema == colorAmarillo { + portada.SetColor(colorNegro) + } else { + portada.SetColor(colorTema) + } + portada.DrawString(autor, float64(pagAncho/3*2), float64(pagAlto-130)) +} + + +func PonerTextoEditorial(editorial string, size int) { + // Leer el fichero de la fuente ttf y fijar tamaño fuente + if err := portada.LoadFontFace("./fuentes/Sketch.ttf", float64(size)); err != nil { + fmt.Fprintf(os.Stderr, "%s\n", err) + os.Exit(1) + } + // Fijar color y situarlo + portada.SetColor(colorTema) + portada.DrawString(editorial, float64(140), float64(pagAlto-130)) +} + +func SavePNG(imagen image.Image, fichero string) error { + f, err := os.Create(fichero) + if err != nil { + return err + } + defer f.Close() + if err := png.Encode(f, imagen); err != nil { + return err + } + if err := f.Close(); err != nil { + return err + } + return nil +} + diff --git a/portada.png b/portada.png new file mode 100644 index 0000000..c7216cd Binary files /dev/null and b/portada.png differ