Chuyển đổi nhiều tệp hình ảnh từ định dạng JPEG sang PDF


50

Tôi muốn chuyển đổi một số tập tin từ jpeg sang pdf. Tôi đang sử dụng lệnh sau.

$ convert image1.jpg image1.pdf 

Nhưng tôi có 100 hình ảnh. Tôi nên chuyển đổi tất cả chúng thành pdf tương ứng như thế nào?

Tôi đã thử

$ convert image*.jpg image*.pdf 

Nó không hoạt động.


Câu trả lời:


62

Trong bash:

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

1
Bất kỳ lý do cụ thể tại sao bạn trả trước "./" cho các đối số chuyển đổi? Đó có phải là một thực hành tốt nói chung?
rahmu

4
@rahmu: vâng, đó là một cách thực hành tốt, vì tên tệp bắt đầu bằng -các vấn đề, nếu không.
enzotib

3
Điều này hoạt động, nhưng mogrifylà rất ít gõ. Xem câu trả lời của tôi.
cjm

+1 vì điều này đúng về mặt kỹ thuật và tránh các cạm bẫy bash, nhưng -1 vì mogrify là cách Imagemagick để chuyển đổi hàng loạt hình ảnh. Vì vậy, không có phiếu bầu từ tôi.
Benoit

@aculich: cảm ơn bạn vì downvote của bạn, nhưng bạn đã xem xét sai, hãy xem tại sao vòng lặp không nâng cao đối số đường dài quá lỗi Lỗi? .
enzotib

56

Bạn có thể sử dụng mogrifylệnh cho việc này. Thông thường, nó sửa đổi các tệp tại chỗ, nhưng khi chuyển đổi định dạng, nó sẽ ghi một tệp mới (chỉ thay đổi phần mở rộng để phù hợp với định dạng mới). Do vậy:

mogrify -format pdf -- *.jpg

