Pdf

如何將 .jpg 居中安裝到 .pdf 中(使用定義的頁面大小和邊框)?

  • August 12, 2018

我希望將 .jpg 轉換為 .pdf,以便將 .jpg 定位在某個位置:以(例如)A4 頁面為中心,圖像和頁面邊框之間的最小邊框為 30 像素。

我的出發點就是這樣(它只是創建一個與 JPG 大小相同的 PDF):

convert image.jpg image.pdf

我假設你想在所有四個邊上添加一個邊框,比如 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

這是一個小腳本,可以滿足您的需求,並且可以同時處理多個 .jpg 文件,將每個文件轉換成自己的一頁 .pdf 文件。

將腳本另存為imgs_to_pdfs.sh並使用一個或多個文件名參數呼叫它,如下所示:

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

輸出文件名將對應於 .jpg 替換為 .pdf 的輸入文件名。所以請確保腳本不會意外覆蓋現有文件!

這個怎麼運作

  • 對於要安裝圖像的頁面,腳本使用 A4 格式。它自己計算 A4 尺寸,因為最近的 ImageMagick 版本似乎不再支持 A4 關鍵字。
  • 腳本不會對圖像進行重新採樣(“縮放”),只是在 A4 PDF 頁面畫布上以特定解析度居中顯示。因此,縮小不會失去圖像資訊,放大不會增加無用的文件大小。
  • 該腳本在圖像和 PDF 頁面邊框之間留有一個空間,而不是周圍 30 像素的最小邊距。與向圖像添加白色邊框相比,這樣做的優點是它不會增加文件大小,並且如果需要,您可以稍後從 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;

參考

引用自:https://unix.stackexchange.com/questions/43946