.jpgを.pdf(定義されたページサイズと枠線を含む)にどのように合わせるか?

.jpgを.pdf(定義されたページサイズと枠線を含む)にどのように合わせるか?

.jpgを.pdfに変換して、.jpgをA4ページの中央に配置し、画像とページの境界線の間の最小境界線を30ピクセルにしたいと思います。

私の出発点は次のとおりです(JPGと同じサイズのPDFを生成します)。

convert image.jpg image.pdf

答え1

私は4つの側面すべてに30ピクセルのボーダーを追加したいと思います。-borderサイズと-bordercolor色のオプションを使用する:

convert -border 30 -bordercolor white input.png output.pdf

詳細はこちらからご覧いただけます。Imagemagick - 画像エッジの追加/削除

最終PDFに特定のサイズを割り当てるには、次のオプションを使用できます。

convert \
  -page A4 \
  -gravity northwest \
  -border 30 \
  -bordercolor white \
  input.png output.pdf

答え2

以下は、目的のタスクを実行し、同時に複数の.jpgファイルにタスクを実行して各ファイルを独自のページの.pdfファイルに変換できる小さなスクリプトです。

スクリプトを別の名前で保存imgs_to_pdfs.shし、次のように1つ以上のファイル名引数を使用して呼び出します。

./imgs_to_pdfs.sh myimg1.jpg myimg2.jpg img-*.jpg

出力ファイル名は入力ファイル名と一致し、.jpgは.pdfに置き換えられます。だからスクリプトが誤って既存のファイルを上書きしないようにしてください。

どのように動作しますか?

  • イメージをロードするページの場合、スクリプトはA4形式を使用します。 ImageMagickの最新バージョンは、A4キーワードをサポートしていないように見えるので、それ自体はA4サイズを計算します。
  • イメージはいいえ特定の解像度でA4 PDFページのキャンバスの中央にのみ表示されるようにスクリプトにリサンプリング(「サイズ調整」)しました。したがって、縮小しても画像情報が失われず、拡大してもファイルサイズが不必要に増えない。
  • 30ピクセルの最小余白を設定する代わりに、スクリプトは画像とPDFページの境界線の間にスペースを残します。画像に白い枠線を追加するよりも、これはファイルサイズを増やすことはなく、必要に応じて後で同様のコマンドを使用してPDFから未修正の画像を抽出できるという利点があります。pdfimages -j file.pdf img
  • デフォルトでは、画像の周囲の境界線は各ページサイズの≥5%に設定されています。これを達成するために画像のサイズが変更されるため、画像のサイズに応じてx次元の境界は5%になり、y次元の境界はより大きくなるか、その逆になります。スクリプトで解像度要素を調整することで、境界線のサイズを変更できます。現在の1.1A4ページの解像度は110%です。したがって、画像はA4ページサイズの90%しか占めず、5%の境界線が2つ残ります。要素をに設定すると、1.22つの10%境界が作成されます。

その他の詳細

  • 以下は、スクリプトの公式が5%の制限をどのように生成するかについての証拠です。
    1. ページサイズ(ピクセル単位)は次のように計算されます。page_size_x = density * 8.27
    2. 密度は次のように計算されますdensity = img_size_x / 8.27 * 1.1。 (これはx次元でボーダーの5%を空にするためにより高い密度が必要であると仮定します。)
    3. 1行目の2行目は以下を生成しますpage_size_x = (img_size_x/8.27*1.1) * 8.27 = img_size_x * 1.1。実際、ページは画像ピクセル幅の110%で、5%の境界線が2つあります。
  • 手術が必要な人もいるようです-repageここのように)ページサイズが多少「ズレ」を防ぎます。必須ではありませんが、必要に応じて試してみるか、通話の最後の操作として実行して-repage ${page_size_x}x${page_size_y}ください。-repage A4convert

スクリプトソースコード

#!/bin/bash
# Converts input images to one-page PDF files each, without changing image data.
# The image is centered on a A4 page with a 5% border.

# bc function to calculate maximum of two floats
bc_functions="
define max(a,b) {
  if (a>b) {
    return(a)
  } else {
   return(b)
  }
} ";

