이미지를 PDF로 변환 : PDF 페이지를 같은 크기로 만드는 방법


45

나는 같은 것을했다

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

그러나 첫 번째 페이지는 후속 페이지보다 훨씬 큽니다. 이미지 크기가 비슷한 경우에도 마찬가지입니다. 이러한 이미지는 스캔 및 자르므로 크기에 약간의 차이가있을 수 있습니다

-page A4페이지 크기를 수정해야한다고 생각 했습니까?

답변:


60

마지막으로 convert그러한 작업에 사용했을 때 크기 조정을 통해 대상의 크기를 명시 적으로 지정했습니다.

$ 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

convert명령은 항상 DPI 를 기본 밀도 / 페이지 형식 단위로 사용하지 않으므로 -units옵션 으로 DPI를 명시 적으로 지정합니다 (그렇지 않으면 버전 / 입력 형식 조합에 따라 다른 결과를 얻을 수 있음). 새 크기 (를 통해 지정됨 -resize)는 DIN A4 페이지의 크기 ( 픽셀)입니다. resize 인수는 최대 페이지 크기를 지정합니다. 해상도와 품질을 정확히 선택하는 것은 사용 사례에 따라 다릅니다 . 종이에 인쇄 할 때 너무 나쁘지 않은 공간을 절약하기 위해 150 DPI 와 평균 품질을 선택 했습니다.

참고 convert기본적으로 크기 조정 조작으로 화면 비율을 변경하지 않습니다 :

크기 조정은 이미지를 요청 된 크기에 맞 춥니 다. 요청 된 상자 크기를 채우지 않습니다.

( ImageMagick 매뉴얼 )

ImageMagick 버전 및 관련 입력 형식에 따라 -repage옵션 을 생략해도 됩니다. 그러나 때로는 필요하며이 옵션이 없으면 PDF 머리글에 너무 작은 치수가 포함될 수 있습니다. 어쨌든 -repage다치게해서는 안됩니다.

계산은 정수 산술 bash만 사용하므로 정수 산술을 사용 합니다. zsh표현식을 사용 하면 단순화 할 수 있습니다 $((i*8.27))x$((i*11.69)).

선화 이미지

PNG 파일이 2 단계 (흑백 일명 lineart) 이미지 인 경우이 img2pdf도구 는 ImageMagick보다 우수한 결과를 제공 convert합니다. 이는 img2pdf더 빠르고 더 작은 PDF를 생성 한다는 의미 입니다.

예:

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

또는:

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

2
사용하는 경우 -repage a4I을 받으려는invalid argument for option '-repage': a4
Scolytus

1
@Scolytus는 Fedora 19 시스템에서 비슷한 문제를 발견했습니다 -repage. 더 이상 a4 이름을 지원하지 않는 것 같습니다 . 셸 산술을 통해이 문제를 해결했습니다.-repage $((150*8.27))x$((150*11.69))
maxschlepzig

나는 그 마법의 숫자가 150dpi이고 A4가 레거시 단위로 표현되었다고 가정합니까?
Michael Scheper

@MichaelScheper, 예, dpi 및 인치.
maxschlepzig

고마워, 도와 줘 실제로는 -density 150논쟁이 중요했다.
dma_k

23

당신이 정말로 사용하고 싶은 것은 :

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

-extent실제로 이미지를 1240x1753으로 확장하면서 이미지 -resize비율 을 유지하고 이미지를 1240x...또는에 맞 춥니 다 ...x1753.

-gravity매개 변수는 선택 사항이지만 확장 할 때 이미지를 가운데에 배치하는 데 사용할 수 있습니다.


1
감사합니다! -extent정말 사용하고 싶은 것입니다 :)-제발, -extent 앞에 누락 된 왼쪽 따옴표를 추가하십시오. 감사합니다!
brownian

고마워, 나는 결국 누락 된 진드기를 추가했습니다! ;-)
caugner

9

caugner의 답변에 추가 :

설치 한 IM 내가 발견 v6.6.9-7 -gravity사이에 배치되는 파라미터 요구 -resize-extent효과를 갖도록한다.

또한 (반대 질문의 일부는 아니지만) 다른 배경색의 매력을 설정하여

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

이미 올바른 가로 세로 비율로 제공되는 이미지의 크기를 조정하지 않고 개별 해상도를 유지하려고 할 때 자주 사용하는 또 다른 유용한 변형은 다음과 같습니다.

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

여기서 목표 밀도는 너비를 8.27 (A4 페이지의 인치 단위 너비)로 나눈 값을 계산하여 동적으로 결정됩니다. 이 -repage a4매개 변수는 대부분 생략 할 수 있지만 결과 .pdf가 210x297mm (8.27x11.6 ")의 A4 치수와 다르게 다른 형식을 갖는 경우가 몇 가지 있습니다.


2

Mikher의 코드가 매우 유용하다는 것을 알았지 만 PDF를 세로 또는 가로로 완전히 배치 했으므로 각 입력 파일의 레이아웃을 확인하고 출력에서 ​​일치하도록 수정했습니다.

내 Ubuntu 15.04 상자에서 작동하지 않으므로 Yotam의 편집 내용을 포함시키지 않았습니다.

$#!/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

부동 소수점 계산과 관련된 몇 가지 문제뿐만 아니라 여기에 나열된 답변을 결합한 다음 스크립트가 편리하다는 것을 알았습니다.

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"

스크립트가 호출됩니다 (파일 images2pdf로 저장 됨)

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

/ edit : 더 나은 정밀도를 위해 tanius의 설명에 따라 "-l"플래그가 추가되었습니다.


일반적인 힌트 : $(echo "150*8.27" | bc)여전히 부동 소수점에는 적합하지 않습니다. 곱셈이기 때문에 여기서 작동합니다. 들어 $(echo "150/8.27" | bc)하지만, 결과가된다 18(정수로 잘립니다). 대신 bc더 높은 값으로 호출 하면 결과는 scale다음 과 같습니다 . $(echo "150/8.27" | bc -l)18.137847…
tanius

1

나도 그 물건으로 고투하고 있었다. 위의 정보를 바탕으로 알파벳순으로 정렬 된 이미지 파일을 단일 PDF에 추가하는 스크립트를 작성했습니다.

일부 변수는 스크립트 내에서 설정할 수 있습니다. ImageMagick 및 pdftk에 따라 다릅니다.

주의 : 입력 이미지가 원하는 output.pdf 해상도보다 높은 해상도 (dpi)를 갖는 경우 이미지는 낮은 해상도로 다시 샘플링됩니다. 그렇지 않으면 이미지가 리샘플링되지 않고 페이지 캔버스에 맞게 확장됩니다.

#!/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."

위에서, 나는 다음과 같이 바뀌어야 -set density $ImgDens했다-density $ImgDens
Yotam


0

방금 Ubuntu 16.04 / ImageMagick에서 maxschlepzigs 답변과 비슷한 것을 사용했습니다.

이것은 또한 결과의 중심입니다

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.