Pdf
如何將 .jpg 居中安裝到 .pdf 中(使用定義的頁面大小和邊框)?
我希望將 .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% 邊界的證明:
- 以像素為單位的頁面大小計算為
page_size_x = density * 8.27
- 密度計算為
density = img_size_x / 8.27 * 1.1
。(這假設 x 維度需要更高的密度才能將 5% 的邊框留空。)- 第 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;
參考
- **僅
-extent
用於在畫布上安裝圖像**的技術。- 計算最大值 bash 中的兩個浮點數,通過 bc。
- **用來
-format pdf
**解決一些問題。(這裡似乎是可選的,但其他人需要它。)