Mengubah banyak file gambar dari format JPEG ke format PDF


50

Saya ingin mengonversi beberapa file dari jpeg ke pdf. Saya menggunakan perintah berikut.

$ convert image1.jpg image1.pdf 

Tapi saya punya 100 gambar. Bagaimana saya harus mengonversikan semuanya ke pdf yang sesuai?

Saya mencoba

$ convert image*.jpg image*.pdf 

Itu tidak bekerja.


Jawaban:


62

Dalam bash:

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

1
Ada alasan khusus mengapa Anda menambahkan "./" ke args of convert? Apakah ini praktik umum yang baik?
rahmu

4
@rahmu: ya, ini adalah praktik yang baik, karena nama file diawali dengan -memberi masalah, jika tidak.
enzotib

3
Ini berfungsi, tetapi mogrifymengetik jauh lebih sedikit. Lihat jawaban saya.
cjm

+1 karena ini secara teknis benar dan menghindari perangkap bash, tetapi -1 karena mogrify adalah cara Imagemagick untuk mengonversi gambar secara batch. Jadi tidak ada suara dari saya.
Benoit

@aculich: terima kasih atas downvote Anda, tetapi Anda melakukan pertimbangan yang salah, lihat mengapa loop tidak menimbulkan kesalahan "argumen terlalu lama"? .
enzotib

56

Anda dapat menggunakan mogrifyperintah untuk ini. Biasanya, itu memodifikasi file di tempat, tetapi ketika mengkonversi format, ia menulis file baru (hanya mengubah ekstensi agar sesuai dengan format baru). Jadi:

mogrify -format pdf -- *.jpg

