複数の画像ファイルをJPEGからPDF形式に変換する


50

いくつかのファイルをjpegからpdfに変換したい。私は次のコマンドを使用しています。

$ convert image1.jpg image1.pdf 

しかし、私は100枚の画像を持っています。それらすべてを対応するPDFに変換するにはどうすればよいですか?

私は試した

$ convert image*.jpg image*.pdf 

機能しません。


回答:


62

bashの場合:

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done

1
convertの引数に「./」を追加する特別な理由は何ですか?一般的な良い習慣ですか?
ラーム

4
@rahmu:はい、それは良い習慣-です。
-enzotib

3
これは機能しmogrifyますが、入力はずっと少なくなります。私の答えをご覧ください。
cjm

これは技術的に正しいためbashの落とし穴を避けるため+1ですが、mogrifyはImagemagickで画像をバッチ変換する方法であるため-1です。だから私からの投票はありません。
ブノワ

@aculich:投票に感謝しますが、間違った考慮をしました。なぜforループが「引数が長すぎます」エラーを発生させないのでしょうか?
-enzotib

56

mogrifyこれにはコマンドを使用できます。通常、ファイルをインプレースで変更しますが、形式を変換するときに新しいファイルを書き込みます(新しい形式に合わせて拡張子を変更するだけです)。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:

mogrify -format pdf -- *.jpg

(enzotibのように、奇妙なファイル名がスイッチとして解釈される./*.jpgのを--防ぎます。ほとんどのコマンドは--、「この時点でオプションの検索を停止する」ことを意味します。)


+1、私の答えはbashについてのみで、ImageMagickについてよく知りません。
-enzotib

mogrify代わりに使用することをお勧めしますconvert。これは100個のファイルで機能しますが、globbingを使用し*.jpgても数千個のファイルに拡張できません。これは、単純な1行のfindコマンドをと組み合わせることで実行できます。
-aculich

とファイルの両方 *.jpg*.png単一に変換する方法は*.pdf?それらは番号付きファイル(例:)で1.jpg 2.png 3.png 4.jpgあり、その順序はpdf出力で維持/保存する必要があることに注意してください。
ナッツについてのナッツ

回避策として:ステップ1ですべて*.jpgのをに変換し*.png、ステップ2で答えに相当することを実行します...
natty about nutty


24

より高速だが異常な構文:

parallel convert '{} {.}.pdf' ::: *.jpg

並行して実行します(https://www.gnu.org/software/parallel/を使用)。私はconvertまだマルチスレッドに気づいていないので、効果的な並列化が制限されます。それが心配な場合は、マルチスレッドが発生しないようにする方法について、以下のコメントを参照してください。


1
この方法は勝利に満ちています。コア数を自動的に評価し、その数のタスクを実行します!
meawoppl

1
この方法は、最も高速です。
シヴァム

1
パラレルはパワー、パラレルとimagemagickの組み合わせは超強力です。私は超大国が好きです。
いとこコカイン

2
ここでのパーティーには少し遅れましたが、ImageMagickの新しい(おそらくこの回答が書かれた時点ではない)バージョンはマルチスレッドであり、並行して実行すると相互作用が悪くなります。parallel環境変数を設定することにより、これを無効にすることができます(GNUなどのアプリケーションレベルの並列化を使用する場合)MAGICK_THREAD_LIMIT=1
zebediah49

このためにImageMagickを使用すると、生成の損失とパフォーマンスの低下が生じます。このページの他の場所のimg2pdfは、これらの問題を回避します。
ロバートフレミング

16

https://gitlab.mister-muffin.de/josch/img2pdf

ImageMagickを含む提案されたソリューションのすべてで、JPEGデータは完全にデコードされ、再エンコードされます。これにより、世代の損失発生するだけでなく、パフォーマンスが「10〜100倍」低下しimg2pdfます。

pip img2pdf依存関係がある場合(apt-get install python python-pil python-setuptools libjpeg-devまたはyum install python python-pillow python-setuptools)にインストールできます。


3
は正しい。ラウンドトリップがJPEGファイルを変更することをテストするには、などのコマンドを使用しますconvert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg。私見この答えは、より多くの賛成に値します。実際、convertここで失敗し、img2pdfそのようなテストに合格し、必要に応じて生成されたpdfを微調整するために、画像サイズ、ページサイズなどを設定する多くのオプションも含まれます。
ステファンゴーリチョン16

3
img2pdfUbuntu 16.04の通常のリポジトリで利用可能であり、手動で操作する必要はpipありません。また、アップデートのメリットを享受できます。
ステファンゴーリチョン16

1
質問が行われた時点で(および回答は受け入れられました)、img2pdfは存在しませんでした。しかし、今日ではimg2pdfの方が明らかに良い答えです。
kmkaplan

13

以下は、上記の提案の最良のものを、シンプルで効率的で堅牢なコマンドラインに結合する方法です。

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +

で始まるファイル名-またはスペースを含むファイル名で正常に機能します。使用に注意-inameしている大文字と小文字を区別しないバージョンの-nameそれは上で動作するので、.JPGちょうどなどを.jpg

これは、一部のシステムで「引数リストが長すぎます」エラーが発生する可能性がfindある*.jpgワイルドカードを使用したシェルグロビングの代わりに、ファイルリストを取得するために使用します。@enzotibはコメントを指しているが、forループでグロビングを使用する動作は、コマンドのargumentsの場合とは異なります

また、findサブディレクトリを処理しますが、シェルグロビングは**/*jpg、zshの再帰的グロビング構文などのシェル固有の機能を使用しない限り実行しません。

編集:コマンドを再実行し、最初の実行以降に変更されたファイルのみを変換することについて@IlmariKaronenfindがコメントを読んだ後に考えた別の便利な機能を追加すると思いました。

最初のパスでtouchは、変換が終了した後にタイムスタンプファイルを作成できます。

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp

次に-newer timestampfind式に追加して、最終変更時刻がタイムスタンプファイルより新しいファイルのサブセットを操作します。各実行後にタイムスタンプファイルの更新を続けます。

find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp

これは、Makefileを使用する必要がないようにする簡単な方法です(既に使用している場合を除く)find。これは、可能な限り使用する価値があるもう1つの正当な理由です。


このためにImageMagickを使用すると、生成の損失とパフォーマンスの低下が生じます。このページの他の場所のimg2pdfは、これらの問題を回避します。
ロバートフレミング

8

これはconvert直接行うことができます。これは、ImageMagicksサイトのコマンドライン処理についての下部にあります。

convert *.jpg +adjoin page-%d.pdf

4
またはconvert *.jpg -adjoin output.pdf結合されたPDF
ninjagecko 14

2
このためにImageMagickを使用すると、生成の損失とパフォーマンスの低下が生じます。このページの他の場所のimg2pdfは、これらの問題を回避します。
ロバートフレミング

7

同様のことをするために、次のメイクファイルを使用しました。

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 /内のすべてのsvgのリストを生成します
  • pathsubstはこのリストを取り、PNGファイル名のリストを作成します(異なるフォルダーと拡張子。例:にorigs/foo.svgなりますfoo.png
  • 規則1:all: $(PNG)ターゲット「all」はすべてのPNGに依存することを定義します
  • ルール2:%.png: origs/%.svg定義、ファイル$ X.pngはorigs / $ X.svgに依存し、を呼び出すことで生成できますconvert ... $< $@
    • $< 依存関係であり、
    • $@ ターゲット名です
  • ルール3:クリーンアップ専用

2
1回限りのタスクの場合、Makefileの作成はおそらくやり過ぎですが、PDFの一部を変更する予定がある場合、make再度入力すると、変更されたPDF のみが再変換されます。
イルマリカロネン

ワイルドカード、orig、patsubstが何であるか、$と%がどのように解釈され、$ <$ @がどのように解釈されるかを説明していただけますか?残りは理解しやすいです。:)
ユーザー不明

単純なワンライナーでトリックを行うmake場合、に頼ることは少し複雑に思えます。
aculich

@IlmariKaronen Makefileが過剰であることに同意しますが、後続の実行で変更されたファイルのサブセットのみを再変換する方法があると便利です。Makefileに頼る必要がないように、回答を更新しましたfind
-aculich

0

小さなスクリプトがトリックを行います。 (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とシェルによって異なる構文を持っているかもしれないことに注意してください。


pdfname=${1%.*}.pdfファイルの拡張子をに置き換えますpdf。この方法ははるかに簡単で、ファイル名に特殊文字が含まれていても機能します。関連するメモで、変数の置換を二重引用符で囲みます。
ジル 'SO-悪であるのをやめる

単純な単一のコマンドラインですべてを実行できる場合、別のスクリプトを記述する理由はありません。
aculich

0

MacOSユーティリティSIPS   MacOS(Sierra)では、Appleの組み込みコマンドラインユーティリティsipsにより、Appleのすべてのラスターイメージユーティリティへの包括的なアクセスが提供されます。これは、への変換を含むことが判明しましjpgpdf

たとえば、既存の低解像度/小サイズの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)ファイルを。


0

残念ながらconvertjpg使用する必要があるオリジナルの品質の損失を最小限に抑えるために、前に画像を変更しますimg2pdf。私はこのコマンドを使用します:

1)これにより、解像度または品質を損なうことなくpdf、すべてのjpg画像からファイルを作成できます。

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

