การแปลงไฟล์ภาพหลายไฟล์จาก JPEG เป็นฟอร์แมท PDF


50

ฉันต้องการแปลงไฟล์บางส่วนจาก jpeg เป็น pdf ฉันใช้คำสั่งดังต่อไปนี้

$ convert image1.jpg image1.pdf 

แต่ฉันมี 100 ภาพ ฉันจะแปลงทั้งหมดให้เป็น pdf ที่สอดคล้องกันได้อย่างไร

ฉันเหนื่อย

$ convert image*.jpg image*.pdf 

มันไม่ทำงาน


ที่เกี่ยวข้อง: วิธีสร้าง PDF จากชุดของรูปภาพ? ที่ superuser SE
kenorb

คำตอบ:


62

ในทุบตี:

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

1
มีสาเหตุใดที่ทำให้คุณเพิ่ม "./" ลงในส่วนของการแปลง เป็นการปฏิบัติที่ดีโดยทั่วไปหรือไม่?
rahmu

4
@rahmu: ใช่มันเป็นวิธีปฏิบัติที่ดีเพราะชื่อไฟล์ที่ขึ้นต้นด้วย-ปัญหาเป็นอย่างอื่น
enzotib

3
ใช้งานได้ แต่mogrifyพิมพ์ได้น้อยกว่ามาก ดูคำตอบของฉัน
cjm

+1 เนื่องจากสิ่งนี้ถูกต้องทางเทคนิคและหลีกเลี่ยงข้อผิดพลาดทุบตี แต่ -1 เพราะความยุ่งเหยิงเป็นวิธี Imagemagick ในการแปลงภาพเป็นชุด ดังนั้นไม่มีการลงคะแนนจากฉัน
เบอนัวต์

@ aculich: ขอบคุณสำหรับ downvote ของคุณ แต่คุณทำผิดพิจารณาดูทำไมห่วงไม่ยกข้อผิดพลาด "อาร์กิวเมนต์นานเกินไป"? .
enzotib

56

คุณสามารถใช้mogrifyคำสั่งนี้ โดยปกติจะแก้ไขไฟล์ในสถานที่ แต่เมื่อแปลงรูปแบบจะเขียนไฟล์ใหม่ (เพียงแค่เปลี่ยนนามสกุลให้ตรงกับรูปแบบใหม่) ดังนั้น:

mogrify -format pdf -- *.jpg