(Seperti halnya enzotib ./*.jpg, yang --mencegah nama file aneh ditafsirkan sebagai switch. Sebagian besar perintah mengenali --artinya "berhenti mencari opsi pada titik ini".)


+1, jawaban saya hanya tentang bash, tidak tahu benar ImageMagick.
enzotib

Ide bagus untuk digunakan mogrifysebagai gantinya convert. Ini akan bekerja untuk 100 file, tetapi menggunakan globbing dengan *.jpgtidak skala ke ribuan file; yang dapat dilakukan dengan menggabungkan perintah dalam satu baris sederhana denganfind .
aculich

Bagaimana cara mengonversi keduanya *.jpg dan *.pngfile menjadi satu *.pdf? Perhatikan bahwa mereka adalah file bernomor (misalnya, 1.jpg 2.png 3.png 4.jpg) dan urutan itu harus dipertahankan / dipertahankan dalam output pdf.
gila tentang rapi

sebagai solusinya: mengubah semua *.jpgmenjadi *.pngdalam langkah pertama, dan melakukan yang setara dengan jawaban Anda di langkah 2 ...
gila tentang natty


24

sintaks yang lebih cepat tetapi tidak biasa:

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

Berjalan paralel (menggunakan https://www.gnu.org/software/parallel/ ). Saya belum melihat adanya multi-threading convert, yang akan membatasi paralelisasi yang efektif. Jika itu yang menjadi perhatian Anda, lihat di komentar di bawah ini untuk metode untuk memastikan tidak terjadi multi-threading.


1
Cara ini penuh dengan kemenangan. Itu otomatis menilai jumlah inti dan menjalankan banyak tugas!
meawoppl

1
Metode ini adalah yang tercepat dari semuanya.
shivams

1
paralel adalah kekuatan, paralel dikombinasikan dengan imagemagick adalah kekuatan super. Saya suka kekuatan super.
CousinCocaine

2
Agak terlambat ke pesta di sini, tetapi versi baru (mungkin tidak ketika jawaban ini ditulis) ImageMagick adalah multi-utas, dan akan berinteraksi buruk jika dijalankan secara paralel. Ini dapat dinonaktifkan (jika menggunakan paralelisasi tingkat aplikasi seperti dengan GNU parallel) dengan mengatur variabel lingkungan MAGICK_THREAD_LIMIT=1.
zebediah49

Menggunakan ImageMagick untuk ini menghasilkan hilangnya generasi dan kinerja yang buruk. img2pdf di tempat lain di halaman ini menghindari masalah-masalah itu.
Robert Fleming

16

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

Di semua solusi yang diusulkan yang melibatkan ImageMagick, data JPEG sepenuhnya diterjemahkan dan disandikan ulang. Ini menghasilkan kehilangan generasi , serta kinerja "sepuluh hingga seratus" kali lebih buruk daripada img2pdf.

Dapat diinstal dengan pip img2pdfasalkan Anda memiliki dependensi (misalnya apt-get install python python-pil python-setuptools libjpeg-devatau yum install python python-pillow python-setuptools).


3
benar. Anda dapat menguji bahwa pulang pergi mengubah file JPEG dengan perintah seperti convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpg. IMHO jawaban ini pantas mendapatkan lebih banyak suara. Memang, convertgagal di sini, img2pdflulus tes semacam itu dan bahkan menyertakan banyak opsi untuk mengatur ukuran gambar, ukuran halaman, dll. Untuk menyetel pdf yang dihasilkan sesuai kebutuhan Anda.
Stéphane Gourichon

3
img2pdftersedia di repositori reguler Ubuntu 16.04, tidak perlu untuk operasi manual dengan pipsana, dan Anda tetap mendapat manfaat dari pembaruan.
Stéphane Gourichon

1
Pada saat pertanyaan diajukan (dan jawaban diterima) img2pdf tidak ada. Tapi sekarang img2pdf jelas merupakan jawaban yang lebih baik.
kmkaplan

13

Berikut adalah cara yang menggabungkan saran terbaik di atas menjadi baris perintah yang sederhana, efisien, dan kuat:

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

Ini berfungsi baik dengan nama file yang dimulai dengan -atau mengandung spasi. Perhatikan penggunaan -inameyang merupakan case-sensitive versi -namesehingga akan bekerja pada .JPGsama seperti .jpg.

Ini digunakan finduntuk mendapatkan daftar file alih-alih shell globbing dengan *.jpgwildcard yang dapat mengakibatkan kesalahan 'Daftar argumen terlalu lama' pada beberapa sistem. Meskipun seperti yang ditunjukkan oleh @enzotib dalam komentar, perilaku menggunakan globbing dalam for for berbeda dari argumen perintah .

Juga, findakan menangani subdirektori, sedangkan shell globbing tidak akan kecuali Anda kebetulan memiliki fitur spesifik shell seperti **/*jpgsintaks globbing rekursif di zsh.

EDIT: Saya pikir saya akan menambahkan fitur lain yang berguna findyang saya pikirkan setelah membaca komentar oleh @IlmariKaronen tentang menjalankan kembali perintah dan hanya mengonversi file yang telah berubah sejak dijalankan pertama kali.

Pada pass pertama Anda dapat touchfile cap waktu setelah konversi selesai.

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

Kemudian tambahkan -newer timestampke findekspresi untuk beroperasi pada subset file yang waktu modifikasi terakhirnya lebih baru daripada file timestamp. Lanjutkan memperbarui file stempel waktu setelah setiap kali dijalankan.

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

Ini adalah cara mudah untuk menghindari keharusan menggunakan Makefile (kecuali jika Anda sudah menggunakan Makefile) dan itu adalah alasan bagus mengapa layak digunakan findkapan saja mungkin ... itu memiliki ekspresif serbaguna sementara tetap ringkas.


Menggunakan ImageMagick untuk ini menghasilkan hilangnya generasi dan kinerja yang buruk. img2pdf di tempat lain di halaman ini menghindari masalah-masalah itu.
Robert Fleming

8

Anda dapat melakukan ini dengan convertlangsung. Ini dapat ditemukan di bagian bawah Situs ImageMagicks tentang Pemrosesan Baris Perintah .

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

4
atau convert *.jpg -adjoin output.pdfuntuk pdf gabungan
ninjagecko

2
Menggunakan ImageMagick untuk ini menghasilkan hilangnya generasi dan kinerja yang buruk. img2pdf di tempat lain di halaman ini menghindari masalah-masalah itu.
Robert Fleming

7

Saya telah menggunakan makefile berikut untuk sesuatu yang serupa:

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

all: $(PNG)

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


clean: 
    rm $(PNG)

Sekarang saya bisa menjalankan makedan mendapatkan file png untuk setiap file svg yang ada.

Sunting

Seperti yang diminta:

  • wildcard menghasilkan daftar semua svgs dalam bentuk asal /
  • pathsubst mengambil daftar ini dan menghasilkan daftar nama file png (folder dan ekstensi berbeda. Contoh: origs/foo.svgmenjadi foo.png)
  • Aturan 1: all: $(PNG)mendefinisikan, bahwa target "semua" tergantung pada semua PNG
  • Aturan 2: %.png: origs/%.svgmendefinisikan, file $ X.png tergantung pada origs / $ X.svg dan dapat dihasilkan dengan memanggil convert ... $< $@.
    • $< adalah ketergantungan dan dan
    • $@ adalah nama target
  • ATURAN 3: hanya untuk membersihkan

2
Untuk tugas sekali saja, membuat Makefile mungkin berlebihan, tetapi jika Anda berencana untuk mengubah beberapa PDF, mengetik makelagi akan mengubah lagi, dan hanya itu, PDF yang telah berubah.
Ilmari Karonen

Maukah Anda menjelaskan apa itu wildcard, origs, patsubst, bagaimana $ dan% ditafsirkan dan $ <$ @? Sisanya mudah dimengerti. :)
pengguna tidak diketahui