2)これにより、pdfページが1つに連結されます。

pdftk *.pdf cat output combined.pdf

3)最後に、PDFのスキャンの品質を変更しないOCRedテキストレイヤーを追加して、検索可能にする:

pypdfocr combined.pdf  

0

私は変換のためにimagemagickで解決し、変換プロセスを加速するために並列しました:

ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {}  ../{.}.PDF

0

複数のファイルを変換する最も簡単な方法の1つは、Linuxターミナルのファイルディレクトリに移動し、次のように入力することです。

$ convert *.png mypdf.pdf

-1

画像ファイルのみを使用する場合は、コミックブックアーカイブ(.cbr、.cbz、.cbt、.cba、.cb7)を使用することをお勧めします

  • 7Zを使用する場合、ファイル拡張子(サフィックス)の名前を.cb7に変更します
  • ACEを使用する場合、ファイル拡張子(サフィックス)の名前を.cbaに変更します
  • RARを使用する場合、ファイル拡張子(サフィックス)の名前を.cbrに変更します
  • TARを使用する場合、ファイル拡張子(サフィックス)の名前を.cbtに変更します
  • ZIPを使用する場合は、ファイル拡張子(サフィックス)の名前を.cbzに変更します

これはPDFよりもはるかに柔軟です。

Under Linux you can use software like Comix, Evince, Okular and QComicBook.

https://secure.wikimedia.org/wikipedia/en/wiki/Comic_book_archive


1
OPの質問とは何の関係もないからです。
toogley
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.