Как прочитать входные данные как массив и использовать его как переменную в сценарии оболочки? - PullRequest
0 голосов
/ 08 февраля 2020

Я создал сценарий оболочки для создания миниатюр из PDF с помощью ImageMagick. Он проведет вас шаг за шагом, а затем создаст миниатюру на основе вашего ввода.

Теперь я пытаюсь переделать часть «$ page», потому что вы можете использовать только одну страницу (число) в качестве ввода на время ... И я хочу, чтобы скрипт мог читать больше входных данных страницы (числа, разделенные запятой или пробелом) - сохранить их в массив, а затем использовать этот массив как переменную ($ page) в функции "CONVERT" .. .

У кого-нибудь есть идеи?

Спасибо!

Вот код:

    # set function
CONVERT()
{
    num=0
    name=$(basename "$file" .pdf | cut -d- -f1 | sed 's/.$//' | tr ' ' '-')
    ext="png"
    mark='/path/to/the/watermark.png'
    if [[ ! -e "$path"/"$name"_$num.$ext ]]; then
        echo "Creating thumbnail ..."
        convert -quiet -density 300 -quality 100 -thumbnail x1815 -background white -alpha remove "$file"[$page] "$path"/"$name"_$num.$ext
        else
            while [[ -e "$path"/"$name"_$num.$ext ]]; do
                (( num++ ))
            done
            echo "Creating thumbnail ..."
            convert -quiet -density 300 -quality 100 -thumbnail x1815 -background white -alpha remove "$file"[$page] "$path"/"$name"_$num.$ext
    fi

    while :
    do
        read -n 1 -s -p "Add watermark? [Y/n]" watermark
        case $watermark in
            ""|[yY] )
                echo ""
                echo "Adding watermark to thumbnail ..."
                convert -quiet "$path"/"$name"_$num.$ext "$mark" -gravity center -composite "$path"/"$name"_$num.$ext
                echo "DONE!"
                exit;
                ;;
            [nN] )
                echo ""
                echo "DONE!"
                exit;
                ;;
            * )
                echo ""
                echo "Use only 'y' or 'n' !"
        esac
    done
}

# start
echo ""
while :
do
    read -e -p "Path to PDF: " file
    if [[ -d "$file" ]]; then
        echo "'$file' is a directory"
        echo "Enter path to PDF File!"
    elif [[ -z "$file" ]]; then
            echo "Enter path to file!"
    elif [[ "$file" = /* ]]; then
        file=$(echo "$file" | tr -d "\\")
            break
        else
            echo "Enter FULL path!"
    fi
done

while :
do
    read -e -p "Page to be converted (leave blank for first): " page
    if [[ -n ${page//[0-9]/} ]]; then
        echo "Use numbers only!"
    elif [[ -z "$page" ]]; then
            page="0"
            break
        else
            break
    fi
done

while :
do
    read -e -p "Path to save: " path
    if [[ -f "$path" ]]; then
        echo "'$path' is file"
        echo "Enter path to save thumbnail into!"
    elif [[ -z "$path" ]]; then
            path='/path/to/your/folder'
            break
        else
            break
    fi
done

CONVERT

Ответы [ 3 ]

0 голосов
/ 08 февраля 2020

В Imagemagick вы можете пометить водяными знаками и миниатюрами несколько изображений или страниц одного изображения в одной командной строке, если вы хотите использовать то же имя вывода, что и имя ввода, и к ним добавлены числовые индексы. Чтобы сделать это, вы должны включить разделитель null: после ввода и использовать композитный -layers вместо просто -composite для создания водяных знаков.

Ввод:

enter image description here

Здесь я использую специальную внутреннюю розу Imagemagick: изображение для нанесения водяных знаков на второе и третье изображения в анимации ( или файл PDF, если хотите), а затем уменьшите его на 50%. Вы можете заменить розу любым подходящим image.suffix.

convert 3images.pdf[1,2] null: rose: -gravity center -compose over -layers composite -thumbnail 50% 3images_thumbs_%d.png


Результирующее 2 изображение:

3images_thumbs_1.png

enter image description here

3images_thumbs_2.png

enter image description here

0 голосов
/ 09 февраля 2020

Я наконец-то узнал, как это сделать!

    # set functions
CONVERT()
{
    num=0
    name=$(basename "$file" .pdf | cut -d- -f1 | sed 's/.$//' | tr ' ' '-')
    ext="png"
    mark='/path/to/the/watermark.png'
    for page in ${pages[*]}
        do
            if [[ ! -e "$path"/"$name"_$num.$ext ]]; then
                echo "Creating thumbnail ..."
                convert -quiet -density 300 -quality 100 -thumbnail x1815 -background white -alpha remove "$file"[$page] "$path"/"$name"_$num.$ext
                while :
                do
                    read -n 1 -s -p "Add watermark? [Y/n]" watermark
                    case $watermark in
                        ""|[yY] )
                            echo ""
                            echo "Adding watermark to thumbnail ..."
                            convert -quiet "$path"/"$name"_$num.$ext "$mark" -gravity center -composite "$path"/"$name"_$num.$ext
                            echo "DONE!"
                            break
                            ;;
                        [nN] )
                            echo ""
                            echo "DONE!"
                            break
                            ;;
                        * )
                            echo ""
                            echo "Use only 'y' or 'n' !"
                    esac
                done
            else
                while [[ -e "$path"/"$name"_$num.$ext ]]; do
                    (( num++ ))
                done
                echo "Creating thumbnail ..."
                convert -quiet -density 300 -quality 100 -thumbnail x1815 -background white -alpha remove "$file"[$page] "$path"/"$name"_$num.$ext
                while :
                do
                    read -n 1 -s -p "Add watermark? [Y/n]" watermark
                    case $watermark in
                        ""|[yY] )
                            echo ""
                            echo "Adding watermark to thumbnail ..."
                            convert -quiet "$path"/"$name"_$num.$ext "$mark" -gravity center -composite "$path"/"$name"_$num.$ext
                            echo "DONE!"
                            break
                            ;;
                        [nN] )
                            echo ""
                            echo "DONE!"
                            break
                            ;;
                        * )
                            echo ""
                            echo "Use only 'y' or 'n' !"
                    esac
                done
            fi
        done
}

# start
echo ""
while :
do
    read -e -p "Path to PDF: " file
    if [[ -d "$file" ]]; then
        echo "'$file' is a directory"
        echo "Enter path to PDF File!"
    elif [[ -z "$file" ]]; then
            echo "Enter path to file!"
    elif [[ "$file" = /* ]]; then
        file=$(echo "$file" | tr -d "\\")
            break
        else
            echo "Enter FULL path!"
    fi
done

while :
do
    read -e -p "Page to be converted (leave blank for first): " -a pages
    if [[ -z "$pages" ]]; then
            pages="0"
            break
        else
            break
    fi
done

while :
do
    read -e -p "Path to save: " path
    if [[ -f "$path" ]]; then
        echo "'$path' is file"
        echo "Enter path to save thumbnail into!"
    elif [[ -z "$path" ]]; then
            path='/path/of/your/choice'
            break
        else
            break
    fi
done

CONVERT

Это выглядит немного "грязно", но это работает! Если вы узнаете, как сделать код «чище», пожалуйста, дайте мне знать.

0 голосов
/ 08 февраля 2020

read имеет опцию -a для чтения в массив:

$ read -r -p 'Enter page numbers: ' -a pages
Enter page numbers: 1 2 3 4 5
$ declare -p pages
declare -a pages=([0]="1" [1]="2" [2]="3" [3]="4" [4]="5")
...