Tôi đã làm một cái gì đó như
convert -page A4 -compress A4 *.png CH00.pdf
Nhưng trang 1 lớn hơn nhiều so với các trang tiếp theo. Điều này xảy ra mặc dù kích thước hình ảnh là tương tự nhau. Những hình ảnh này được quét và cắt, do đó có thể có sự khác biệt nhỏ về kích thước
Tôi đã nghĩ -page A4
nên sửa kích thước của các trang?
Lần trước tôi đã sử dụng convert
cho một tác vụ như vậy tôi đã chỉ định rõ ràng kích thước của điểm đến thông qua thay đổi kích thước:
$ i=150; convert a.png b.png -compress jpeg -quality 70 \
-density ${i}x${i} -units PixelsPerInch \
-resize $((i*827/100))x$((i*1169/100)) \
-repage $((i*827/100))x$((i*1169/100)) multipage.pdf
Lệnh convert
không phải lúc nào cũng sử dụng DPI làm đơn vị định dạng mật độ/trang mặc định, do đó chúng tôi chỉ định rõ ràng DPI với -units
(nếu không, bạn có thể nhận được các kết quả khác nhau với các phiên bản/kết hợp định dạng đầu vào khác nhau). Kích thước mới (được chỉ định qua -resize
) Là kích thước của a DIN trang A4 tính bằng pixel. Đối số thay đổi kích thước chỉ định kích thước trang tối đa. độ phân giải và chất lượng để chọn chính xác tùy thuộc vào trường hợp sử dụng - Tôi đã chọn 150 DPI và chất lượng trung bình để tiết kiệm dung lượng trong khi nó không quá tệ khi được in trên giấy.
Lưu ý rằng convert
theo mặc định không thay đổi tỷ lệ khung hình với thao tác thay đổi kích thước:
Thay đổi kích thước sẽ phù hợp với hình ảnh vào kích thước yêu cầu. Nó KHÔNG điền, kích thước hộp yêu cầu.
( Hướng dẫn sử dụng ImageMagick )
Tùy thuộc vào phiên bản ImageMagick và các định dạng đầu vào có liên quan, có thể bỏ qua tùy chọn -repage
. Nhưng đôi khi, bắt buộc và không có tùy chọn đó, tiêu đề PDF có thể chứa kích thước quá nhỏ. Trong mọi trường hợp, -repage
Không nên làm tổn thương.
Các tính toán sử dụng số học số nguyên vì bash
chỉ hỗ trợ điều đó. Với zsh
các biểu thức có thể được đơn giản hóa - tức là được thay thế bằng $((i*8.27))x$((i*11.69))
.
Nếu các tệp PNG là hình ảnh hai cấp (đen và trắng a.k.a lineart) thì công cụ img2pdf
mang lại kết quả vượt trội so với ImageMagick convert
. Điều đó có nghĩa là img2pdf
Nhanh hơn và mang lại các tệp PDF nhỏ hơn.
Thí dụ:
$ img2pdf -o multipage.pdf a.png b.png
hoặc là:
$ img2pdf --pagesize A4 -o multipage.pdf a.png b.png
Những gì bạn thực sự muốn sử dụng là:
$ convert a.png b.png -compress jpeg -resize 1240x1753 \
-extent 1240x1753 -gravity center \
-units PixelsPerInch -density 150x150 multipage.pdf
-extent
thực sự mở rộng hình ảnh thành 1240x1753, trong khi -resize
giữ tỷ lệ của hình ảnh, khớp với nó thành 1240x...
hoặc là ...x1753
.
Các -gravity
tham số là tùy chọn nhưng có thể được sử dụng để căn giữa hình ảnh khi mở rộng.
Ngoài ra câu trả lời của caugner :
khi cài đặt IM v6.6.9-7 tôi đã tìm ra -gravity
tham số cần được đặt ở giữa -resize
và -extent
để có hiệu lực.
ngoài ra (không phải là một phần của câu hỏi o.p.) tôi thấy việc thiết lập một màu nền khác hấp dẫn sẽ dẫn đến tổng lệnh của
convert in.jpg -resize 1240x1750 -background black -compose Copy\
-gravity center -extent 1240x1750\
-units PixelsPerInch -density 150 out.pdf
một biến thể hữu ích khác mà tôi thường sử dụng khi tôi không muốn thay đổi tỷ lệ hình ảnh đã có tỷ lệ khung hình chính xác nhưng vẫn giữ độ phân giải riêng lẻ của nó là
convert in.jpg -units PixelsPerInch -set density '%[fx:w/8.27]'\
-repage a4 out.pdf
trong đó mật độ mục tiêu được xác định động bằng cách tính chiều rộng chia cho 8,27 (là chiều rộng tính bằng inch của trang A4). các -repage a4
tham số có thể được bỏ qua hầu hết thời gian nhưng tôi đã có một vài trường hợp trong đó .pdf kết quả sẽ có định dạng khác nhau ngay lập tức với kích thước A4 là 210x297mm (8.27x11.6 ")
Tôi thấy đoạn mã sau đây thuận tiện kết hợp các câu trả lời được liệt kê ở đây cũng như một số vấn đề tôi gặp phải với phép tính dấu phẩy động:
endInputArgs=$(($#-1))
quoted_args="$(printf " %q" "${@:1:$endInputArgs}")"
output_arg="$(printf " %q" "${@:$#:1}")"
ratiox=$(echo "150*8.27" | bc -l)
ratioy=$(echo "150*11.69" | bc -l)
bash -c "convert $quoted_args -compress jpeg -resize 1240x1753 \
-units PixelsPerInch -density 150x150 -repage ${ratiox}x${ratioy} $output_arg"
Kịch bản được gọi (được lưu dưới dạng tệp hình ảnh2pdf)
images2pdf file\ 1.jpg file\ 2.jpg file\ 3.jpg output.pdf
/ chỉnh sửa: Đã thêm cờ "-l" theo nhận xét của tanius để có độ chính xác cao hơn.
Tôi thực sự khuyên dùng chương trình Python CLI img2pdf
để chuyển đổi lossless:
https://gitlab.mister-muffin.de/josch/img2pdf
Ví dụ sử dụng:
img2pdf img1.png img2.png -o out.pdf
Tôi thấy mã của Mikher rất hữu ích, tuy nhiên, nó đưa ra PDF hoàn toàn là Chân dung hoặc Phong cảnh, vì vậy tôi đã sửa đổi nó để kiểm tra bố cục của từng tệp đầu vào và khớp với đầu ra.
Tôi đã không bao gồm chỉnh sửa của Yotam vì nó hoạt động mà không có nó trên hộp Ubuntu 15.04 của tôi.
$#!/bin/bash
# Resizes files to A4 (or other size - change PaperWdthMetr and PaperHghtMetr below) and merges into a PDF
export LOCALE=C
[[ "${2}x" == "x" ]] && \
{ echo "Usage: $( basename $0 ) output.pdf extension"
echo " merges all files (*.extension) into a single PDF"
echo "If files z_merged.pdf, z_temp.pdf or $1 exist, they will be overwritten"
exit 1
} || \
OutName="$1"
ext="$2"
# Set basic variables
unset Debug #; Debug="yes" # print extra messages
IMBackground="white" # what colour for paper
IMQuality="91" # JPEG compression level
PaperHghtMetr="297" # milimeters, 297 for ISO A4
PaperWdthMetr="210" # milimeters, 210 for ISO A4
PaperDens="200" # maximum (wanted) dpi for a page
PaperHInch=$( echo scale=5\; $PaperHghtMetr / 2.54 / 10 | bc -l ) # Inch
PaperWInch=$( echo scale=5\; $PaperWdthMetr / 2.54 / 10 | bc -l ) # Inch
PaperRtio=$( echo scale=5\; $PaperWdthMetr / $PaperHghtMetr | bc -l )
# Remove temporary files from prior run
rm -rf z_merged.pdf z_temp.pdf 2>/dev/null
# Process any $ext file in the current directory
find . -maxdepth 1 -name "*.${ext}" -print0 | sort -z | while read -d '' -r FName
do
echo "Converting $FName"
ImgIdentify=$( identify -format "%w %h" "$FName" )
ImgWdthOrig=$( echo $ImgIdentify | cut -d" " -f1 )
ImgHghtOrig=$( echo $ImgIdentify | cut -d" " -f2 )
ImgRtio=$( echo "scale=5; $ImgWdthOrig / $ImgHghtOrig" | bc -l )
# Match output page layout - Landscape or Portrait - to input file
if (( $(echo "$ImgRtio > 1 && $PaperRtio > 1 || $ImgRtio < 1 && $PaperRtio < 1" |bc -l) )); then
echo "Portrait"
PaperHghtInch=$PaperHInch
PaperWdthInch=$PaperWInch
else
echo "Landscape"
PaperHghtInch=$PaperWInch
PaperWdthInch=$PaperHInch
fi
[[ $( echo $ImgRtio'>'$PaperRtio | bc -l ) == 1 ]] \
&& ImgDens=$( echo scale=0\; $ImgWdthOrig / $PaperWdthInch | bc -l ) \
|| ImgDens=$( echo scale=0\; $ImgHghtOrig / $PaperHghtInch | bc -l )
[[ $Debug ]] && echo "ImgDens1: $ImgDens"
[[ $( echo $ImgDens'>'$PaperDens | bc -l ) == 1 ]] \
&& ImgDens=$PaperDens
[[ $Debug ]] && echo "ImgDens2: $ImgDens"
ImgWdth=$( echo $PaperWdthInch \* $ImgDens | bc -l ) # pixels
ImgHght=$( echo $PaperHghtInch \* $ImgDens | bc -l ) # pixels
[[ $Debug ]] && echo "ImgWdth: $ImgWdth".
[[ $Debug ]] && echo "ImgHght: $ImgHght".
convert "${FName}" \
-resize ${ImgWdth}x${ImgHght} \
-background $IMBackground -gravity center \
-extent ${ImgWdth}x${ImgHght} \
-units PixelsPerInch -set density $ImgDens \
-repage ${ImgWdth}x${ImgHght}+0+0 \
-compress JPEG \
-quality $IMQuality \
"${FName%.$ext}.pdf"
# Merge new PDF page with prior pages
[[ -f z_merged.pdf ]] && \
{ pdftk z_merged.pdf "${FName%.$ext}.pdf" cat output z_temp.pdf
mv z_temp.pdf z_merged.pdf
} || \
cp "${FName%.$ext}.pdf" z_merged.pdf
[[ $Debug ]] || rm -rf "${FName%.$ext}.pdf"
done
[[ -f z_merged.pdf ]] && mv z_merged.pdf "$OutName"
echo "Done."
Tôi cũng đang vật lộn với những thứ đó. Dựa trên thông tin trên, tôi đã viết một tập lệnh thêm các tệp hình ảnh được sắp xếp theo thứ tự abc vào một tệp PDF.
Một số biến được giải quyết bên trong tập lệnh. Nó phụ thuộc vào ImageMagick và pdftk.
NB: Nếu hình ảnh đầu vào có độ phân giải cao hơn (dpi) so với độ phân giải mong muốn của output.pdf, hình ảnh được ghép lại thành độ phân giải thấp hơn. Mặt khác, hình ảnh không được ghép lại và nó chỉ được mở rộng để phù hợp với khung trang.
#!/bin/bash
export LOCALE=C
[[ "${2}x" == "x" ]] && \
{ echo "Usage: $( basename $0 ) output.pdf extension"
echo " merges all files (*.extension) into a single PDF"
echo "If files z_merged.pdf, z_temp.pdf or $1 exist, they will be overwritten"
exit 1
} || \
OutName="$1"
ext="$2"
# Set basic variables
unset Debug #; Debug="yes" # print extra messages
IMBackground="white" # what colour for paper
IMQuality="91" # JPEG compression level
PaperWdthMetr="210" # milimeters, 210 for ISO A4
PaperHghtMetr="297" # milimeters, 297 for ISO A4
PaperDens="200" # maximum (wanted) dpi for a page
PaperWdthInch=$( echo scale=5\; $PaperWdthMetr / 2.54 / 10 | bc -l ) # Inch
PaperHghtInch=$( echo scale=5\; $PaperHghtMetr / 2.54 / 10 | bc -l ) # Inch
PaperRtio=$( echo scale=5\; $PaperWdthMetr / $PaperHghtMetr | bc -l )
# Remove temporary files from prior run
rm -rf z_merged.pdf z_temp.pdf 2>/dev/null
# Process any $ext file in the current directory
find . -maxdepth 1 -name "*.${ext}" -print0 | sort -z | while read -d '' -r FName
do
echo "Converting $FName"
ImgIdentify=$( identify -format "%w %h" "$FName" )
ImgWdthOrig=$( echo $ImgIdentify | cut -d" " -f1 )
ImgHghtOrig=$( echo $ImgIdentify | cut -d" " -f2 )
ImgRtio=$( echo "scale=5; $ImgWdthOrig / $ImgHghtOrig" | bc -l )
[[ $( echo $ImgRtio'>'$PaperRtio | bc -l ) == 1 ]] \
&& ImgDens=$( echo scale=0\; $ImgWdthOrig / $PaperWdthInch | bc -l ) \
|| ImgDens=$( echo scale=0\; $ImgHghtOrig / $PaperHghtInch | bc -l )
[[ $Debug ]] && echo "ImgDens1: $ImgDens"
[[ $( echo $ImgDens'>'$PaperDens | bc -l ) == 1 ]] \
&& ImgDens=$PaperDens
[[ $Debug ]] && echo "ImgDens2: $ImgDens"
ImgWdth=$( echo $PaperWdthInch \* $ImgDens | bc -l ) # pixels
ImgHght=$( echo $PaperHghtInch \* $ImgDens | bc -l ) # pixels
[[ $Debug ]] && echo "ImgWdth: $ImgWdth".
[[ $Debug ]] && echo "ImgHght: $ImgHght".
convert "${FName}" \
-resize ${ImgWdth}x${ImgHght} \
-background $IMBackground -gravity center \
-extent ${ImgWdth}x${ImgHght} \
-units PixelsPerInch -set density $ImgDens \
-repage ${ImgWdth}x${ImgHght}+0+0 \
-compress JPEG \
-quality $IMQuality \
"${FName%.$ext}.pdf"
# Merge new PDF page with prior pages
[[ -f z_merged.pdf ]] && \
{ pdftk z_merged.pdf "${FName%.$ext}.pdf" cat output z_temp.pdf
mv z_temp.pdf z_merged.pdf
} || \
cp "${FName%.$ext}.pdf" z_merged.pdf
[[ $Debug ]] || rm -rf "${FName%.$ext}.pdf"
done
[[ -f z_merged.pdf ]] && mv z_merged.pdf "$OutName"
echo "Done."
Tôi chỉ sử dụng một cái gì đó tương tự như câu trả lời maxschlepzigs trong Ubuntu 16.04/ImageMagick
Điều này cũng tập trung vào kết quả
i=300; convert a.png b.png -compress jpeg -quality 100 \
-density ${i}x${i} -units PixelsPerInch \
-resize $((i*827/100))x$((i*1169/100)) \
-gravity center \
-extent $((i*827/100))x$((i*1169/100)) multipage.pdf
Tôi muốn chuyển đổi một hình ảnh thành kích thước trang 5,00 x 8,00 in (xem từ trình đọc Adobe) Đây là những gì tôi đã làm trên hệ điều hành Ubuntu 18.04. Đầu tiên, hãy tìm ra kích thước trang tôi đang theo sau:
$ pdfinfo my-input.pdf
Và lợi nhuận là: Kích thước trang: 360 x 576 điểm
Sau đó, hình ảnh được chuyển đổi thành a PDF có cùng kích thước như vậy:
$ img2pdf --pagesize 360x576 -o outpage.pdf input_pic.jpg
Lưu ý: để cài đặt img2pdf
$ Sudo apt cài đặt img2pdf