Menggunakan maketampaknya sedikit terlalu rumit ketika satu-liner sederhana akan melakukan trik.
aculich

@IlmariKaronen Saya setuju bahwa Makefile berlebihan, tetapi menyenangkan memiliki cara untuk mengubah hanya sebagian dari file yang dimodifikasi pada proses selanjutnya. Saya telah memperbarui jawaban saya dengan cara melakukannya hanya dengan findbegitu Anda tidak perlu menggunakan Makefile.
aculich

0

Sebuah skrip kecil akan berhasil. (diuji dengan ksh88 pada Solaris 10)

script.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

Kemudian Anda dapat menjalankan finduntuk mengeksekusi skrip:

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

Perhatikan bahwa baik script.kshdan findperintah yang saya berikan kepada Anda, mungkin memiliki sintaks yang berbeda tergantung pada OS dan shell yang Anda gunakan.


pdfname=${1%.*}.pdfmengganti ekstensi file dengan pdf. Metode itu jauh lebih sederhana dan berfungsi bahkan jika nama file berisi karakter khusus. Pada catatan terkait, tambahkan tanda kutip ganda di sekitar penggantian variabel.
Gilles 'SANGAT berhenti menjadi jahat'

Tidak ada alasan untuk menulis skrip terpisah ketika semuanya dapat dilakukan pada dengan satu baris perintah sederhana .
aculich

0

Utilitas MacOSSIPS   Di bawah MacOS (Sierra), utilitas baris perintah bawaan Apple sipsmenyediakan akses komprehensif ke semua utilitas citra raster Apple; ini ternyata termasuk konversi jpgke pdf.

Sebagai contoh, dari resolusi rendah / kecil ukuran yang ada jpggambar 'cat.jpg'(ukuran 8401 bytes), berikut command-line menciptakan 'cat.pdf', dengan tidak ada perubahan dalam raster-resolusi dan ekspansi minimal ukuran file:

$ 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

Konversi ke PSDformat gambar raster Adobe.sips Idiom   serupa membuat *.psdfile yang kompatibel dengan 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

Namun perlu dicatat bahwa ekspansi ukuran file 30 kali lipat yang menyertai penggunaan psdformat raster Adope .

Produksi Buku   Dalam melakukan produksi buku skala besar, yang melibatkan ratusan gambar, yang disediakan dalam berbagai format, bagi saya idiom baris perintah yang mudah digunakan adalah ImageMagickutilitas untuk membuat file gambar raster murni dalam pngformat (dengan semua meta-data dan profil warna dilucuti-out), kemudian gunakan sipsuntuk mengembalikan satu set seragam profil warna dan / atau komentar, dan menggunakan sipsjuga untuk menghasilkan file output akhir (paling sering *.png, *.psdatau *.pdffile).


0

Sayangnya convertmengubah gambar sebelum jadi untuk memiliki minimal kehilangan kualitas asli jpgyang perlu Anda gunakan img2pdf, saya menggunakan perintah ini:

1) Ini untuk membuat pdffile dari setiap jpggambar tanpa kehilangan resolusi atau kualitas:

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

2) Ini untuk menyatukan pdfhalaman menjadi satu:

pdftk *.pdf cat output combined.pdf

3) Dan terakhir saya menambahkan layer teks OCR yang tidak mengubah kualitas pemindaian di pdf sehingga dapat dicari:

pypdfocr combined.pdf  

0

Saya menyelesaikan dengan imagemagick untuk konversi dan paralel untuk mempercepat proses konversi saya:

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

0

Salah satu cara paling sederhana untuk mengonversi banyak file adalah dengan masuk ke direktori file di terminal linux dan ketik:

$ convert *.png mypdf.pdf

-1

Jika Anda hanya menggunakan file gambar daripada mungkin Anda ingin menggunakan Arsip Buku Komik (.cbr, .cbz, .cbt, .cba, .cb7)

  • Jika Anda menggunakan 7Z maka ganti nama ekstensi file (suffix) menjadi .cb7
  • Jika Anda menggunakan ACE maka ganti nama ekstensi file (suffix) ke .cba
  • Jika Anda menggunakan RAR, maka ganti nama ekstensi file (suffix) menjadi .cbr
  • Jika Anda menggunakan TAR, maka ganti nama ekstensi file (suffix) menjadi .cbt
  • Jika Anda menggunakan ZIP maka ganti nama ekstensi file (suffix) ke .cbz

Ini jauh lebih fleksibel daripada PDF.

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

https://secure.wikimedia.org/wikipedia/en/wiki/Comic_book_archive


1
downvoted, karena tidak ada hubungannya dengan pertanyaan OP.
toogley
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.