(เช่นเดียวกับของ enzotib ./*.jpgสิ่งที่--ป้องกันไม่ให้ชื่อไฟล์แปลก ๆ ถูกตีความว่าเป็นสวิตช์คำสั่งส่วนใหญ่จำได้--ว่าหมายถึง "หยุดมองหาตัวเลือก ณ จุดนี้")


+1 คำตอบของฉันเกี่ยวกับทุบตีเท่านั้นไม่รู้จัก ImageMagick
enzotib

ความคิดที่ดีที่จะใช้แทนmogrify convertวิธีนี้จะใช้งานได้ 100 ไฟล์ แต่การใช้ globbing ด้วย*.jpgจะไม่ปรับขนาดไฟล์เป็นพันไฟล์ ที่สามารถทำได้โดยการรวมคำสั่งในหนึ่งง่ายซับด้วย find
aculich

วิธีการแปลงทั้งสอง *.jpgและ*.pngไฟล์ไปคนเดียว*.pdf? โปรดทราบว่าพวกเขาเป็นไฟล์ที่มีหมายเลข (เช่น1.jpg 2.png 3.png 4.jpg) และคำสั่งนั้นควรได้รับการเก็บรักษา / สงวนไว้ในเอาต์พุต pdf
บ๊องเกี่ยวกับ natty

เป็นวิธีแก้ปัญหา: แปลงทุกคน*.jpgเป็น*.pngขั้นตอนที่หนึ่งและดำเนินการเทียบเท่าคำตอบของคุณในขั้นตอนที่ 2 ...
บ้าเกี่ยวกับ natty


24

ไวยากรณ์เร็วขึ้น แต่ผิดปกติ:

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

ทำงานแบบขนาน (โดยใช้https://www.gnu.org/software/parallel/ ) ฉันยังไม่ได้สังเกตเห็นว่ามีหลายเธรดในconvertซึ่งจะ จำกัด การขนานที่มีประสิทธิภาพ หากนั่นเป็นข้อกังวลของคุณโปรดดูในความคิดเห็นด้านล่างสำหรับวิธีการเพื่อให้แน่ใจว่าจะไม่เกิดเธรดหลายเธรด


1
วิธีนี้เต็มไปด้วยชัยชนะ มันประเมินการนับหลักโดยอัตโนมัติและทำงานหลายอย่าง!
meawoppl

1
วิธีนี้เป็นวิธีที่เร็วที่สุดในบรรดาทั้งหมด
shivams

1
ขนานคือพลังงาน, รวมกันกับ imagemagick เป็นพลังวิเศษ ฉันชอบพลังพิเศษ
CousinCocaine

2
สายไปงานเลี้ยงเล็กน้อยที่นี่ แต่ ImageMagick เวอร์ชันใหม่ (อาจไม่ใช่ตอนที่เขียนคำตอบนี้) เป็นแบบมัลติเธรดและจะทำงานได้ไม่ดีหากทำงานแบบขนาน นี้สามารถใช้งาน (ถ้าใช้แบบขนานระดับโปรแกรมประยุกต์เช่นกับ GNU parallel) MAGICK_THREAD_LIMIT=1โดยการตั้งค่าตัวแปรสภาพแวดล้อม
zebediah49

การใช้ ImageMagick สำหรับผลลัพธ์นี้ทำให้เกิดการสูญเสียรุ่นและประสิทธิภาพต่ำ img2pdf ที่อื่นในหน้านี้หลีกเลี่ยงปัญหาเหล่านั้น
Robert Fleming

16

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

ในโซลูชันที่นำเสนอทั้งหมดที่เกี่ยวข้องกับ ImageMagick ข้อมูล JPEG จะถูกถอดรหัสและเข้ารหัสใหม่ทั้งหมด ซึ่งจะส่งผลในการสูญเสียรุ่นเช่นเดียวกับผลงาน "10-100" img2pdfครั้งเลวร้ายยิ่งกว่า

สามารถติดตั้งpip img2pdfได้หากคุณมีการอ้างอิง (เช่นapt-get install python python-pil python-setuptools libjpeg-devหรือyum install python python-pillow python-setuptools)


3
ถูกต้อง คุณสามารถทดสอบว่าบินเปลี่ยนแปลงไฟล์ JPEG convert some.jpg -format pdf -compress jpeg generated.pdf ; pdfimages -j generated.pdf generated.pdf ; diff -sq some.jpg generated.pdf-000.jpgที่มีคำสั่งเช่น IMHO คำตอบนี้สมควรได้รับการโหวตมากขึ้น ที่จริงconvertล้มเหลวที่นี่img2pdfผ่านการทดสอบดังกล่าวและยังมีตัวเลือกมากมายในการกำหนดขนาดภาพขนาดหน้า ฯลฯ เพื่อปรับ PDF ที่สร้างขึ้นตามความต้องการของคุณ
Stéphane Gourichon

3
img2pdfมีอยู่ใน Ubuntu 16.04 ที่เก็บปกติไม่จำเป็นต้องมีการดำเนินการด้วยpipตนเองและคุณจะได้รับประโยชน์จากการอัพเดท
Stéphane Gourichon

1
ในเวลาที่คำถามถูกถาม (และตอบรับแล้ว) img2pdf ไม่มีอยู่จริง แต่ทุกวันนี้ img2pdf เป็นคำตอบที่ดีกว่าอย่างชัดเจน
kmkaplan

13

นี่คือวิธีที่รวมคำแนะนำที่ดีที่สุดไว้ในบรรทัดคำสั่งที่เรียบง่ายมีประสิทธิภาพและแข็งแกร่ง:

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

มันทำงานได้ดีกับชื่อไฟล์ที่ขึ้นต้นด้วย-หรือมีช่องว่าง หมายเหตุการใช้ของ-inameที่เป็นกรณีตายรุ่น-nameจึงจะทำงานในเพียงเป็น.JPG.jpg

สิ่งนี้ใช้findเพื่อรับรายการไฟล์แทนที่จะเป็นเชลล์โดยใช้*.jpgสัญลักษณ์แทนซึ่งอาจส่งผลให้เกิดข้อผิดพลาด 'รายการอาร์กิวเมนต์ยาวเกินไป'ในบางระบบ แม้ว่าจะเป็นจุด @enzotib ในความคิดเห็นพฤติกรรมของการใช้globbing ในสำหรับวงจะแตกต่างกว่าข้อโต้แย้งคำสั่งของ

นอกจากนี้findจะจัดการกับไดเรกทอรีย่อยในขณะที่เชลล์ globbing จะไม่เว้นเสียแต่ว่าคุณจะมีคุณสมบัติเฉพาะของเชลล์เช่น**/*jpgไวยากรณ์วนรอบแบบเรียกซ้ำใน zsh

แก้ไข:ฉันคิดว่าฉันจะเพิ่มคุณสมบัติที่มีประโยชน์อีกอย่าง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ทุกครั้งที่เป็นไปได้ ... มันมีความหมายที่หลากหลายและกระชับ


การใช้ ImageMagick สำหรับผลลัพธ์นี้ทำให้เกิดการสูญเสียรุ่นและประสิทธิภาพต่ำ img2pdf ที่อื่นในหน้านี้หลีกเลี่ยงปัญหาเหล่านั้น
Robert Fleming

8

คุณสามารถทำได้convertโดยตรง นี้จะพบได้ที่ด้านล่างของ ImageMagicks เว็บไซต์เกี่ยวกับคำสั่งประมวลผลสาย

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

4
หรือconvert *.jpg -adjoin output.pdfสำหรับ pdf ที่รวมกัน
ninjagecko

2
การใช้ ImageMagick สำหรับผลลัพธ์นี้ทำให้เกิดการสูญเสียรุ่นและประสิทธิภาพต่ำ img2pdf ที่อื่นในหน้านี้หลีกเลี่ยงปัญหาเหล่านั้น
Robert Fleming

7

ฉันใช้ makefile ต่อไปนี้เพื่อสิ่งที่คล้ายกัน:

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

all: $(PNG)

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


clean: 
    rm $(PNG)

ตอนนี้ฉันสามารถเรียกใช้makeและฉันได้รับไฟล์ png สำหรับไฟล์ svg ทุกไฟล์ที่อยู่รอบ ๆ

แก้ไข

ตามที่ขอ:

  • wildcards สร้างรายการ svgs ทั้งหมดใน origs /
  • pathubst ใช้รายการนี้และสร้างรายการชื่อไฟล์ png (โฟลเดอร์และส่วนขยายอื่นตัวอย่าง: origs/foo.svgกลายเป็นfoo.png)
  • กฎข้อที่ 1: all: $(PNG)กำหนดว่าเป้าหมาย "ทั้งหมด" ขึ้นอยู่กับ PNG ทั้งหมด
  • กฎข้อที่ 2: %.png: origs/%.svgกำหนด, thethe ไฟล์ $ X.png ขึ้นอยู่กับ origs / $ X.svg convert ... $< $@และสามารถสร้างขึ้นโดยการเรียก
    • $< คือการพึ่งพาและและ
    • $@ เป็นชื่อเป้าหมาย
  • กฎข้อที่ 3: เป็นเพียงการทำความสะอาด

2
สำหรับภารกิจที่ใช้ครั้งเดียวการสร้าง Makefile อาจเกินความจำเป็น แต่ถ้าคุณวางแผนที่จะเปลี่ยน PDF บางส่วนการพิมพ์makeอีกครั้งจะเป็นการแปลงไฟล์เหล่านั้นกลับคืนและเฉพาะไฟล์ PDF ที่มีการเปลี่ยนแปลง
Ilmari Karonen

คุณจะช่วยอธิบายว่า wildcard, orig, patsubst คืออะไร, $ และ% ถูกตีความอย่างไรและ $ <$ @? ที่เหลือก็เข้าใจง่าย :)
ผู้ใช้ที่ไม่รู้จัก