for file in "$@"; do \
  # Determine image dimensions in pixels.
  img_size_x=$(identify -format "%w" "$file");
  img_size_y=$(identify -format "%h" "$file");

  # Calculate image density (in dpi) needed to fit the image and a 5% 
  # border all around on an A4 page (8.27x11.69"). Factor 1.1 creates 
  # 2*5% borders, see https://unix.stackexchange.com/a/220114 for details.
  min_density_x=$(echo "$img_size_x/8.27*1.1"  | bc -l);
  min_density_y=$(echo "$img_size_y/11.69*1.1" | bc -l);
  # Use the higher density to prevent any dimension exceeding the required fit.
  density=$(echo "$bc_functions max($min_density_x,$min_density_y)" | bc -l);

  # Calculate canvas dimensions in pixels.
  # (Canvas is an A4 page (8.27x11.69") with the calculated density.)
  page_size_x=$(echo  "8.27*$density" | bc -l);
  page_size_y=$(echo "11.69*$density" | bc -l);

  # Center image on a larger canvas (with a size given by "-extent").
  convert "$file" \
    -gravity center -extent ${page_size_x}x${page_size_y} \
    -units PixelsPerInch -density $density \
    -format pdf -compress jpeg \
    "${file/.jpg/.pdf}";
done;

引用する

答え3

ページの中央に画像を配置するために境界線を使用する方法は、ページを指定し、サイズと範囲のジオメトリを調整することでした。サイズ変更するサイズと両方の次元で境界線サイズの2倍に縮小された範囲。

ページサイズの寸法は以下にリストされています。http://www.imagemagick.org/script/command-line-options.php#page

文字(612x792)の場合:

convert -page Letter -resize 552x732\> -extent 552x732 -background white -gravity Center -border 30 -bordercolor white image.jpg image.pdf

A4(595x842)の場合:

convert -page A4 -resize 535x782\> -extent 535x782 -background white -gravity Center -border 30 -bordercolor white image.jpg image.pdf

答え4

正解はhttps://unix.stackexchange.com/a/220114-extent境界線にスペースを追加してソースイメージを変更するには、オプションを使用します。

このスクリプトは、-pageオフセット付きのオプションを使用してキャンバスのサイズを変更し、画像の位置を調整しますが、画像は変更されません。バラよりGithubのスクリプトここにコピーしてください。

#!/bin/bash
# Converts input images to one-page PDF files each, without changing image data.
# The image is centered on a A4 page with a 5% border.
# Adapted from https://unix.stackexchange.com/a/220114
#
# Usage: [command] image1.jpg image2.png ...
# Output: PDF files named after the images e.g. image1.pdf


# bc function to calculate maximum of two floats
bc_functions="
define max(a,b) {
  if (a>b) {
    return(a)
  } else {
    return(b)
  }
};";

# Do the calculation in string $1 and echo the result.
function calc {
  # Define bc functions so we can use it for the calc.
  echo "$bc_functions $1" | bc -l;
}


for file in "$@"; do \
  # Determine image dimensions in pixels.
  img_size_x=$(identify -format "%w" "$file");
  img_size_y=$(identify -format "%h" "$file");

  # Calculate image density (in dpi) needed to fit the image and a 5% 
  # border all around on an A4 page (8.27x11.69"). Factor 1.1 creates 
  # 2*5% borders, see https://unix.stackexchange.com/a/220114 for details.
  min_density_x=$(calc "$img_size_x / 8.27 * 1.1");
  min_density_y=$(calc "$img_size_y / 11.69 * 1.1");

  # Use the higher density to prevent any dimension exceeding the required fit.
  density=$(calc "max($min_density_x,$min_density_y)");

  # Calculate canvas dimensions in pixels.
  # (Canvas is an A4 page (8.27x11.69") with the calculated density.)
  page_size_x=$(calc "8.27 * $density");
  page_size_y=$(calc "11.69 * $density");

  offset_x=$(calc "($page_size_x - $img_size_x) / 2 * 72 / $density");
  offset_y=$(calc "($page_size_y - $img_size_y) / 2 * 72 / $density");

  # Center image on a larger canvas.
  convert "$file" \
    -page ${page_size_x}x${page_size_y}+${offset_x}+${offset_y} \
    -units PixelsPerInch -density $density \
    -format pdf -compress jpeg \
    "${file/.jpg/.pdf}";
done;

これはスクリプトの仕組みを説明する詳細な記事、そしてその使用法。

関連情報