Bash 如何在shell中为graphicsmagick编写循环?

Bash 如何在shell中为graphicsmagick编写循环?,bash,shell,loops,pdf,graphicsmagick,Bash,Shell,Loops,Pdf,Graphicsmagick,我设法(在SO的帮助下)用graphicsmagick从pdf文件中制作了完美的png片段。我的pdf包含单个页面上的每个“片段”的文本和公式。我的命令会将页面内容修剪为最新内容,并最终将其扩展到2000像素宽 直到现在,我需要对每个pdf中的每个页面重复该命令。我想知道如何实现自动化。我想我可以尝试一个循环,在最后一页之前,在每一页重复这个命令 假设file1.pdf在我当前的工作目录中 gm convert-density 300x300 file1.pdf[0]-trim-resize 2

我设法(在SO的帮助下)用
graphicsmagick
从pdf文件中制作了完美的png片段。我的pdf包含单个页面上的每个“片段”的文本和公式。我的命令会将页面内容修剪为最新内容,并最终将其扩展到2000像素宽

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

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

gm convert-density 300x300 file1.pdf[0]-trim-resize 2000x file1_page1.png
gm convert-密度300x300文件1.pdf[1]-修剪-调整2000x文件大小1_page2.png
gm convert-密度300x300文件1.pdf[2]-修剪-调整大小2000x文件1_page3.png
...
如何为文档中的每一页设置计数器并运行循环?

用于*.pdf中的文件
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
做 页面=$(标识“$file”| wc-l)
因为((i=0;i你很幸运。GraphicsMagick知道如何为你做到这一点:

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

如果可以改用ImageMagick,则可以将起始输出文件号设置为
1
,而不是
0
,并且不需要
-邻接

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,我应该如何执行这个循环?我将它保存到loop.sh并尝试在终端中运行。我什么也没做。我应该添加一些#bash行吗?我对shell脚本编写不熟悉。只需使用
bash loop.sh
。您必须与您的pdf文件位于同一目录中。@MarcoDoe请检查
identifiel1.pdf | wc-l
是否返回pa的编号我确实尝试过,但无法使用
identify
命令。
bash-loop.sh
给出错误,例如“第1行$”\r:“未找到命令$”@MarcoDoe“第1$\r行”的问题可能与使用windows有关。请尝试运行命令
dos2unix loop.sh
,然后运行脚本。此外,您是否有其他程序来检查pdf文件中的页数?我认为“标识”程序是imagesmagick包的一部分。哇,这比我的答案好得多。@JUSHJUSH还有更多不止一种方法——这个问题需要一个循环,所以技术上你的比我的更正确;-)我再一次陷入XY问题。为这个工作问了一些错误的子程序。第一个版本工作得很好:)