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
하위 디렉토리를 처리하지만 **/*jpg
zsh 의 재귀 적 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은 정리를위한 것입니다