convert images to pdf: Cara membuat Halaman PDF sama ukurannya

45

Saya melakukan sesuatu seperti

convert -page A4 -compress A4 *.png CH00.pdf

Tetapi halaman 1 jauh lebih besar dari halaman berikutnya. Ini terjadi meskipun dimensi gambarnya serupa. Gambar-gambar ini dipindai & dipotong sehingga mungkin memiliki sedikit perbedaan dalam dimensi

Saya pikir -page A4harus memperbaiki ukuran halaman?

Jiew Meng
sumber

Jawaban:

60

Terakhir kali saya menggunakan converttugas seperti itu, saya secara eksplisit menentukan ukuran tujuan melalui pengubahan ukuran:

$ 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

The convertperintah tidak selalu menggunakan DPI sebagai satu unit Format density default / halaman, sehingga kita secara eksplisit menentukan DPI dengan -unitspilihan (jika tidak, anda mungkin mendapatkan hasil yang berbeda dengan versi yang berbeda / kombinasi format masukan). Ukuran baru (ditentukan melalui -resize) adalah dimensi halaman DIN A4 dalam piksel. Argumen pengubahan ukuran menentukan ukuran halaman maksimal. Resolusi dan kualitas apa yang harus diambil tergantung pada use case - Saya memilih 150 DPI dan kualitas rata-rata untuk menghemat ruang sementara tidak terlihat terlalu buruk ketika dicetak di atas kertas.

Perhatikan bahwa convertsecara default tidak mengubah rasio aspek dengan operasi pengubahan ukuran:

Ubah ukuran akan menyesuaikan gambar ke ukuran yang diminta. Itu TIDAK mengisi, ukuran kotak yang diminta.

( Manual ImageMagick )

Bergantung pada versi ImageMagick dan format input yang terlibat mungkin ok untuk menghilangkan -repageopsi. Tetapi kadang-kadang diperlukan dan tanpa opsi itu header PDF mungkin mengandung dimensi terlalu kecil. Bagaimanapun, yang -repageseharusnya tidak sakit.

Perhitungan menggunakan bilangan bulat aritmatika karena bashhanya mendukungnya. Dengan zshekspresi dapat disederhanakan - yaitu diganti dengan $((i*8.27))x$((i*11.69)).

Gambar Lineart

Jika file PNG adalah gambar bi-level (hitam & putih alias lineart) maka img2pdfalat menghasilkan hasil yang unggul di atas ImageMagick convert. Itu berarti img2pdflebih cepat dan menghasilkan PDF yang lebih kecil.

Contoh:

$ img2pdf -o multipage.pdf a.png b.png

atau:

$ img2pdf --pagesize A4 -o multipage.pdf a.png b.png
maxschlepzig
sumber
2
saat menggunakan -repage a4saya mendapatkaninvalid argument for option '-repage': a4
Scolytus
1
@ Colytus, pada sistem Fedora 19 Saya telah mengamati masalah yang sama - tampaknya -repagetidak mendukung nama a4 lagi. Saya telah mengatasinya melalui shell arithmetic:-repage $((150*8.27))x$((150*11.69))
maxschlepzig
Saya menganggap angka-angka ajaib itu 150dpi, dan A4 dinyatakan dalam unit legacy?
Michael Scheper
@MichaelScheper, ya, dpi dan inci.
maxschlepzig
Terima kasih, bantu saya. Sebenarnya -density 150argumen penting untuk ditambahkan.
dma_k
23

Apa yang benar-benar ingin Anda gunakan adalah:

$ convert a.png b.png -compress jpeg -resize 1240x1753 \
                      -extent 1240x1753 -gravity center \
                      -units PixelsPerInch -density 150x150 multipage.pdf

-extentsebenarnya memperluas gambar menjadi 1240x1753, sambil -resizemenjaga rasio gambar, pas ke salah satu 1240x...atau ...x1753.

The -gravityparameter opsional tetapi dapat digunakan ke tengah gambar ketika memperpanjang.

caugner
sumber
1
Terima kasih! -extentbenar-benar apa yang ingin saya gunakan :) - tolong, tambahkan kutipan kiri yang terlewatkan di depan -extent, terima kasih!
brown
Terima kasih, saya akhirnya menambahkan tanda centang yang hilang! ;-)
caugner
9