หันไปmakeดูเหมือนเล็กน้อยที่ซับซ้อนมากกว่าเมื่อง่ายหนึ่งซับจะทำเคล็ดลับ
aculich

@IlmariKaronen ฉันยอมรับว่า Makefile นั้น overkill แต่มันก็ดีที่มีวิธีการกู้คืนเฉพาะเซ็ตย่อยของไฟล์ที่ถูกแก้ไขในการรันครั้งต่อไป ฉันได้อัปเดตคำตอบของฉันด้วยวิธีการที่ทำได้ด้วยfindดังนั้นคุณไม่ต้องหันไปใช้ Makefile
aculich

0

สคริปต์ตัวจิ๋วนั้นน่าจะหลอกได้ (ทดสอบด้วย ksh88 บน 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

จากนั้นคุณสามารถรันfindเพื่อรันสคริปต์:

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

โปรดทราบว่าทั้งสองscript.kshและfindคำสั่งที่ฉันให้คุณอาจมีไวยากรณ์ที่แตกต่างกันขึ้นอยู่กับระบบปฏิบัติการและเชลล์ที่คุณใช้


pdfname=${1%.*}.pdfpdfแทนที่นามสกุลไฟล์ที่มี วิธีการนั้นง่ายกว่ามากและใช้ได้แม้ว่าชื่อไฟล์จะมีอักขระพิเศษ ในบันทึกย่อที่เกี่ยวข้องให้เพิ่มเครื่องหมายคำพูดคู่ล้อมรอบการแทนที่ตัวแปร
Gilles 'หยุดความชั่วร้าย'

ไม่มีเหตุผลที่จะเขียนสคริปต์ที่แยกจากกันไม่เป็นเมื่อมันสามารถทั้งหมดจะทำในมีบรรทัดคำสั่งเดียวที่เรียบง่าย
aculich

0

ยูทิลิตี้ MacOSSIPS   ภายใต้ MacOS (Sierra) ยูทิลิตี้บรรทัดคำสั่งในตัวของ Apple sipsช่วยให้สามารถเข้าถึงยูทิลิตี้ภาพแรสเตอร์ของ Apple ได้อย่างครอบคลุม นี้จะออกมารวมถึงการเปลี่ยนแปลงของการjpgpdf

ตัวอย่างเช่นจากjpgอิมเมจความละเอียดต่ำ / ขนาดเล็กที่มีอยู่'cat.jpg'(ขนาด 8401 ไบต์) บรรทัดคำสั่งต่อไปนี้จะสร้าง'cat.pdf'ขึ้นโดยไม่มีการเปลี่ยนแปลงในความละเอียดแรสเตอร์และการขยายขนาดไฟล์น้อยที่สุด:

$ 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

การแปลงเป็นPSDรูปแบบภาพแรสเตอร์ของ Adobesipsสำนวนที่  คล้ายกันสร้าง*.psdไฟล์ที่เข้ากันได้กับ 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

อย่างไรก็ตามโปรดทราบว่าการขยายขนาดไฟล์ 30 เท่าที่ใช้ดูแลpsdรูปแบบAdope raster

การผลิตหนังสือ   ในการผลิตหนังสือขนาดใหญ่ที่เกี่ยวข้องกับภาพหลายร้อยภาพที่จัดจำหน่ายในหลายรูปแบบสำหรับฉันสำนวนบรรทัดคำสั่งที่สะดวกสบายได้ใช้ImageMagickยูทิลิตี้เพื่อสร้างไฟล์ภาพแรสเตอร์บริสุทธิ์ในpngรูปแบบ (พร้อม meta-data ทั้งหมดและ โปรไฟล์สีถอดออก) จากนั้นใช้sipsในการเรียกคืนชุดเครื่องแบบของโปรไฟล์สีและ / หรือความคิดเห็นและการใช้งานsipsนอกจากนี้ยังมีการสร้างไฟล์ผลลัพธ์สุดท้าย (โดยทั่วไป*.png, *.psdหรือ*.pdfไฟล์)


0

แต่น่าเสียดายที่convertการเปลี่ยนแปลงภาพก่อนหน้านี้เพื่อให้มีการสูญเสียคุณภาพของต้นฉบับที่น้อยที่สุดที่jpgคุณต้องการใช้img2pdfฉันใช้คำสั่งนี้:

1) สิ่งนี้จะทำให้pdfไฟล์ออกมาจากjpgภาพทุกภาพโดยไม่สูญเสียความละเอียดหรือคุณภาพ:

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

