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

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

나는 다음과 같은 일을했다

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

그러나 첫 번째 페이지는 다음 페이지보다 훨씬 큽니다. 이는 이미지의 크기가 비슷한 경우에도 발생합니다. 해당 이미지는 스캔 및 잘린 이미지이므로 크기가 약간 다를 수 있습니다.

-page A4페이지 크기를 고정해야 한다고 생각하나요 ?

답변1

이런 종류의 작업 에 마지막으로 사용했을 때 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명령이 항상 사용되는 것은 아닙니다딥 PI기본 밀도/페이지 형식 단위이므로 -units해당 옵션을 사용하여 DPI를 명시적으로 지정합니다(그렇지 않으면 버전/입력 형식 조합에 따라 결과가 달라질 수 있음). 새 크기( 로 지정됨 -resize)는 다음과 같습니다.DIN A4 페이지 치수픽셀 단위입니다. resize 매개변수는 최대 페이지 크기를 지정합니다. 선택할 해상도와 품질은 사용 사례에 따라 다릅니다. 저는 150을 선택했습니다.딥 PI품질은 평균이고 공간도 절약되며 종이에 인쇄해도 괜찮아 보입니다.

기본적 으로 convert크기 조정 작업은 종횡비를 변경하지 않습니다.

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

(ImageMagick 매뉴얼)

ImageMagick 버전 및 관련 입력 형식에 따라 이 -repage옵션을 생략할 수 있습니다. 그러나 때로는 이것이 필요한 경우도 있습니다. 이 옵션이 없으면 PDF 헤더에 너무 작은 크기가 포함될 수 있습니다. 어쨌든 -repage아프지 않아야합니다.

bash정수 연산만 지원되므로 계산에서는 정수 연산을 사용합니다 . With zsh표현식은 단순화될 수 있습니다. 즉, 로 대체됩니다 $((i*8.27))x$((i*11.69)).

라인 아트 이미지

PNG 파일이 2레이어(선형이라고도 불리는 흑백) 이미지인 경우img2pdf도구ImageMagick보다 더 나은 결과를 생성합니다 convert. 이는 img2pdf더 빠른 속도와 더 작은 결과 PDF를 의미합니다.

예:

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

또는:

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

답변2

실제로 사용하고 싶은 것은 다음과 같습니다.

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

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

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

답변3

와는 별개로카우그너의 답변:

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 형식이 A4 크기 210x297mm(8.27x11.6")와 약간 다른 경우가 있습니다.

답변4

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

Yotam의 편집 내용은 Ubuntu 15.04 시스템에서 없이도 작동하기 때문에 포함하지 않았습니다.

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

관련 정보