将当前目录中的每个pdf转换为png


16

我想编写一个bash脚本,将.pdf当前目录中的每个文件转换为一个.png文件。例如:

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

这是我的最佳尝试:

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

Answers:


17

如果您的名字确实很奇怪,包含换行符或反斜杠之类的名称,则可以执行以下操作:

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

那应该能够处理几乎所有您扔给它的东西。

使用的技巧:

  • find ... -print0:导致find以空字符分隔的结果打印结果,让我们处理换行符。
  • IFS= :这将禁用处理空格所需的分词。
  • read -r:禁用反斜杠转义符的解释,以处理包含反斜杠的文件。
  • read -d '':将记录定界符设置为空字符,以处理find的输出并正确处理带有换行符的文件名。
  • ${file%.*}.png:使用外壳程序的内置字符串操作功能删除扩展名。

两种答案都不错,但我接受了这一答案,因为它附带了所用技巧的解释。
我喜欢

或可移植地(POSIX)仍然处理任何特殊字符:find . -type f -name '*.pdf' -exec sh -c 'for f do convert -verbose -density 500 -resize 800 "$f" "${f%.pdf}.png"; done' find-sh {} + 有关说明和背景,请参见unix.stackexchange.com/a/321753/135943
通配符

1
@Wildcard唯一的非posix东西是find的-printf,因此您只需要将其替换为`-exec printf'%s \ 0'{} +`即可。
terdon

14

您可以使用bash for循环,如下所示:

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

7

您可以mogrify用来批量转换并调整.pdf当前目录中所有s的大小:

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

当使用其他format(在这种情况下-format png)时,原始.pdfs保持不变,输出文件具有相同的名称,但扩展名将更改为所指定的扩展名format


1

如果不限于使用bash,则可以使用python脚本将.pdf当前目录中的所有文件转换为高分辨率.png图像。可以将其修改为其他输入/输出图像类型,或者将用作其他参数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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.