web-dev-qa-db-ja.com

Linuxで複数のjpgを単一のPDFにマージする

次のコマンドを使用して、ディレクトリ内のすべてのjpgファイルを単一のpdfファイルに変換およびマージしました。

convert *.jpg file.pdf

ディレクトリ内のファイルには、1.jpgから123.jpgの番号が付けられます。変換はうまくいきましたが、変換後にページがすべて混同されました。 pdfに1.jpgから123.jpgまでのページを、それらが指定されているのと同じ順序で配置したかったのです。私も次のコマンドを試しました:

cd 1 
FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2)
mkdir temp && cd temp 
for file in $FILES; do 
    BASE=$(echo $file | sed 's/.jpg//g');
    convert ../$BASE.jpg $BASE.pdf; 
    done && 
pdftk *pdf cat output ../1.pdf && 
cd .. 
rm -rf temp

しかし、まだ運はありません。オペレーティングプラットフォームLinux。

56
Harikrishnan

問題は、シェルがワイルドカードを純粋にアルファベット順で展開しているためであり、数字の長さが異なるため、順序が間違っているためです。

$ echo *.jpg
1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ...

解決策は、必要に応じてファイル名にゼロを追加して、変換コマンドを実行する前に同じ長さにすることです。

$ for i in *.jpg; do num=`expr match "$i" '\([0-9]\+\).*'`;
> padded=`printf "%03d" $num`; mv -v "$i" "${i/$num/$padded}"; done

これで、ファイルは正しい順序でワイルドカードと照合され、convertコマンドの準備が整います。

$ echo *.jpg
001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...
16
Delan Azabani

または、lsマニュアルを読んで、以下を参照してください。

-vテキスト内の自然な(バージョン)番号の並べ替え

したがって、必要なことを1つのコマンドで実行します。

convert `ls -v *.jpg` foobar.pdf

楽しんでください;)F.

92
Felix Defrance

使用できます

convert '%d.jpg[1-132]' file.pdf

https://www.imagemagick.org/script/command-line-processing.php 経由:

他の画像ファイルを参照する別の方法は、シーン範囲を含むファイル名にフォーマット文字を埋め込むことです。ファイル名image-%d.jpg[1-5]。コマンド

magick image-%d.jpg[1-5]は、ImageMagickにこれらのファイル名の画像を読み取らせます。

image-1.jpg image-2.jpg image-3.jpg image-4.jpg image-5.jpg

https://www.imagemagick.org/script/convert.php も参照してください

4
Lukas

これは私がそれを行う方法です:
最初の行は、変換コマンドを使用しているすべてのjpgファイルをpdfに変換します。
2行目は、すべてのpdfファイルをページごとにpdfとして単一のファイルにマージしています。これはgsを使用しています((PostScriptおよびPDF言語インタープリターおよびプレビューア))

for i in $(find . -maxdepth 1 -name "*.jpg" -print); do convert $i ${i//jpg/pdf}; done
gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=merged_file.pdf -dBATCH `find . -maxdepth 1 -name "*.pdf" -print"`
4
Martian

(スキャンされた本から)多くの高解像度jpegイメージをマージしたい場合、上記の答えはすべて失敗しました。

ImagemagickはすべてのファイルをRAMにロードしようとしたため、次の2段階のアプローチを使用しました。

find -iname "*.JPG" | xargs -I'{}' convert {} {}.pdf
pdfunite *.pdf merged_file.pdf

このアプローチでは、GNU parallelを使用して変換を高速化することもできます。

find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf
2
Gregor Sturm

最初のアイデアと返信を混ぜて、このコードはおそらく満足できると思う

jpgs2pdf.sh

#!/bin/bash

cd $1
FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2)
mkdir temp > /dev/null
cd temp

for file in $FILES; do
 BASE=$(echo $file | sed 's/.jpg//g');
 convert ../$BASE.jpg $BASE.pdf;
done &&

pdftk `ls -v *pdf` cat output ../`basename $1`.pdf
cd ..
rm -rf temp
0
Juan Lagos