(Giống như enzotib ./*.jpg, --ngăn không cho bất kỳ tên tệp lạ nào được hiểu là công tắc. Hầu hết các lệnh nhận ra --có nghĩa là "ngừng tìm kiếm các tùy chọn tại thời điểm này".)


+1, câu trả lời của tôi chỉ là về bash, không biết rõ ImageMagick.
enzotib

Ý tưởng tốt để sử dụng mogrifythay vì convert. Điều này sẽ hoạt động cho 100 tệp, nhưng sử dụng Globing với *.jpgquy mô không đến hàng nghìn tệp; điều đó có thể được thực hiện bằng cách kết hợp lệnh trong một lớp lót đơn giản vớifind .
aculich

Làm thế nào để chuyển đổi cả hai *.jpg*.pngtập tin thành một *.pdf? Lưu ý rằng chúng là các tệp được đánh số (ví dụ 1.jpg 2.png 3.png 4.jpg:) và thứ tự đó phải được duy trì / bảo tồn trong đầu ra pdf.
hấp dẫn về natty

như một cách giải quyết: chuyển đổi tất cả *.jpgthành *.pngbước trong bước một và thực hiện tương đương với câu trả lời của bạn ở bước 2 ...
về sự tự nhiên vào


24

cú pháp nhanh hơn nhưng bất thường:

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

Chạy song song (sử dụng https://www.gnu.org/software/abul/ ). Tôi chưa nhận thấy bất kỳ đa luồng convertnào, điều này sẽ hạn chế sự song song hiệu quả. Nếu đó là mối quan tâm của bạn, hãy xem trong phần bình luận bên dưới để biết phương pháp đảm bảo không xảy ra đa luồng.


1
Cách này là đầy chiến thắng. Nó tự động đánh giá số lượng cốt lõi và chạy nhiều nhiệm vụ!
meawoppl

1
Phương pháp này là nhanh nhất trong tất cả.
shivams

1
song song là sức mạnh, song song kết hợp với fantemagick là siêu năng lực. Tôi thích siêu năng lực.
CousinCocaine

2
Một chút muộn cho bữa tiệc ở đây, nhưng các phiên bản mới (có thể không phải khi câu trả lời này được viết) của ImageMagick là đa luồng và sẽ tương tác xấu nếu chạy song song. Điều này có thể bị vô hiệu hóa (nếu sử dụng song song hóa mức ứng dụng, chẳng hạn như với GNU parallel) bằng cách đặt biến môi trường MAGICK_THREAD_LIMIT=1.
zebediah49

Sử dụng ImageMagick cho kết quả này làm mất thế hệ và hiệu suất kém. img2pdf ở nơi khác trên trang này sẽ tránh được những vấn đề đó.
Robert Fleming

16

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

Trong tất cả các giải pháp được đề xuất liên quan đến ImageMagick, dữ liệu JPEG được giải mã hoàn toàn và được mã hóa lại. Điều này dẫn đến mất thế hệ , cũng như hiệu suất "tệ hơn gấp mười đến trăm lần" img2pdf.

Có thể được cài đặt với pip img2pdfđiều kiện bạn có phụ thuộc (ví dụ apt-get install python python-pil python-setuptools libjpeg-devhoặc yum install python python-pillow python-setuptools).


3
đúng. Bạn có thể kiểm tra xem một vòng tròn thay đổi tệp JPEG bằng các lệnh như thế nào convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. IMHO câu trả lời này xứng đáng được nâng cao hơn. Thật vậy, convertthất bại ở đây, img2pdfvượt qua một bài kiểm tra như vậy và thậm chí bao gồm nhiều tùy chọn để đặt kích thước hình ảnh, kích thước trang, v.v để hoàn thiện bản pdf được tạo theo nhu cầu của bạn.
Stéphane Gourichon

3
img2pdfcó sẵn trong kho lưu trữ thông thường của Ubuntu 16.04, không cần thao tác thủ công pipở đó và bạn giữ được lợi ích của việc cập nhật.
Stéphane Gourichon

1
Tại thời điểm câu hỏi được hỏi (và câu trả lời được chấp nhận) img2pdf không tồn tại. Nhưng ngày nay img2pdf rõ ràng là một câu trả lời tốt hơn.
kmkaplan

13

Dưới đây là cách kết hợp những gợi ý tốt nhất ở trên thành một dòng lệnh đơn giản, hiệu quả, mạnh mẽ:

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

Nó hoạt động tốt với tên tệp bắt đầu bằng một -hoặc chứa khoảng trắng. Lưu ý việc sử dụng -inameđó là case-insensitive phiên bản -namevì vậy nó sẽ làm việc trên .JPGchỉ cũng như .jpg.

Điều này sử dụng findđể có được danh sách tệp thay vì shell toàn cầu bằng *.jpgký tự đại diện có thể dẫn đến lỗi list Danh sách đối số quá dài ' trên một số hệ thống. Mặc dù như @enzotib chỉ ra trong một nhận xét, hành vi sử dụng Globing trong một vòng lặp for khác với các đối số của lệnh .

Ngoài ra, findsẽ xử lý các thư mục con, trong khi shell shellbing sẽ không trừ khi bạn có các tính năng dành riêng cho shell như **/*jpgcú pháp tạo khối đệ quy trong zsh.

EDIT: Tôi nghĩ rằng tôi sẽ thêm một tính năng hữu ích khác findmà tôi nghĩ đến sau khi đọc một bình luận của @IlmariKaronen về việc chạy lại lệnh và chỉ chuyển đổi các tệp đã thay đổi kể từ lần chạy đầu tiên.

Ở lượt đi đầu tiên, bạn có thể tạo touchtệp dấu thời gian sau khi quá trình chuyển đổi kết thúc.

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

Sau đó thêm -newer timestampvào findbiểu thức để hoạt động trên tập hợp con của các tệp có thời gian được sửa đổi lần cuối mới hơn tệp dấu thời gian. Tiếp tục cập nhật tệp dấu thời gian sau mỗi lần chạy.

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

Đây là một cách dễ dàng để tránh phải dùng đến Makefile (trừ khi bạn đã sử dụng nó) và đó là một lý do chính đáng khác tại sao nó đáng để sử dụng findbất cứ khi nào có thể ... nó có tính biểu cảm linh hoạt trong khi vẫn ngắn gọn.


Sử dụng ImageMagick cho kết quả này làm mất thế hệ và hiệu suất kém. img2pdf ở nơi khác trên trang này sẽ tránh được những vấn đề đó.
Robert Fleming

8

Bạn có thể làm điều này với converttrực tiếp. Điều này được tìm thấy ở dưới cùng của Trang web ImageMagicks về Xử lý dòng lệnh .

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

4
hoặc convert *.jpg -adjoin output.pdfcho bản pdf kết hợp
ninjagecko

2
Sử dụng ImageMagick cho kết quả này làm mất thế hệ và hiệu suất kém. img2pdf ở nơi khác trên trang này sẽ tránh được những vấn đề đó.
Robert Fleming

7

Tôi đã sử dụng tệp thực hiện sau đây cho một cái gì đó tương tự:

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

all: $(PNG)

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


clean: 
    rm $(PNG)

Bây giờ tôi chỉ có thể chạy makevà tôi nhận được các tệp png cho mỗi tệp svg nằm xung quanh.

Biên tập

Như yêu cầu:

  • ký tự đại diện tạo ra một danh sách tất cả các Svss trong origs /
  • pathubst lấy danh sách này và tạo một danh sách các tên tệp png (thư mục và phần mở rộng khác nhau. Ví dụ: origs/foo.svgtrở thành foo.png)
  • Quy tắc 1: all: $(PNG)xác định rằng mục tiêu "tất cả" phụ thuộc vào tất cả các PNG
  • Quy tắc 2: %.png: origs/%.svgđịnh nghĩa, tập tin $ X.png phụ thuộc vào origs / $ X.svg và có thể được tạo bằng cách gọi convert ... $< $@.
    • $< là sự phụ thuộc và
    • $@ là tên mục tiêu
  • Quy tắc 3: chỉ để dọn dẹp

2
Đối với tác vụ một lần, việc tạo Makefile có thể là quá mức cần thiết, nhưng nếu bạn có kế hoạch thay đổi một số tệp PDF, gõ makelại sẽ tái tạo lại những tệp đó và chỉ những tệp PDF đã thay đổi.
Ilmari Karonen

Bạn có muốn giải thích ký tự đại diện, origs, patsubst là gì không, làm thế nào $ và% được diễn giải và $ <$ @? Phần còn lại là dễ hiểu. :)
người dùng không xác định

