【问题标题】:How to write a loop in shell for graphicsmagick?如何在shell中为graphicsmagick编写一个循环?
【发布时间】:2019-08-13 10:43:25
【问题描述】:

我设法(在 SO 的帮助下)用graphicsmagick 从一个 pdf 文件制作了完美的 png-sn-ps。我的 pdf 包含文本和公式,每个“sn-p”都在一个页面上。我的命令将页面的内容修剪为内容,最后将其缩放到 2000 像素宽度。

到目前为止,我需要为每个 pdf 中的每一页重复该命令。我想知道如何自动化这个。我想我可以尝试一个循环来重复每个页面的命令,直到最后一页。

假设 file1.pdf 在我当前的工作目录中。

gm convert -density 300x300 file1.pdf[0] -trim -resize 2000x file1_page1.png
gm convert -density 300x300 file1.pdf[1] -trim -resize 2000x file1_page2.png
gm convert -density 300x300 file1.pdf[2] -trim -resize 2000x file1_page3.png
...

如何设置计数器并为文档中的每一页运行循环?

【问题讨论】:

    标签: bash shell loops pdf graphicsmagick


    【解决方案1】:

    你很幸运。 GraphicsMagick 知道如何为您做到这一点:

    gm convert -density 300x300 input.pdf -trim -resize 2000x +adjoin output-%d.png
    

    如果您可以使用 ImageMagick 代替,您可以将起始输出文件号设置为 1 而不是 0 并且不需要 -adjoin

    convert -density 300x300 input.pdf -scene 1 -trim -resize 2000x output-%d.png
    

    或者,如果您希望它们全部并行完成,请使用 GNU Parallel

    parallel gm convert -density 300x300 {} -trim -resize 2000x output-{#}.png  ::: $(identify input.pdf | awk '{print $1}')
    

    【讨论】:

    • 哇,这比我的回答好多了。
    • @JUSHJUSH 有不止一种方法可以做到这一点 - 这个问题确实要求循环,所以从技术上讲,你的比我的更正确;-)
    • 我又一次陷入了 XY 问题。询问该工作的错误子程序。第一个版本完美运行:)
    【解决方案2】:
    for file in *.pdf
    do
        pages=$(identify "$file" | wc -l)
        for (( i=0; i<$pages; i++ ))
        do
            name=$(sed "s/\.pdf$/$i.png/g" <<< "$file");
            gm convert -density 300x300 "$file[$i]" -trim -resize 2000x "$name"
        done
    done
    

    试试这个。 它将每个 *.pdf 文件中的每一页转换为 .png。

    【讨论】:

    • 嗨,Jushjush,我应该如何执行这个循环?我将它保存到 loop.sh 并尝试在终端中运行。我什么也没做。我应该添加一些#bash 行吗?我是 shell 脚本的新手。
    • 只需使用bash loop.sh。您必须与您的 pdf 文件位于同一目录中。
    • @MarcoDoe 请检查identify file1.pdf | wc -l 是否返回您的shell 中的页数。
    • Puh 我真的尝试过,但不能使用identify 命令。 bash loop.sh 给出错误,例如“第 1 行 $'\r':找不到命令$。”
    • @MarcoDoe 'line 1 $\r' 的问题可能与使用 windows 有关。尝试运行命令dos2unix loop.sh,然后运行脚本。另外,您是否有任何其他程序可以检查您的 pdf 文件中的页数?我认为“识别”程序是 imagesmagick 软件包的一部分。
    猜你喜欢
    • 2022-09-28
    • 1970-01-01
    • 2019-06-21
    • 2016-10-17
    • 2020-04-25
    • 2011-02-05
    • 1970-01-01
    • 2011-08-26
    • 2015-11-01
    相关资源
    最近更新 更多