現在のディレクトリ内のすべてのPDFをPNGに変換します


16

現在のディレクトリ内のbashすべての.pdfファイルをファイルに変換するスクリプトを書きたい.pngです。例えば:

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

これは私の最高の試みです:

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

回答:


17

あなたが持っている場合は、本当に奇妙な名前、改行やバックスラッシュなどが含まれているものを、あなたはこのような何かを行うことができます:

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

それはあなたがそれに投げるほぼすべてのものに対処できるはずです。

使用されるトリック:

  • find ... -print0find結果をヌル文字で区切って出力します。改行を扱いましょう。
  • IFS= :これは、空白を処理するために必要な単語分割を無効にします。
  • read -r:バックスラッシュを含むファイルを処理するために、バックスラッシュエスケープ文字の解釈を無効にします。
  • read -d '':findの出力を処理し、改行文字を含むファイル名を正しく処理するために、レコード区切り文字をヌル文字に設定します。
  • ${file%.*}.png:シェルの組み込みの文字列操作機能を使用して、拡張機能を削除します。

どちらの答えも良いですが、使用したトリックの説明が付いているので、私はこれを受け入れました。

または、移植可能(POSIX)にして、引き続き特殊文字を処理します。説明と背景については、unix.stackexchange.com / a / 321753/135943find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + 参照してください。
ワイルドカード

1
@Wildcardここで唯一の非POSIXなものはfind's -printfなので、移植性に必要なのはそれを `-exec printf '%s \ 0' {} +`に置き換えることだけです。
テルドン

14

for次のようにbash ループを使用できます。

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

7

現在のディレクトリ内のmogrifyすべて.pdfのをバッチ変換およびサイズ変更するために使用できます。

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

別のformat(この場合-format png)を使用する場合、元.pdfのsはそのまま残ります。出力ファイルは、拡張子がで指定されたものに変更されることを除いて、同じ名前を持ちますformat


1

bashの使用に制限されていない場合は、Pythonスクリプトを使用.pdfして、現在のディレクトリ内のすべてのファイルを高解像度.png画像に変換できます。他の入力/出力画像タイプに変更したり、に異なる引数を使用したりできます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()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.