IT story

Linux에서 여러 jpg를 단일 pdf로 병합

hot-time 2020. 12. 29. 07:55
반응형

Linux에서 여러 jpg를 단일 pdf로 병합


다음 명령을 사용하여 jpg디렉토리의 모든 파일을 단일 pdf 파일 로 변환하고 병합했습니다 .

convert *.jpg file.pdf

디렉토리에있는 파일의 번호는 1.jpg에서 123.jpg. 변환은 잘되었지만 변환 후 페이지가 모두 섞여있었습니다. 나는에서 페이지가있는 PDF 원 1.jpg123.jpg그들이 이름을 지정하는 순서와 동일합니다. 다음 명령도 시도했습니다.

cd 1 
FILES=$( find . -type f -name "*jpg" | cut -d/ -f 2)
mkdir temp && cd temp 
for file in $FILES; do 
    BASE=$(echo $file | sed 's/.jpg//g');
    convert ../$BASE.jpg $BASE.pdf; 
    done && 
pdftk *pdf cat output ../1.pdf && 
cd .. 
rm -rf temp

그러나 여전히 운이 없습니다. 운영 플랫폼 Linux.


문제는 쉘이 순전히 알파벳 순서로 와일드 카드를 확장하고 숫자의 길이가 다르기 때문에 순서가 올바르지 않기 때문입니다.

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

해결책은 파일 이름을 필요에 따라 0으로 채워서 convert 명령을 실행하기 전에 길이가 같도록하는 것입니다.

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

이제 파일이 올바른 순서로 와일드 카드와 일치하여 convert 명령을 사용할 수 있습니다.

$ echo *.jpg
001.jpg 002.jpg 003.jpg 004.jpg 005.jpg 006.jpg 007.jpg 008.jpg ...

또는 ls설명서를 읽고 다음 을 참조하십시오.

-v 텍스트 내에서 자연스러운 종류의 (버전) 번호

따라서 단일 명령으로 필요한 작업을 수행합니다.

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

재미있게 보내세요;) F.


이것이 내가하는 방법입니다 :
첫 번째 줄은 convert 명령을 사용하여 모든 jpg 파일을 pdf로 변환합니다.
두 번째 줄은 모든 pdf 파일을 페이지 당 pdf로 하나의 단일 파일로 병합하는 것입니다. 이것은 gs ((PostScript 및 PDF 언어 인터프리터 및 프리 뷰어))를 사용하고 있습니다.

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"`

당신은 사용할 수 있습니다

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

https://www.imagemagick.org/script/command-line-processing.php 를 통해 :

다른 이미지 파일을 참조하는 또 다른 방법은 장면 범위와 함께 파일 이름에 서식 지정 문자를 포함하는 것입니다. 파일 이름을 고려하십시오 image-%d.jpg[1-5]. 명령

magick image-%d.jpg[1-5] ImageMagick이 다음 파일 이름을 가진 이미지 읽기를 시도합니다.

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

참조 https://www.imagemagick.org/script/convert.php


(스캔 한 책에서) 많은 고해상도 jpeg 이미지를 병합하려고 할 때 위의 모든 답변이 실패했습니다.

Imagemagick은 모든 파일을 RAM에로드하려고했기 때문에 다음과 같은 2 단계 접근 방식을 사용했습니다.

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

이 방법을 사용하면 GNU 병렬을 사용하여 변환 속도를 높일 수도 있습니다.

find -iname "*.JPG" | parallel -I'{}' convert {} {}.pdf

첫 번째 아이디어와 답장을 섞으면이 코드가 만족 스러울 것 같습니다.

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

참조 URL : https://stackoverflow.com/questions/13618236/merge-multiple-jpg-into-single-pdf-in-linux

반응형