Tambahan untuk jawaban caugner :

Setelah menginstal IM v6.6.9-7 saya menemukan -gravityparameter perlu ditempatkan di antara -resizedan -extentuntuk memiliki efek.

selain itu (walaupun bukan bagian dari pertanyaan op) saya menemukan pengaturan warna latar belakang yang berbeda yang akan menghasilkan perintah total

convert in.jpg -resize 1240x1750 -background black -compose Copy\
               -gravity center -extent 1240x1750\
               -units PixelsPerInch -density 150 out.pdf

variasi lain yang bermanfaat yang sering saya gunakan ketika saya tidak ingin skala ulang gambar yang sudah datang dalam aspek-rasio yang benar tetapi menjaga resolusi individualnya adalah

convert in.jpg -units PixelsPerInch -set density '%[fx:w/8.27]'\
               -repage a4 out.pdf

di mana kerapatan target secara dinamis ditentukan dengan menghitung lebar dibagi dengan 8,27 (yang merupakan lebar dalam inci dari halaman A4). yang -repage a4parameter dapat dihilangkan sebagian besar waktu tetapi saya punya beberapa kasus di mana .pdf yang dihasilkan akan memiliki format yang berbeda sligtly off dimensi A4 dari 210x297mm (8.27x11.6" )

antiplex
sumber
2

Saya menemukan kode Mikher sangat berguna, namun memetakan PDF sepenuhnya sebagai Portrait atau Landscape, jadi saya telah memodifikasinya untuk memeriksa tata letak setiap file input dan mencocokkannya dalam output.

Saya tidak memasukkan edit Yotam karena berfungsi tanpa itu di kotak Ubuntu 15.04 saya.

$#!/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."
pengguna173283
sumber
2

Saya menemukan script berikut nyaman yang menggabungkan jawaban yang tercantum di sini serta beberapa masalah yang saya miliki dengan perhitungan floating point:

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"

Script disebut (disimpan sebagai file images2pdf)

images2pdf file\ 1.jpg file\ 2.jpg file\ 3.jpg output.pdf

/ edit: Menambahkan bendera "-l" menurut komentar oleh tanius untuk ketepatan yang lebih baik.

rindPHI
sumber
Petunjuk umum: $(echo "150*8.27" | bc)masih tidak bagus untuk floating point. Bekerja di sini karena ini adalah perkalian. Untuk $(echo "150/8.27" | bc)meskipun, hasilnya 18(dipotong ke integer). Sebaliknya, memanggil bcdengan tinggi scale: $(echo "150/8.27" | bc -l), hasil ini 18.137847….
tanius
1

Saya juga berjuang dengan hal-hal itu. Berdasarkan info di atas, saya menulis sebuah skrip yang menambahkan file gambar yang diurutkan berdasarkan abjad ke dalam satu PDF.

Beberapa variabel dapat diatur di dalam skrip. Itu tergantung pada ImageMagick dan pdftk.

NB: Jika gambar input memiliki resolusi yang lebih tinggi (dpi) daripada resolusi yang diinginkan dari output.pdf, gambar di-resampled ke resolusi yang lebih rendah. Jika tidak, gambar tidak akan diresampled dan hanya diperluas agar sesuai dengan kanvas halaman.

#!/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."
Mikher
sumber
Di atas, saya harus berubah -set density $ImgDensmenjadi-density $ImgDens
Yotam
0

Saya hanya menggunakan sesuatu yang mirip dengan jawaban maxschlepzigs di bawah Ubuntu 16.04 / ImageMagick

Ini juga memusatkan hasilnya

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

Saya ingin mengonversi gambar ke ukuran halaman 5,00 x 8,00 in (dilihat dari pembaca adobe) Inilah yang saya lakukan di ubuntu 18.04 OS. Pertama, cari tahu ukuran halaman yang saya cari seperti itu:

$ pdfinfo my-input.pdf

Dan hasilnya adalah: Ukuran halaman: 360 x 576 poin

Kemudian gambar dikonversi ke PDF dengan ukuran yang sama seperti:

$ img2pdf --pagesize 360x576 -o outpage.pdf input_pic.jpg

Catatan: untuk menginstal img2pdf

$ sudo untuk menginstal img2pdf

Harry
sumber