Khu nghỉ dưỡng makecó vẻ hơi phức tạp khi một chiếc áo lót đơn giản sẽ thực hiện thủ thuật.
aculich

@IlmariKaronen Tôi đồng ý rằng Makefile là quá mức cần thiết, nhưng thật tuyệt khi có cách để chỉ hoàn nguyên tập hợp con của các tệp đã sửa đổi trong các lần chạy tiếp theo. Tôi đã cập nhật câu trả lời của mình bằng một cách để làm điều đó chỉ với findđể bạn không phải dùng đến Makefile.
aculich

0

Một kịch bản nhỏ sẽ làm điều đó. (đã thử nghiệm với ksh88 trên Solaris 10)

kịch bản.ksh

#!/bin/ksh

[[ $# != 1 ]] && exit 255 # test for nr of args

pdfname=$(sed -e 's/\(.*\)\.jpg/\1\.pdf/' <(echo $"1")) #replace *.jpg with *.pdf
convert "$1" $pdfname

Sau đó, bạn có thể chạy findđể thực thi tập lệnh:

find dir -name image\*.jpg -exec /bin/ksh script.ksh {} \;

Lưu ý rằng cả hai script.kshfindlệnh tôi đã đưa cho bạn, có thể có các cú pháp khác nhau xuất hiện trên HĐH và hệ vỏ bạn đang sử dụng.


pdfname=${1%.*}.pdfthay thế phần mở rộng của tập tin bằng pdf. Phương pháp đó đơn giản hơn rất nhiều và hoạt động ngay cả khi tên tệp chứa các ký tự đặc biệt. Trên một lưu ý liên quan, thêm dấu ngoặc kép xung quanh thay thế biến.
Gilles 'SO- ngừng trở nên xấu xa'

Không có lý do để viết một tập lệnh riêng biệt khi tất cả có thể được thực hiện trên một dòng lệnh đơn giản .
aculich

0

Tiện ích MacOSSIPS   Theo MacOS (Sierra), tiện ích dòng lệnh tích hợp sipscủa Apple cung cấp quyền truy cập toàn diện vào tất cả các tiện ích hình ảnh raster của Apple; điều này hóa ra bao gồm việc chuyển đổi jpgthành pdf.

Ví dụ: từ một jpghình ảnh có độ phân giải thấp / kích thước nhỏ hiện có 'cat.jpg'(có kích thước 8401 byte), dòng lệnh sau sẽ tạo ra 'cat.pdf', không có thay đổi về độ phân giải raster và mở rộng kích thước tệp tối thiểu:

$ sips -s format pdf cat.jpg --out 'cat.pdf' 1>/dev/null 2>&1
$ ls -l cat.*
-rw-r--r--@ 1 <user redacted> <group redacted>  8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 <user redacted> <group redacted> 10193 Jun 18 07:22 cat.pdf

Chuyển đổi sang PSDđịnh dạng hình ảnh raster của Adobe   Một sipsthành ngữ tương tự tạo ra *.psdcác tệp tương thích với Adobe

$ sips -s format psd cat.jpg --out 'cat.psd' 1>/dev/null 2>&1
$ ls -l cat.jpg cat.psd
-rw-r--r--@ 1 Administration  staff    8401 Jun 18 07:06 cat.jpg
-rw-r--r--+ 1 Administration  staff  350252 Jun 18 07:37 cat.psd

Tuy nhiên, lưu ý rằng việc mở rộng kích thước tệp 30 lần có liên quan đến việc sử dụng psdđịnh dạng raster của Adope .

Sản xuất sách   Khi thực hiện sản xuất sách quy mô lớn, bao gồm hàng trăm hình ảnh, được cung cấp ở nhiều định dạng, đối với tôi, một thành ngữ dòng lệnh thuận tiện đã được sử dụng ImageMagickcác tiện ích để tạo các tệp hình ảnh raster thuần túy ở pngđịnh dạng (với tất cả dữ liệu meta và cấu hình màu sắc tước-out), sau đó sử dụng sipsđể khôi phục một bộ đồng phục của cấu hình màu sắc và / hoặc ý kiến, và sử dụng sipscũng để tạo ra tập tin đầu ra cuối cùng (phổ biến nhất *.png, *.psdhoặc *.pdftập tin).


0

Thật không may convertthay đổi hình ảnh trước đó để giảm chất lượng ban đầu jpgbạn cần sử dụng img2pdf, tôi sử dụng các lệnh này:

1) Điều này để tạo một pdftệp ra khỏi mọi jpghình ảnh mà không làm giảm độ phân giải hoặc chất lượng:

ls -1 ./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf

2) Điều này để ghép các pdftrang thành một:

