it-swarm-id.com

konversi gambar ke pdf: Cara membuat PDF Halaman berukuran sama

Saya melakukan sesuatu seperti

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

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

Saya pikir -page A4 haruskah memperbaiki ukuran halaman?

47
Jiew Meng

Terakhir kali saya menggunakan convert untuk tugas 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

Perintah convert tidak selalu menggunakan DPI sebagai unit format kepadatan/halaman default, jadi kami secara eksplisit menentukan DPI dengan -units (jika tidak, Anda mungkin mendapatkan hasil yang berbeda dengan berbagai versi/kombinasi format input). Ukuran baru (ditentukan melalui -resize) Adalah dimensi halaman DIN A4 dalam piksel. Argumen pengubahan ukuran menentukan ukuran halaman maksimal. Apa resolusi dan kualitas untuk memilih persis tergantung pada kasus penggunaan - saya memilih 150 DPI dan kualitas rata-rata untuk menghemat ruang sementara itu tidak terlihat terlalu buruk ketika dicetak di kertas.

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

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

( Manual ImageMagick )

Bergantung pada versi ImageMagick dan format input yang terlibat mungkin tidak masalah untuk mengabaikan opsi -repage. Tapi kadang-kadang diperlukan dan tanpa opsi itu header PDF mungkin mengandung dimensi terlalu kecil. Bagaimanapun, -repage Tidak boleh sakit.

Komputasi menggunakan aritmatika integer karena bash hanya mendukungnya. Dengan zsh ekspresi dapat disederhanakan - mis. Diganti dengan $((i*8.27))x$((i*11.69)).

Gambar Lineart

Jika file PNG adalah bi-level (hitam & putih a.k.a lineart) gambar maka alat img2pdf menghasilkan hasil yang unggul di atas ImageMagick convert. Itu berarti img2pdf Lebih 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
63
maxschlepzig

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

-extent sebenarnya memperluas gambar menjadi 1240x1753, sementara -resize menjaga rasio gambar, memasangnya ke dalam salah satu 1240x... atau ...x1753.

-gravity parameter adalah opsional tetapi dapat digunakan untuk memusatkan gambar saat memanjang.

25
caugner

Tambahan ke jawaban caugner :

menginstal IM v6.6.9.9-7 saya menemukan -gravity parameter harus ditempatkan di antara -resize dan -extent untuk memiliki efek.

selain itu (meskipun bukan bagian dari pertanyaan o.p.) 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 ditentukan secara dinamis dengan menghitung lebar dibagi dengan 8,27 (yang merupakan lebar dalam inci dari halaman A4). -repage a4 parameter dapat dihilangkan sebagian besar waktu tetapi saya memiliki beberapa kasus di mana .pdf yang dihasilkan akan memiliki format yang berbeda dari dimensi A4 210x297mm (8.27x11.6 ")

9
antiplex

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.

2
rindPHI

Saya sangat merekomendasikan Python program CLI img2pdf untuk konversi tanpa kerugian:

https://gitlab.mister-muffin.de/josch/img2pdf

Contoh penggunaan:

img2pdf img1.png img2.png -o out.pdf
2
Adam Erickson

Saya menemukan kode Mikher sangat berguna, tetapi menjabarkan PDF seluruhnya 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."
2
user173283

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

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

Saya ingin mengonversi gambar ke ukuran halaman 5.00 x 8.00 in (dilihat dari Adobe reader) Inilah yang saya lakukan di ubuntu 18.04 OS. Pertama, cari tahu ukuran halaman yang saya cari seperti itu:

$ pdfinfo my-input.pdf

Dan pengembaliannya adalah: kuran 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

0
Harry