[unix] JPEG에서 PDF 형식으로 여러 이미지 파일 변환

jpeg에서 pdf로 일부 파일을 변환하고 싶습니다. 다음 명령을 사용하고 있습니다.

$ convert image1.jpg image1.pdf

하지만 100 개의 이미지가 있습니다. 모든 파일을 해당 PDF로 변환하려면 어떻게해야합니까?

나는 시도했다

$ convert image*.jpg image*.pdf

작동하지 않습니다.



답변

bash에서 :

for f in *.jpg; do
  convert ./"$f" ./"${f%.jpg}.pdf"
done


답변

mogrify이 명령을 사용할 수 있습니다 . 일반적으로 파일을 제자리에서 수정하지만 형식을 변환 할 때 새 파일을 작성합니다 (새 형식과 일치하도록 확장명 만 변경). 그러므로:

mogrify -format pdf -- *.jpg

(enzotib 년대처럼 ./*.jpg--방지가에서 이상한 파일 이름은 스위치로 해석된다. 대부분의 명령 인식 --“이 시점에서 옵션을 찾고 중지”를 의미 할 수 있습니다.)


답변

더 빠르지 만 특이한 구문 :

parallel convert '{} {.}.pdf' ::: *.jpg

https://www.gnu.org/software/parallel/을 사용하여 병렬로 실행합니다 . convert아직 멀티 스레딩을 보지 못했지만 효과적인 병렬 처리가 제한됩니다. 이것이 우려되는 경우 멀티 스레딩이 발생하지 않도록하는 방법은 아래 주석을 참조하십시오.


답변

https://gitlab.mister-muffin.de/josch/img2pdf

ImageMagick과 관련된 모든 제안 된 솔루션에서 JPEG 데이터는 완전히 디코딩되고 다시 인코딩됩니다. 이로 인해 발전 손실 및 성능은 “수백”배보다 나 빠진다 img2pdf.

pip img2pdf종속성 (예 : apt-get install python python-pil python-setuptools libjpeg-dev또는 yum install python python-pillow python-setuptools) 이 있는 경우 설치할 수 있습니다 .


답변

위의 제안을 최대한 단순하고 효율적이며 강력한 명령 줄로 결합하는 방법은 다음과 같습니다.

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +

-공백으로 시작 하거나 공백을 포함 하는 파일 이름으로 잘 작동 합니다. 의 사용에주의 -iname대소 문자를 구별하지 버전 -name이 켜져 작동 그래서 .JPG단지뿐만 아니라 .jpg.

이것은 일부 시스템에서 ‘인수 목록이 너무 깁니다’라는 오류가 발생할 수 find있는 *.jpg와일드 카드 로 쉘을 가져 오는 대신 파일 목록을 가져 오는 데 사용 됩니다 . @enzotib이 주석에서 지적한 것처럼 for 루프에서 globbing 을 사용하는 동작은 명령의 인수와 다릅니다 .

또한 find하위 디렉토리를 처리하지만 **/*jpgzsh 의 재귀 적 globbing 구문 과 같은 쉘 특정 기능을 사용하지 않는 한 쉘 globbing은 수행하지 않습니다 .

편집 : 나는 명령을 다시 실행하고 첫 번째 실행 이후 변경된 파일 만 변환 find하는 것에 대한 @IlmariKaronen 의 의견을 읽은 후에 생각한 다른 유용한 기능을 추가 할 것이라고 생각했습니다 .

첫 번째 패스 touch에서는 변환이 완료된 후 타임 스탬프 파일 을 사용할 수 있습니다 .

find /path/to/files -iname '*.jpg' -exec mogrify -format pdf {} +; touch timestamp

그런 다음 표현식에 추가 -newer timestamp하여 find마지막으로 수정 한 시간이 타임 스탬프 파일보다 새로운 파일의 하위 집합에서 작동합니다. 각 실행 후에 타임 스탬프 파일을 계속 업데이트하십시오.

find /path/to/files -iname '*.jpg' -newer timestamp -exec mogrify -format pdf {} +; touch timestamp

이것은 Makefile에 의지하지 않아도되는 쉬운 방법이며 (이미 사용하지 않는 한) 가능한 한 언제라도 사용할 가치가있는 또 다른 이유 find입니다. 간결하면서도 다양한 표현력이 있습니다.


답변

convert직접 할 수 있습니다 . 이것은 ImageMagicks 사이트 하단의 커맨드 라인 처리 에 관한 것 입니다.

convert *.jpg +adjoin page-%d.pdf


답변

비슷한 것을 위해 다음 makefile을 사용했습니다.

SVG = $(wildcard origs/*.svg)
PNG = $(patsubst origs/%.svg,%.png,$(SVG))

all: $(PNG)

%.png: origs/%.svg
    convert -resize "64x" $< $@


clean:
    rm $(PNG)

이제 그냥 실행할 수 make있고 주위에있는 모든 svg 파일에 대해 png 파일을 얻습니다.

편집하다

요청한대로 :

  • 와일드 카드는 origs /의 모든 svgs 목록을 생성합니다
  • pathsubst는이 목록을 가져 와서 png 파일 이름 목록을 생성합니다 (다른 폴더 및 확장자. 예 : origs/foo.svg됩니다 foo.png)
  • 규칙 1 : all: $(PNG)대상 “모두”가 모든 PNG에 종속됨을 정의
  • 규칙 2 : %.png: origs/%.svg$ X.png 파일은 origs / $ X.svg에 의존하며를 호출하여 생성 할 수 있습니다 convert ... $< $@.
    • $< 의존성과
    • $@ 대상 이름입니다
  • 규칙 3은 정리를위한 것입니다