Convierte cada pdf en el directorio actual a png

16

Quiero escribir un bashscript para convertir cada .pdfarchivo en el directorio actual en un .pngarchivo. Por ejemplo:

$ls .
a.pdf b.pdf
$./pdf2png.sh
Converting pdfs to pngs
a.pdf -> a.png
b.pdf -> b.png

Este es mi mejor intento:

#!/bin/bash
convert -verbose -density 500 -resize '800' a.pdf a.png
convert -verbose -density 500 -resize '800' b.pdf b.png
Me gusta codificar
fuente

Respuestas:

17

Si tiene nombres realmente extraños, que contienen líneas nuevas o barras diagonales inversas y similares, puede hacer algo como esto:

find . -type f -name '*.pdf' -print0 |
  while IFS= read -r -d '' file
    do convert -verbose -density 500 -resize 800 "${file}" "${file%.*}.png"
  done

Eso debería ser capaz de lidiar con casi cualquier cosa que le arrojes.

Trucos utilizados:

  • find ... -print0: hace findque se impriman sus resultados separados por el carácter nulo, tratemos con nuevas líneas.
  • IFS= : esto deshabilitará la división de palabras, necesaria para tratar con espacios en blanco.
  • read -r: desactiva la interpretación de los caracteres de escape de la barra diagonal inversa, para tratar con archivos que contienen barras diagonales inversas.
  • read -d '': establece el delimitador de registro en el carácter nulo, para tratar con la salida de find y manejar correctamente los nombres de archivo con caracteres de nueva línea.
  • ${file%.*}.png: utiliza las habilidades de manipulación de cadenas incorporadas en el shell para eliminar la extensión.
terdon
fuente
Ambas respuestas son buenas, pero acepté esta porque viene con una explicación de los trucos utilizados.
Me gusta codificar el
O hágalo de forma portátil (POSIX) y aún maneje caracteres especiales: find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + consulte unix.stackexchange.com/a/321753/135943 para obtener explicaciones y antecedentes.
Comodín el
1
@Wildcard lo único que no es posix aquí es encontrar -printf, por lo que todo lo que necesita para la portabilidad es reemplazarlo con `-exec printf '% s \ 0' {} +`.
terdon
14

Puede usar bash forloop de la siguiente manera:

#!/bin/bash
for pdfile in *.pdf ; do
  convert -verbose -density 500 -resize '800' "${pdfile}" "${pdfile%.*}".png
done
mkc
fuente
7

Puede usar la mogrifyconversión por lotes y cambiar el tamaño de todos los correos electrónicos .pdfdel directorio actual:

mogrify -verbose -density 500 -resize 800 -format png ./*.pdf

Cuando se usa un archivo diferente format(en este caso -format png), los originales .pdfse dejan intactos, los archivos de salida tienen el mismo nombre, excepto la extensión que se cambiará a la especificada por format.

don_crissti
fuente
1

Si no está restringido a usar bash, entonces podría usar un script de Python para convertir todos los .pdfarchivos en el directorio actual a .pngimágenes de alta resolución . Podría modificarse para otros tipos de imágenes de entrada / salida, o para usar diferentes argumentos para convert.

#! /usr/bin/env python

import os

def main():
    dir_list = os.listdir('.')
    for full_file_name in dir_list:
        base_name, extension = os.path.splitext(full_file_name)
        if extension == '.pdf': # then .pdf file --> convert to image!
            cmd_str = ' '.join(['convert',
                                '-density 400',
                                full_file_name,
                                base_name + '.png'])
            print(cmd_str)  # echo command to terminal
            os.system(cmd_str)  # execute command

if __name__ == '__main__':
    main()
MattKelly
fuente