ImageMagick: emulate the effect of a scanned document

Делаем эффект ксерокса

Fullstack CTO
2 min readFeb 1, 2022

Суть задачи: иногда просят прислать скан документа, причем по сути принципиально он не будет отличаться от документа, на который наложил фото подписи и печати. Порой бюррократия у некоторых зашкаливает. Я за то, чтобы экономить бумагу и вообще переходить на ЭДО (электронный документоборот). Но все же, некоторым очень важно чтобы документ был именно отсканирован.

Я делал такие документы через Photoshop, до тех пор пока не заколебался. В итоге я наваял для себя простой bash скрипт, который берет цветной оригинал в PDF и на выходе генерирует PDF с эффектом буд-то бы это факс или ксерокопия.

Выглядит очень даже натурально.

Файл scan.sh

#!/usr/bin/env bash

f=$1

# конвертируем PDF в JPG и делаем черно-белым
convert -verbose -density 300 -trim "$f" -background white -flatten -quality 100 -type Grayscale step-1.jpg

# Накладываем прозрачную картинку - эффект шумов и помех от ксерокса
convert -verbose step-1.jpg fg.png -composite step-2.png

# Рандомно поворачиваем на небольшой угол, буд-то бы документ криво лежал в сканере
angle=$[ RANDOM % 4 + 1 ]
echo "ANGLE=$angle"
convert -verbose step-2.png -background '#000000' -rotate 0.$angle step-2.jpg


# Обратно превращаем картинку в PDF
newfile="${f%%.pdf}-scan.pdf"
convert -verbose step-2.jpg "$newfile"

# эта строчка для MacOS, позволяет сразу увидеть результат
open "$newfile"

# чистим за собой от временных файлов
rm -v step-1.jpg step-2.jpg step-2.png

В случае с мультидокументами скрипт нужно немного переписать:

Файл scan.sh

#!/usr/bin/env bashf=$1
convert -verbose -density 300 "$f" -background white -alpha remove -alpha off -quality 100 -type Grayscale s1-%01d.jpg
# convert -verbose -density 300 -trim "$f" -background white -flatten -quality 100 -type Grayscale s1.jpg
i=0
for p in $(ls s1-*.jpg)
do
convert -verbose "s1-$i.jpg" fg.png -composite "s2-$i.jpg"
rm "s1-$i.jpg"
angle=$[ RANDOM % 5 + 1 ]
negative=$[ RNADOM %2 ]
numsign=""
[[ $negative > 0 ]] && numsign="-"
echo "ANGLE=$angle"
convert -verbose s2-$i.jpg -background '#000000' -rotate "${numsign}0.${angle}" "s2-$i.jpg" ((i=i+1))
done
newfile="${f%%.pdf}-scan.pdf"
convert "s2-*.jpg" -quality 100 "$newfile"
open "$newfile"rm -v s2-*.jpg

Теперь можно конвертировать мультидокументы.

💬 Обсуждение

--

--

Fullstack CTO
Fullstack CTO

Written by Fullstack CTO

CTO and co-founder at NEWHR & Geekjob

No responses yet