web-dev-qa-db-ja.com

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

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

$ convert image1.jpg image1.pdf 

でも100枚の画像があります。それらのすべてを対応するPDFに変換するにはどうすればよいですか?

私は試した

$ convert image*.jpg image*.pdf 

動作しません。

55
Pratik Deoghare

バッシュで:

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

これには mogrify コマンドを使用できます。通常、ファイルをインプレースで変更しますが、フォーマットを変換するときに、新しいファイルに書き込みます(新しいフォーマットに一致するように拡張子を変更するだけです)。したがって:

mogrify -format pdf -- *.jpg

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

60
cjm

より高速ですが珍しい構文:

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

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

24
Sebastian

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)。

16
Robert Fleming

上記の提案の最良のものをシンプルで効率的で堅牢なコマンドラインに組み合わせる方法を次に示します。

_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つの理由です...

13
aculich

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

convert *.jpg +adjoin page-%d.pdf
9
Frank Zalkow

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

残念ながらconvertは前にイメージを変更して、元のjpgの品質の損失を最小限に抑えるために使用する必要があります_img2pdf_、私はこのコマンドを使用します:

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

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

2)pdfpagesを1つに連結するには、次のようにします。

_pdftk *.pdf cat output combined.pdf
_

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

_pypdfocr combined.pdf  
_
1

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
John Sidles

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

$ convert *.png mypdf.pdf
1
Ajeet Yadav

小さなスクリプトでうまくいきます。 (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と使用しているシェルで異なる構文を使用している可能性があります。

1
rahmu

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

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