Chuyển đổi mọi pdf trong thư mục hiện tại sang png


16

Tôi muốn viết một bashtập lệnh để chuyển đổi mọi .pdftập tin trong thư mục hiện tại thành một .pngtập tin. Ví dụ:

$ls .
a.pdf b.pdf
$./pdf2png.sh
Converting pdfs to pngs
a.pdf -> a.png
b.pdf -> b.png

Đây là nỗ lực tốt nhất của tôi:

#!/bin/bash
convert -verbose -density 500 -resize '800' a.pdf a.png
convert -verbose -density 500 -resize '800' b.pdf b.png

Câu trả lời:


17

Nếu bạn có những cái tên thực sự lạ, những cái tên chứa dòng mới hoặc dấu gạch chéo ngược và tương tự, bạn có thể làm một cái gì đó như thế này:

find . -type f -name '*.pdf' -print0 |
  while IFS= read -r -d '' file
    do convert -verbose -density 500 -resize 800 "${file}" "${file%.*}.png"
  done

Điều đó sẽ có thể đối phó với bất cứ điều gì bạn ném vào nó.

Thủ thuật được sử dụng:

  • find ... -print0: nguyên nhân findđể in kết quả của nó được phân tách bằng ký tự null, chúng ta hãy xử lý các dòng mới.
  • IFS= : điều này sẽ vô hiệu hóa việc tách từ, cần thiết để xử lý khoảng trắng.
  • read -r: vô hiệu hóa việc giải thích các ký tự thoát dấu gạch chéo ngược, để xử lý các tệp có chứa dấu gạch chéo ngược.
  • read -d '': đặt dấu phân cách bản ghi thành ký tự null, để xử lý đầu ra của find và xử lý chính xác tên tệp với các ký tự dòng mới.
  • ${file%.*}.png: sử dụng các khả năng thao tác chuỗi sẵn có của shell để xóa phần mở rộng.

Cả hai câu trả lời đều tốt nhưng tôi chấp nhận câu này vì nó đi kèm với lời giải thích về các thủ thuật được sử dụng.
Tôi thích Mã

Hoặc thực hiện một cách hợp lý (POSIX) và vẫn xử lý bất kỳ ký tự đặc biệt nào: find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + Xem unix.stackexchange.com/a/321753/135943 để được giải thích và lý lịch.
tự đại diện

1
@Wildcard điều duy nhất không phải là posix ở đây là find -printf, vì vậy tất cả những gì bạn cần cho tính di động là thay thế nó bằng `-exec printf '% s \ 0' {} +`.
terdon

14

Bạn có thể sử dụng bash forloop như sau:

#!/bin/bash
for pdfile in *.pdf ; do
  convert -verbose -density 500 -resize '800' "${pdfile}" "${pdfile%.*}".png
done

7

Bạn có thể sử dụng mogrifyđể chuyển đổi hàng loạt và thay đổi kích thước tất cả .pdfs trong thư mục hiện tại:

mogrify -verbose -density 500 -resize 800 -format png ./*.pdf

Khi sử dụng một cái khác format(trong trường hợp này -format png), các .pdfs gốc không bị ảnh hưởng, các tệp đầu ra có cùng tên ngoại trừ phần mở rộng sẽ được thay đổi thành một phần được chỉ định bởi format.


1

Nếu bạn không bị hạn chế sử dụng bash, thì bạn có thể sử dụng tập lệnh python để chuyển đổi tất cả các .pdftệp trong thư mục hiện tại thành .pnghình ảnh có độ phân giải cao . Nó có thể được sửa đổi cho các loại hình ảnh đầu vào / đầu ra khác, hoặc sử dụng các đối số khác nhau cho convert.

#! /usr/bin/env python

import os

def main():
    dir_list = os.listdir('.')
    for full_file_name in dir_list:
        base_name, extension = os.path.splitext(full_file_name)
        if extension == '.pdf': # then .pdf file --> convert to image!
            cmd_str = ' '.join(['convert',
                                '-density 400',
                                full_file_name,
                                base_name + '.png'])
            print(cmd_str)  # echo command to terminal
            os.system(cmd_str)  # execute command

if __name__ == '__main__':
    main()
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.