リストのPDFファイルを半分のページで編集して、その半分のページからページ全体をインポートします。

リストのPDFファイルを半分のページで編集して、その半分のページからページ全体をインポートします。

以下のPDFファイルがあります。

----------
||----|  |
||----|  |
|        |
|        |
|        |
|________|

次のコマンドの助けを借りて

$ convert -density 300 -quality 100 -crop 0x50% in.pdf out.png
$ ls
in.pdf, out-0.png, out-1.png
$ montage -mode concatenate -tile 1x out-0.png out-0.png out.pdf
$ ls
in.pdf, out-0.png, out-1.png out.pdf

こんなファイルが出ますね

----------
||----|  |
||----|  |
|        |
||----|  |
||----|  |
|________|

その後、印刷してPDF文書を削除する必要があります。

与えられたファイルのリストを使用して同じ効果を得るにはどうすればよいですか?

$ cat list-of-pdfs.txt
file 1.pdf
file 2.pdf
file 3.pdf
...

答え1

単一のファイルに対して動作して結果をin.pdf生成する一対のコマンドがあります。out.pdf

convert -density 300 -quality 100 -crop 0x50% in.pdf out.png
montage -mode concatenate -tile 1x out-0.png out-0.png out.pdf

複数のファイルに変更を適用するため、固定名が使用できないため、ソースファイルが提供されたと想定してターゲットファイル名を生成します。

file=in.pdf                  # in.pdf
dest=${file%.pdf}-out.pdf    # in-out.pdf

convert -density 300 -quality 100 -crop 0x50% "$file" "$dest"
montage -mode concatenate -tile 1x out-0.png out-0.png "$dest"

処理したい各ファイルのイメージが出力と一致するように同じである必要があるのか​​、それとも名前を付ける必要があるのか​​わからないので、out-0.pngこれを定数にしておきます。

これで、各ファイルに効果を順番に適用する必要があります。一般的な構造はforループですが、リストにファイルがあるのでループを使用しますwhile

while IFS= read -r file
do
    # Apply your changes to the "$file"
    #
    dest="${file%.pdf}-out.pdf"
    echo "Processing $file into ${dest##*/}" >&2

    convert -density 300 -quality 100 -crop 0x50% "$file" "$dest"
    montage -mode concatenate -tile 1x out-0.png out-0.png "$dest"

done <list-of-pdfs.txt

関連情報