it-mot-dan-vi.com

chuyển đổi hình ảnh thành pdf: Cách tạo PDF Các trang có cùng kích thước

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?

47
Jiew Meng

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)).

Hình ảnh tuyến tính

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
63
maxschlepzig

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.

25
caugner

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-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 ")

9
antiplex

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.

2
rindPHI

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
2
Adam Erickson

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."
2
user173283

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."
1
Mikher

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
0
Martin Thoma

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

0
Harry