pdftk *.pdf cat output combined.pdf

3) Và cuối cùng tôi thêm một lớp văn bản OCRed không làm thay đổi chất lượng quét trong pdf để chúng có thể tìm kiếm được:

pypdfocr combined.pdf  

0

Tôi đã giải quyết bằng hình ảnh để chuyển đổi và song song để đẩy nhanh quá trình chuyển đổi của mình:

ls *.JPEG |parallel convert -density 200 -resize 496X646 -quality 100 {}  ../{.}.PDF

0

Một trong những cách đơn giản nhất để chuyển đổi nhiều tệp là vào thư mục tệp trong thiết bị đầu cuối linux và gõ:

$ convert *.png mypdf.pdf

-1

Nếu bạn chỉ sử dụng các tệp hình ảnh hơn có thể bạn muốn sử dụng Lưu trữ Truyện tranh (.cbr, .cbz, .cbt, .cba, .cb7)

  • Nếu bạn sử dụng 7Z thì đổi tên phần mở rộng tệp (hậu tố) thành .cb7
  • Nếu bạn sử dụng ACE thì đổi tên phần mở rộng tệp (hậu tố) thành .cba
  • Nếu bạn sử dụng RAR thì đổi tên phần mở rộng tệp (hậu tố) thành .cbr
  • Nếu bạn sử dụng TAR thì đổi tên phần mở rộng tệp (hậu tố) thành .cbt
  • Nếu bạn sử dụng ZIP thì đổi tên phần mở rộng tệp (hậu tố) thành .cbz

Điều này linh hoạt hơn nhiều so với PDF.

Under Linux you can use software like Comix, Evince, Okular and QComicBook.

https://secure.wik mega.org/wikipedia/en/wiki/Comic_book_archive


1
bị hạ thấp, vì nó không liên quan gì đến câu hỏi của OP.
toogley
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.