Merge multiple jpg into single pdf in Linux

后端 未结 6 1840
南旧
南旧 2021-01-30 02:25

I used the following command to convert and merge all the jpg files in a directory to a single pdf file.

convert *.jpg file.pdf

Th

相关标签:
6条回答
  • 2021-01-30 02:37

    Or just read the ls manual and see :

    -v natural sort of (version) numbers within text

    So, doing what we need in single command.

    convert `ls -v *.jpg` foobar.pdf
    

    Have fun ;) F.

    0 讨论(0)
  • 2021-01-30 02:42

    This is how I do it:
    First line convert all jpg files to pdf it is using convert command.
    Second line is merging all pdf files to one single as pdf per page. This is using gs ((PostScript and PDF language interpreter and previewer))

    for i in $(find . -maxdepth 1 -name "*.jpg" -print); do convert $i ${i//jpg/pdf}; done
    gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=merged_file.pdf -dBATCH `find . -maxdepth 1 -name "*.pdf" -print"`
    
    0 讨论(0)
  • 2021-01-30 02:43

    Mixing first idea with their reply, I think this code maybe satisfactory

    jpgs2pdf.sh
    
    #!/bin/bash
    
    cd $1
    FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2)
    mkdir temp > /dev/null
    cd temp
    
    for file in $FILES; do
     BASE=$(echo $file | sed 's/.jpg//g');
     convert ../$BASE.jpg $BASE.pdf;
    done &&
    
    pdftk `ls -v *pdf` cat output ../`basename $1`.pdf
    cd ..
    rm -rf temp
    
    0 讨论(0)
  • 2021-01-30 02:49

    The problem is because your shell is expanding the wildcard in a purely alphabetical order, and because the lengths of the numbers are different, the order will be incorrect:

    $ echo *.jpg
    1.jpg 10.jpg 100.jpg 101.jpg 102.jpg ...
    

    The solution is to pad the filenames with zeros as required so they're the same length before running your convert command:

    $ for i in *.jpg; do num=`expr match "$i" '\([0-9]\+\).*'`;
    > padded=`printf "%03d" $num`; mv -v "$i" "${i/$num/$padded}"; done
    

    Now the files will be matched by the wildcard in the correct order, ready for the convert command:

    $ echo *.jpg
    001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...
    
    0 讨论(0)
  • 2021-01-30 02:50

    All of the above answers failed for me, when I wanted to merge many high-resolution jpeg images (from a scanned book).

    Imagemagick tried to load all files into RAM, I therefore used the following two-step approach:

    find -iname "*.JPG" | xargs -I'{}' convert {} {}.pdf
    pdfunite *.pdf merged_file.pdf
    

    Note that with this approach, you can also use GNU parallel to speed up the conversion:

    find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf
    
    0 讨论(0)
  • 2021-01-30 02:57

    You could use

    convert '%d.jpg[1-132]' file.pdf
    

    via https://www.imagemagick.org/script/command-line-processing.php:

    Another method of referring to other image files is by embedding a formatting character in the filename with a scene range. Consider the filename image-%d.jpg[1-5]. The command

    magick image-%d.jpg[1-5] causes ImageMagick to attempt to read images with these filenames:

    image-1.jpg image-2.jpg image-3.jpg image-4.jpg image-5.jpg

    See also https://www.imagemagick.org/script/convert.php

    0 讨论(0)
提交回复
热议问题