Konversi setiap pdf dalam direktori saat ini ke png

16

Saya ingin menulis bashskrip untuk mengubah setiap .pdffile dalam direktori saat ini menjadi .pngfile. Sebagai contoh:

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

Ini adalah upaya terbaik saya:

#!/bin/bash
convert -verbose -density 500 -resize '800' a.pdf a.png
convert -verbose -density 500 -resize '800' b.pdf b.png
Saya Suka Kode
sumber

Jawaban:

17

Jika Anda memiliki nama yang benar - benar aneh, yang berisi baris baru atau garis miring terbalik dan sejenisnya, Anda dapat melakukan sesuatu seperti ini:

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

Itu harus bisa berurusan dengan apa saja yang kamu lemparkan padanya.

Trik yang digunakan:

  • find ... -print0: menyebabkan finduntuk mencetak hasilnya dipisahkan oleh karakter nol, mari kita berurusan dengan baris baru.
  • IFS= : ini akan menonaktifkan pemisahan kata, diperlukan untuk menangani spasi putih.
  • read -r: menonaktifkan penafsiran karakter backslash escape, untuk menangani file yang mengandung backslash.
  • read -d '': menetapkan pembatas rekaman ke karakter nol, untuk menangani keluaran find dan menangani nama file dengan benar dengan karakter baris baru.
  • ${file%.*}.png: menggunakan kemampuan manipulasi string bawaan shell untuk menghapus ekstensi.
terdon
sumber
Kedua jawaban itu baik tetapi saya menerima yang ini karena dilengkapi dengan penjelasan tentang trik yang digunakan.
Saya Suka Kode
Atau lakukan dengan mudah (POSIX) dan masih menangani karakter khusus: find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + Lihat unix.stackexchange.com/a/321753/135943 untuk penjelasan dan latar belakang.
Wildcard
1
@Wildcard satu-satunya hal non-posix di sini adalah find -printf, jadi yang Anda perlukan untuk portabilitas adalah menggantinya dengan `-exec printf '% s \ 0' {} +`.
terdon
14

Anda dapat menggunakan bash forloop sebagai berikut:

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

Anda dapat menggunakan mogrifyuntuk mengonversi & mengubah ukuran semua .pdfdalam direktori saat ini:

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

Ketika menggunakan yang berbeda format(dalam hal ini -format png) yang asli .pdftidak tersentuh, file output memiliki nama yang sama kecuali untuk ekstensi yang akan diubah ke yang ditentukan oleh format.

don_crissti
sumber
1

Jika Anda tidak dibatasi untuk menggunakan bash, maka Anda dapat menggunakan skrip python untuk mengonversi semua .pdffile di direktori saat ini ke .pnggambar resolusi tinggi. Ini dapat dimodifikasi untuk tipe gambar input / output lain, atau untuk menggunakan argumen yang berbeda 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
sumber