2) สิ่งนี้เพื่อเชื่อมpdfหน้าเป็นหนึ่งเดียว:

pdftk *.pdf cat output combined.pdf

3) และสุดท้ายฉันเพิ่มเลเยอร์ข้อความ OCRed ที่ไม่เปลี่ยนคุณภาพของการสแกนในไฟล์ PDF เพื่อให้สามารถค้นหาได้:

pypdfocr combined.pdf  

0

ฉันได้รับการแก้ปัญหาด้วย imagemagick สำหรับการแปลงและขนานเพื่อเร่งกระบวนการแปลงของฉัน:

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

0

วิธีที่ง่ายที่สุดวิธีหนึ่งในการแปลงไฟล์หลายไฟล์คือไปที่ไดเรกทอรีไฟล์ใน linux terminal และประเภท:

$ convert *.png mypdf.pdf

-1

หากคุณใช้ไฟล์รูปภาพเพียงอย่างเดียวบางทีคุณอาจต้องการใช้Comic Book Archive (.cbr, .cbz, .cbt, .cba, .cb7)

  • หากคุณใช้ 7Z ให้เปลี่ยนชื่อนามสกุลไฟล์ (คำต่อท้าย) เป็น. cb7
  • หากคุณใช้ ACE ให้เปลี่ยนชื่อนามสกุลไฟล์ (คำต่อท้าย) เป็น. cba
  • หากคุณใช้ RAR ให้เปลี่ยนชื่อนามสกุลไฟล์ (ส่วนต่อท้าย) เป็น. cbr
  • หากคุณใช้ TAR ให้เปลี่ยนชื่อนามสกุลไฟล์ (ส่วนต่อท้าย) เป็น. cbt
  • หากคุณใช้ ZIP ให้เปลี่ยนชื่อนามสกุลไฟล์ (ส่วนต่อท้าย) เป็น. cbz

มีความยืดหยุ่นมากกว่า 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 เนื่องจากไม่มีส่วนเกี่ยวข้องกับคำถามของ OP
toogley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.