छवियों को पीडीएफ में परिवर्तित करें: पीडीएफ पृष्ठों को समान आकार कैसे बनाएं


45

मैंने कुछ ऐसा किया

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

लेकिन 1 पृष्ठ बाद के पृष्ठों की तुलना में बहुत बड़ा है। यह तब भी होता है जब छवि आयाम समान होते हैं। इन छवियों को स्कैन और क्रॉप किया जाता है, इस प्रकार आयामों में मामूली अंतर हो सकता है

मैंने सोचा था -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आदेश हमेशा का उपयोग नहीं करता डीपीआई डिफ़ॉल्ट घनत्व / पेज प्रारूप इकाई के रूप में, इस प्रकार हम स्पष्ट रूप से डीपीआई निर्दिष्ट -unitsविकल्प (अन्यथा आप विभिन्न संस्करणों / इनपुट प्रारूप संयोजनों के साथ अलग अलग परिणाम प्राप्त हो सकते हैं)। नया आकार (के माध्यम से निर्दिष्ट -resize) पिक्सेल में एक डीआईएन ए 4 पृष्ठ का आयाम है । आकार परिवर्तन तर्क अधिकतम पृष्ठ आकार निर्दिष्ट करता है। क्या संकल्प और गुणवत्ता वास्तव में लेने के लिए उपयोग के मामले पर निर्भर करता है - मैंने 150 डीपीआई और औसत गुणवत्ता का चयन किया ताकि कुछ जगह को बचाया जा सके, जबकि यह कागज पर मुद्रित होने पर बहुत बुरा नहीं लगता है।

ध्यान दें कि convertडिफ़ॉल्ट रूप से आकार परिवर्तन के साथ पहलू अनुपात नहीं बदलता है:

आकार आकार में अनुरोधित आकार में फिट होगा। यह भरा हुआ बॉक्स आकार नहीं देता है।

( ImageMagick मैनुअल )

ImageMagick संस्करण और शामिल इनपुट प्रारूपों के आधार पर -repageविकल्प को छोड़ना ठीक हो सकता है। लेकिन कभी-कभी इसकी आवश्यकता होती है और उस विकल्प के बिना पीडीएफ हेडर में बहुत छोटे आयाम हो सकते हैं। किसी भी मामले में, -repageचोट नहीं पहुंचनी चाहिए।

कम्प्यूटेशन पूर्णांक अंकगणित का उपयोग करते हैं क्योंकि bashकेवल उसी का समर्थन करता है। zshअभिव्यक्तियों के साथ सरलीकृत किया जा सकता है - यानी के साथ बदल दिया $((i*8.27))x$((i*11.69))

रैखिक छवियाँ

यदि PNG फाइलें द्वि-स्तरीय (काले और सफेद उर्फ ​​रेखीय) चित्र हैं तो img2pdfटूल ImageMagick पर बेहतर परिणाम देता है convert। इसका मतलब img2pdfहै कि तेजी से और छोटे पीडीएफ पैदावार है।

उदाहरण:

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

या:

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

2
का उपयोग करते समय -repage a4मुझे invalid argument for option '-repage': a4
स्कोलिटस

1
@Scolytus, फेडोरा 19 प्रणाली पर मैंने एक समान मुद्दा देखा है - ऐसा लगता है कि -repageअब a4 नाम का समर्थन नहीं करता है। मैंने इसके चारों ओर शेल अंकगणित के माध्यम से काम किया है:-repage $((150*8.27))x$((150*11.69))
मैक्स

मुझे लगता है कि उन जादुई संख्या 150dpi है, और A4 विरासत इकाइयों में व्यक्त की गई हैं?
माइकल शेपर

@MichaelScheper, हाँ, डीपीआई और इंच।
मैक्सक्लेपजिग

धन्यवाद, मेरी मदद करो। दरअसल -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क्या मैं वास्तव में उपयोग करना चाहता हूं :) - कृपया, -entent के सामने छूटी हुई बोली जोड़ें, धन्यवाद!
ब्राउनियन

धन्यवाद, मैंने अंततः लापता टिक जोड़ा है! ;-)
कैगनर

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 sligtly 210x297mm की ए 4 आयाम बंद एक अलग प्रारूप के लिए होता था (8.27x11.6 ")


2

मुझे मिखेर का कोड बहुत उपयोगी लगा, हालाँकि यह पूरी तरह से पोर्ट्रेट या लैंडस्केप के रूप में पीडीएफ को बाहर करता है, इसलिए मैंने इसे प्रत्येक इनपुट फ़ाइल के लेआउट की जांच करने और आउटपुट में मिलान करने के लिए इसे संशोधित किया है।

मैंने 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."

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

/ संपादित करें: बेहतर परिशुद्धता के लिए टैनिस द्वारा टिप्पणी के अनुसार "-l" ध्वज जोड़ा गया।


सामान्य संकेत: $(echo "150*8.27" | bc)फ़्लोटिंग पॉइंट के लिए अभी भी महान नहीं है। यहां काम करता है क्योंकि यह एक गुणा है। के लिए $(echo "150/8.27" | bc)हालांकि, परिणाम है 18(पूर्णांक तक छोटा कर दिया)। इसके बजाय, bcउच्च के साथ कॉल करें scale: $(echo "150/8.27" | bc -l)परिणाम है 18.137847…
tanius

1

मैं उस सामान से भी जूझ रहा था। उपरोक्त जानकारी के आधार पर, मैंने एक स्क्रिप्ट लिखी, जो एक पीडीएफ में वर्णानुक्रम से छांटी गई छवि फ़ाइलों को जोड़ती है।

कुछ चर स्क्रिप्ट के अंदर व्यवस्थित होते हैं। यह ImageMagick और pdftk पर निर्भर करता है।

NB: यदि इनपुट छवि में आउटपुट के वांछित रिज़ॉल्यूशन की तुलना में अधिक रिज़ॉल्यूशन (डीपीआई) है, तो छवि को निम्न रिज़ॉल्यूशन पर बदल दिया जाता है। अन्यथा, छवि को फिर से डिज़ाइन नहीं किया गया है और यह केवल पृष्ठ कैनवास को फिट करने के लिए बढ़ाया गया है।

#!/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 के तहत मैक्सस्क्लेज़िग्स जवाब के समान कुछ इस्तेमाल किया

यह भी परिणाम को केंद्र में रखता है

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.