如何将 .jpg 居中安装到 .pdf 中(使用定义的页面大小和边框)?

如何将 .jpg 居中安装到 .pdf 中(使用定义的页面大小和边框)?

我希望将 .jpg 转换为 .pdf,以便 .jpg 位于某个位置:以(例如)A4 页面为中心,图像和页面边框之间的最小边框为 30 像素。

我的出发点就是这样(它只是创建一个与 JPG 大小相同的 PDF):

convert image.jpg image.pdf

答案1

我假设您想在所有四个边上添加一个边框,例如 30px。使用-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并使用一个或多个文件名参数调用它,如下所示:

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

输出文件名将与输入文件名相对应,其中 .jpg 替换为 .pdf。所以确保脚本不会意外覆盖现有文件!

怎么运行的

  • 对于要装载图像的页面,脚本使用 A4 格式。它会自行计算 A4 尺寸,因为最近的 ImageMagick 版本似乎不再支持 A4 关键字。
  • 图像是不是由脚本重新采样(“缩放”),仅在 A4 PDF 页面画布上以特定分辨率居中显示。因此,缩小不会丢失图像信息,放大也不会增加无用的文件大小。
  • 该脚本没有在周围设置 30 像素的最小边距,而是在图像和 PDF 页面边框之间留有空间。与向图像添加白色边框相比,这样做的优点是它不会增加文件大小,并且如果需要,您可以稍后使用类似命令从 PDF 中提取未修改的图像pdfimages -j file.pdf img
  • 默认情况下,图像周围的边框将设置为每个页面尺寸的 ≥5%。图像按比例缩放以实现此目的,因此 x 维度边框将为 5%,y 维度边框将更大,或者反之亦然,具体取决于图像比例。您可以通过调整脚本中的分辨率系数来调整边框的大小。目前1.1,A4 页面的分辨率为 110%。因此图像仅覆盖 A4 页面尺寸的 90%,留下两个 5% 的边框。如果将因子设置为1.2,您将获得两个 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% 的边框。
  • 有些人似乎需要-repage手术(像这儿)以防止页面尺寸稍微“偏离”。不需要它,但如果需要,请尝试-repage ${page_size_x}x${page_size_y}-repage A4作为通话中的最后一个操作convert

脚本源代码

#!/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;

这是更详细的文章解释了脚本的工作原理,及其用法。

相关内容