一部のファイルをjpegからpdfに変換したい。次のコマンドを使用しています。
$ convert image1.jpg image1.pdf
でも100枚の画像があります。それらのすべてを対応するPDFに変換するにはどうすればよいですか?
私は試した
$ convert image*.jpg image*.pdf
動作しません。
バッシュで:
for f in *.jpg; do
convert ./"$f" ./"${f%.jpg}.pdf"
done
これには mogrify
コマンドを使用できます。通常、ファイルをインプレースで変更しますが、フォーマットを変換するときに、新しいファイルに書き込みます(新しいフォーマットに一致するように拡張子を変更するだけです)。したがって:
mogrify -format pdf -- *.jpg
(enzotibの./*.jpg
と同様に、--
は奇妙なファイル名がスイッチとして解釈されるのを防ぎます。ほとんどのコマンドは--
を認識して、「この時点でオプションの検索を停止する」ことを意味します。)
より高速ですが珍しい構文:
parallel convert '{} {.}.pdf' ::: *.jpg
並列実行( https://www.gnu.org/software/parallel/ を使用)。 convert
のマルチスレッド化にまだ気づいていないため、効果的な並列化が制限されます。それが問題である場合は、マルチスレッドが発生しないようにする方法について、以下のコメントを参照してください。
https://gitlab.mister-muffin.de/josch/img2pdf
ImageMagickを含むすべての提案されたソリューションでは、JPEGデータは完全にデコードおよび再エンコードされます。これは 世代損失 の結果となり、パフォーマンスはimg2pdf
より "10〜100"倍低下します。
依存関係があれば、pip img2pdf
を使用してインストールできます(例:apt-get install python python-pil python-setuptools libjpeg-dev
またはyum install python python-pillow python-setuptools
)。
上記の提案の最良のものをシンプルで効率的で堅牢なコマンドラインに組み合わせる方法を次に示します。
_find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +
_
_-
_で始まるファイル名またはスペースを含むファイル名で正常に機能します。 _-iname
_の大文字と小文字を区別しないバージョンの_-name
_を使用しているので、_.JPG
_だけでなく_.jpg
_。
これはfind
を使用して、_*.jpg
_ワイルドカードによるシェルグロビングの代わりにファイルリストを取得します。これにより、一部のシステムでは 'Argument list too long'エラー が発生する可能性があります。 @enzotibがコメントで指摘しているように、 forループでのグロビングはコマンドの引数とは異なります を使用した場合の動作です。
また、find
はサブディレクトリを処理しますが、シェルグロビングは、zshの_**/*jpg
_再帰的グロビング構文のようなシェル固有の機能がない限り、処理されません。
編集:@ IlmariKaronen reについてのコメントを読んだ後で考えたfind
の別の便利な機能を追加すると思いました-コマンドを実行し、最初の実行以降に変更されたファイルのみを変換します。
最初のパスでは、変換が完了した後にタイムスタンプファイルをtouch
できます。
_find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp
_
次に、_-newer timestamp
_をfind
式に追加して、最終変更時刻がタイムスタンプファイルより新しいファイルのサブセットを操作します。各実行後にタイムスタンプファイルの更新を続行します。
_find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp
_
これは、Makefileを使用する必要がない簡単な方法です(既に使用している場合を除く)。これは、可能な限りfind
を使用する価値があるもう1つの理由です...
これは、convert
を使用して直接行うことができます。これは コマンドライン処理 に関するImageMagicksサイトの下部にあります。
convert *.jpg +adjoin page-%d.pdf
私は次のmakefileを似たようなものに使用しました:
_SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))
all: $(PNG)
%.png: origs/%.svg
convert -resize "64x" $< $@
clean:
rm $(PNG)
_
これでmake
を実行するだけで、周りにあるすべてのsvgファイルのpngファイルを取得できます。
編集
要求通り:
origs/foo.svg
_は_foo.png
_になります)all: $(PNG)
は、ターゲット「すべて」がすべてのPNGに依存することを定義します%.png: origs/%.svg
_が定義し、ファイル$ X.pngはorigs/$ X.svgに依存し、_convert ... $< $@
_。を呼び出すことによって生成できます。$<
_は依存関係であり、$@
_はターゲット名です残念ながらconvert
は前にイメージを変更して、元のjpg
の品質の損失を最小限に抑えるために使用する必要があります_img2pdf
_、私はこのコマンドを使用します:
1)これにより、解像度や品質を損なうことなく、すべてのpdf
画像からjpg
ファイルを作成できます。
_ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
_
2)pdf
pagesを1つに連結するには、次のようにします。
_pdftk *.pdf cat output combined.pdf
_
3)そして最後に、PDFのスキャンの品質を変更しないOCRedテキストレイヤーを追加して、検索可能にします。
_pypdfocr combined.pdf
_
MacOSユーティリティSIPS
MacOS(Sierra)では、Appleの組み込みコマンドラインユーティリティsips
は、Appleのすべてのラスターイメージユーティリティへの包括的なアクセスを提供します。これには、jpg
からpdf
への変換が含まれていることがわかります。
たとえば、既存の低解像度/小さいサイズのjpg
画像'cat.jpg'
(サイズ8401バイト)から、次のコマンドラインは'cat.pdf'
を作成します。ラスター解像度は変更されず、ファイルサイズ:
$ sips -s format pdf cat.jpg --out 'cat.pdf' 1>/dev/null 2>&1
$ ls -l cat.*
-rw-r--r--@ 1 <user redacted> <group redacted> 8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 <user redacted> <group redacted> 10193 Jun 18 07:22 cat.pdf
AdobeのPSD
ラスター画像形式への変換同様のsips
イディオムは、Adobe互換の*.psd
ファイルを作成します
$ sips -s format psd cat.jpg --out 'cat.psd' 1>/dev/null 2>&1
$ ls -l cat.jpg cat.psd
-rw-r--r--@ 1 Administration staff 8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 Administration staff 350252 Jun 18 07:37 cat.psd
ただし、Adope psd
ラスター形式の使用に伴う30倍のファイルサイズ拡張に注意してください。
ブック制作複数の形式で提供される何百もの画像を含む大規模なブック制作を行う上で、私にとって便利なコマンドラインイディオムはImageMagick
ユーティリティを使用して純粋なラスター画像ファイルを作成しましたpng
形式(すべてのメタデータとカラープロファイルを取り除いたもの)、次にsips
を使用してカラープロファイルやコメントの均一なセットを復元し、sips
を使用して最終的な出力ファイル(最も一般的には*.png
、 *.psd
、または*.pdf
ファイル)。
複数のファイルを変換する最も簡単な方法の1つは、linuxターミナルのファイルディレクトリに移動して次のように入力することです。
$ convert *.png mypdf.pdf
小さなスクリプトでうまくいきます。 (Solaris 10のksh88でテスト済み)
script.ksh
#!/bin/ksh
[[ $# != 1 ]] && exit 255 # test for nr of args
pdfname=$(sed -e 's/\(.*\)\.jpg/\1\.pdf/' <(echo $"1")) #replace *.jpg with *.pdf
convert "$1" $pdfname
次に、find
を実行してスクリプトを実行します。
find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;
両方のscript.ksh
と私があなたに与えたfind
コマンドは、OSと使用しているシェルで異なる構文を使用している可能性があります。
私は変換のためにimagemagickで解決し、変換プロセスを加速するために並列処理しました:
ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {} ../{.}.PDF