Автовыравнивание криво отсканированных и многостраничных PDF в Linux.Пригодится для фрилансеров на обработке сканов, студентам, инженерам, юристам и т.п. - всем, кто массово работает с документами в формате PDF.
Всплывающее окно выбора между двумя способами основано на скрипте (все скрипты у меня в ~./local/bin). Скрипт correct_screw_PDF_2_methods.sh такого содержания:
#!/bin/bash
IFS=$'\#'
OPTION1=$(zenity --list --radiolist --width 700 --height 300\
--title="Исправляем поворот страниц PDF" \
--text="Выберите способ" \
--column="Отметка выбора" --column="способ" \
TRUE "Python" FALSE "Unpaper")
if [ "$OPTION1" = "Python" ] ; then OPTION=correct_skew_pdf.sh ;
else OPTION=rovny_pdf2.sh ; fi
myArray=( "$@" )
for i in "$@"; do
"$OPTION" "$i" ; done
exit
fi)
Автовыравнивание на базе утилиты Unpaper основано на скрипте rovny_pdf2.sh такого содержания:
#!/bin/bash
IFS=$'\#'
for a in "$@" ; do
cp "$a" /tmp/"$a"
cd /tmp
pdftoppm -jpeg "$a" 1 | zenity --progress --width=400 --height=100 --title="Выравниваю PDF" --text "работаю." --auto-close --pulsate;
done
convert 1-*.jpg %02d.pnm
rm 1-*.jpg
for i in *.pnm ; do unpaper -v --deskew-scan-deviation 3.0 -dd 1.0 --dpi 600 "$i" "$i".pnm; mv -v "$i".pnm "$i"
done
img2pdf -o $OLDPWD/rovny.pdf -S A4 --auto-orient *.pnm
mv $OLDPWD/rovny.pdf "$a"
rm /tmp/*.pnm
Для работы этого скрипта надо установить утилиту pdftoppm, unpaper и zenity, которые есть в репозитории xUbuntu 18.04. Утилита Imagemagick (команда convert) в xUbuntu 18.04 предустановлена.
Можно использовать скрипт rovny_pdf.sh, т.к. он основан на более стандартных утилитах:
#!/bin/bash
IFS=$'\#'
for a in "$@" ; do
cp "$a" /tmp/"$a"
cd /tmp
pdftoppm -jpeg "$a" 1 | zenity --progress --width=400 --height=100 --title="Выравниваю PDF" --text "работаю." --auto-close --pulsate;
done
convert 1-*.jpg %02d.pnm
rm 1-*.jpg
for i in *.pnm ; do unpaper -v --deskew-scan-deviation 3.0 -dd 1.0 "$i" "$i".pnm; mv -v "$i".pnm "$i"
done
convert *.pnm $OLDPWD/rovny.pdf
mv $OLDPWD/rovny.pdf "$a"
rm /tmp/*.pnm
-------------
Чтобы сделать автоповорот на Python (OpenCV) надо два скрипта.
Сводный correct_skew_pdf.sh имеет содержание:
#!/bin/bash
IFS=$'\#'
for f in $@; do pdftoppm -png "$f" /tmp/1 ;
done
for i in /tmp/1*.png ; do python /home/user/.local/bin/correct_skew.py -i "$i" ; mv rotated.png "$i"
done
convert /tmp/1*.png "$f"
rm /tmp/1*.png
Скрипт correct_skew.py, который я, подсмотрев
здесь, чуть доработал, можно скачать или посмотреть по ссылке
https://cloud.mail.ru/public/Hqrs/57KN599yT, имеет такое содержание:
# import the necessary packages
import numpy as np
import argparse
import cv2
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True,
help="path to input image file")
args = vars(ap.parse_args())
# load the image from disk
image = cv2.imread(args["image"])
# convert the image to grayscale and flip the foreground
# and background to ensure foreground is now "white" and
# the background is "black"
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.bitwise_not(gray)
# threshold the image, setting all foreground pixels to
# 255 and all background pixels to 0
thresh = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
# grab the (x, y) coordinates of all pixel values that
# are greater than zero, then use these coordinates to
# compute a rotated bounding box that contains all
# coordinates
coords = np.column_stack(np.where(thresh > 0))
angle = cv2.minAreaRect(coords)[-1]
# the `cv2.minAreaRect` function returns values in the
# range [-90, 0); as the rectangle rotates clockwise the
# returned angle trends to 0 -- in this special case we
# need to add 90 degrees to the angle
if angle < -45:
angle = -(90 + angle)
# otherwise, just take the inverse of the angle to make
# it positive
else:
angle = -angle
# rotate the image to deskew it
(h, w) = image.shape[:2]
center = (w // 2, h // 2)
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, (w, h),
flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
# show the output image
cv2.imwrite("rotated.png", rotated)
cv2.waitKey(0)
----------
Все скрипты, чтобы это работало, бросаем в $PATР, нп в ~./local/bin
Видео, как это работает:
https://youtu.be/0t0AYb6LlUI
Пользователь добавил сообщение 09 Мая 2020, 10:34:38:
Сшить панораму в один клик за 10 секундStitch a panorama in one click in 10 secondsДействие ПКМ по склейке панорам.
Действие основано на программке OpenPano
отюда, лицензированного опенсорсной
MIT лицензией.
На сайте автора есть толковая инструкция, что делать. Качаю архив по ссылке с
сайта автора, распаковываю, доустанавливаю Python-модули, компилирую программку, потом бросаю готовый архив в домашнюю директорию и делаю ПКМ Thunar на команду:
cp /$HOME/OpenPano-master/src/config.cfg "$PWD" ; image-stitching %F | zenity --progress --width=300 --height=100 --title="Сшиваю панораму" --text "...надо было ровней камеру держать!" --auto-close --pulsate; touch -r %f out.jpg ; mv out.jpg pano_%n && rm config.cfg
Условие появления: Изображения, каталоги
Иконка: Любая.
Перед этим надо отправить исполняеммый файл в директорию, где у вас находятся исполняемые файлы, командой:
ln -s /home/ВАш_user/OpenPano-master/build/src/image-stitching $HOME/.local/bin
И да, надо доставить из репов zenity. Можно обойтись и без zenity, но тогда будет чуть менее интерактивно, а команда будет выглядеть так:
cp /$HOME/OpenPano-master/src/config.cfg "$PWD" ; image-stitching %F ; touch -r %f out.jpg ; mv out.jpg pano_%n && rm config.cfg
Теперь, при выделении группы картинок и нажатии ПКМ "Сшить панораму" через двадцать-тридцать секунд в текущей директории появляется сшитая панорама со временем создания, как у группы исходных фото, что важно для организации коллекции фотографий например в Google Photo.
Ссылка на архив с уже скомпилированной под Xubuntu 18 программой:
https://mega.nz/#!MBoURIyB!ccTQ8koTK73g062tDuLwlG1Gs80rpjArmJsrYL6V104Вы скажете: "El guahiro, ведь есть же в камерах смартфонов встроенная функция съёмки панорамы!"
Отвечу: Да, есть. И неплохо снимает. Но попробуйте снять панораму ночью. Я в таких случаях включаю режим "Ночь" на смартфоне, а потом сшиваю снимки в панораму с помощью image-stitching.
Вот например, фото вечером (снимал "с руки": смартфон берёшь двумя руками, ставишь максимально близко к себе, локти прижимаеть в рёбрам, чтоб обзор "не болтался", поворачиваешься на пяточках, всем телом, делая примерно 6 кадров на 180 градусов обзора, всегда делаешь 2 серии снимков для панорамы ):
А вот фото, снятое ночью, на жд станции, где и освещения нормального то нет:
P.S. Скрипт сшивки панорамы и все команды прекрасно работают и для других типов файлов: *.png, *.jpeg, даже *.webp.
Пользователь добавил сообщение 09 Мая 2020, 12:09:12:
ПКМ Thunar для сжатия офисных файлов большого размераLarge office files 10x compressionПричина написания ПКМ - присылают по внешней почте файлы *.docx;*.doc;*.DOCX;*.DOC;*.ODT;*.odt весом 15+ mb. Файлы эти медленно открываются в Libreoffice и не пролазят через корпоративную почту, где установлено ограничение размера вложений. И если в операционной системе Windows в M$ Office имеется встроенный инструмент сжатия офисных файлов, то в Linux такого инструмента нет. Исправляем эту ошибку.
Делаем действие ПКМ Thunar под названием " Сжать офисный файл" на команду:
bash -c "source compressDocODT.sh %f"
Условие появления: Другие,
Маска файлов: *.docx;*.doc;*.DOCX;*.DOC;*.ODT;*.odt
Иконка - любая, но лучше значок libreoffice, не ошибетесь.
Скрипт source compressDocODT.sh имеет содержание:
#!/bin/bash
# to convert doc 2 odt : libreoffice --headless --convert-to odt file.doc
IFS=$'\n'
for i in "$@";
do libreoffice --headless --convert-to odt "$i"
done
mv "${i%.*}.odt" "${i%.*}.zip"
unzip "${i%.*}.zip" -d "${i%.*}"
mogrify -resize 500x500 "${i%.*}"/Pictures/*
cd "${i%.*}"
zip -r "${i%.*}.zip" ./*
cd ../
mv "${i%.*}.zip" "${i%.*}.odt"
unoconv --format=doc "${i%.*}.odt"
rm -R "${i%.*}"
if [ -f "${i%.*}.doc" ]; then
rm "${i%.*}.odt"
fi
if [ -f "${i%.*}.DOC" ]; then
rm "${i%.*}.odt"
fi
if [ -f "${i%.*}.docx" ]; then
rm "${i%.*}.odt"
fi
if [ -f "${i%.*}.DOCX" ]; then
rm "${i%.*}.odt"
fi
Пользователь добавил сообщение 09 Мая 2020, 12:22:09:
Использование расширенных атрибутов файлов в Xubuntu (в том числе поиск файлов, содержащих расширенный пользовательский атрибут (метку, тэг) в каталоге по конкретному слову)
Чтобы пользоваться расширенными атрибутами файлов: добавлять их к файлу или каталогу, просматривать метки, запускать программы по скрытой метке, удалять атрибут.
Для этой цели я создал три действия ПКМ Thunar. Но размер экрана моего ноутбука (по вертикали) не безграничен, поэтому создаю четыре (+1 финальный) скрипта, чтобы реализовать все функции в
одном действии ПКМ Thunar. Все эти скрипты кидаем в директорию, где хранятся исполняемые файлы, например в ~/.local/bin.
1. скрипт add_hiddennote2file.sh:
#!/bin/bash
IFS=$'\n'
for i in "$@";
do attr=`zenity --entry --title="добавить скрытую заметку к файлу" --text="Введите текст заметки, например" --entry-text="от Иванова $(date +%x) "`
setfattr -n user.info -v $attr "$i"
notify-send "Описание добавлено"
done
2. скрипт view_hiddennote.sh:
#!/bin/bash
IFS=$'\#'
for i in "$@"
do notify-send -t 30000 ' ' "`getfattr --only-values "$i"`"
done
3. скрипт delete_hiddennote.sh:
#!/bin/bash
IFS=$'\#'
for i in "$@"
do setfattr -x user.info "$i"; notify-send 'Описание удалено'
done
4. скрипт execute_tag.sh:
IFS=$'\#'
for i in "$@"
do xdg-open "`getfattr --only-values "$i"`"
done
Суммирующий скрипт multi_tag.sh объединяет все эти действия в одно:
#!/bin/bash
OPTION1=$(zenity --list --radiolist --width 500 --height 300\
--title="Операции с тэгами" \
--text="Выберите способ" \
--column="Отметка выбора" --column="действие" \
TRUE "Добавить описание к файлу" FALSE "Удалить описание к файлу" FALSE "Показать описание к файлу" FALSE "Выполнить тэг")
if [ "$OPTION1" = "Добавить описание к файлу" ] ; then OPTION=add_hiddennote2file.sh;
else OPTION=delete_hiddennote.sh; fi
if [ "$OPTION1" = "Показать описание к файлу" ] ; then OPTION=view_hiddennote.sh; fi
if [ "$OPTION1" = "Выполнить тэг" ] ; then OPTION=execute_tag.sh; fi
myArray=( "$@" )
for i in "$@"; do
"$OPTION" "$i" ; done
exit
fi)
Потом создаю ПКМ Thunat под названием "Тэги".
Команда:
multi_tag.sh %f
Условия появления: ставим галки везде.
иконка - любая.
Как выглядит работа этого ПКМ - см. видео в конце этого поста.
Теперь вопрос - если мы наделали тегов системе, то как их потом искать?
Реализуется это достаточно легко. Пишем очередной скрип под названием где_скрытые_аттрибуты:
#!/bin/bash
echo -e "\n
Привет! Я найду для тебя расположение файлов со скрытыми атрибутами в этой папке. \n
Если понял, о чём я, напиши здесь - что ищешь \n"
read response
find . -iname "*" |
while read i; do getfattr --only-values "$i" |
grep --color=auto -iH --label="$i" "$response"
done
Создаю ПКМ Thunar под названием "Поиск скрытых атрибутов в папке".
Команда:
xfce4-terminal -H -e "bash -c 'где_скрытые_аттрибуты %f ; exec bash'"
Условия появления: ставим галку на Каталоги
Иконка: любая
Как выглядит работа со скрытыми аттрибутами по этим ПКМ Thunar - в этом видео:
https://youtu.be/V-p5541E6Iw