Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.

Сообщения - el guahiro

1
Готовясь к очередному (точнее первому в году) рывку в дебри нашей необъятной, т.е на объект строительства, нашёл у себя два скрипта для сжатия картинок (фоток, сканов) "на месте", без интернета, SMS и регистрации.
picture_SMALLER_2.5x.sh:
#! /bin/bash
#from el guahiro, USSR
IFS=$'\#'
for i in "$@" ; do convert  "$i" --strip -interlace Plane -gaussian-blur 0.05 -quality 85%  "$i".2 ; touch -r "$i" "$i".2 ; mv -v "$i".2 "$i" ; done | zenity --progress --width=400 --height=100 --title="Уменьшаю изображение" --text "работаю." --auto-close --pulsate;notify-send 'Готово!'
picture_SMALLER_4.5x.sh:
#! /bin/bash
#from el guahiro, USSR
IFS=$'\#'
for i in "$@" ; do convert  "$i" -filter Triangle -define filter:support=2 -unsharp 0.25x0.25+8+0.065 -dither None -posterize 136 -quality 50 -define jpeg:fancy-upsampling=off -define png:compression-filter=5 -define png:compression-level=9 -define png:compression-strategy=1 -define png:exclude-chunk=all -interlace none -colorspace sRGB -strip  "$i".2 ; touch -r "$i" "$i".2 ; mv -v "$i".2 "$i" ; done |zenity --progress --width=400 --height=100 --title="Уменьшаю изображение" --text "работаю." --auto-close --pulsate;notify-send 'Готово!'
Сжимают, соответственно в 2,5 и 4,5 раза. Пакетная обработка возможна.
Помогает, например, оперативно сжать фотоколлекцию, или чертежи в tiff.
Кто любит GUI, тот может воспользоваться утилитой IMAGINE, есть Appimage, т.е запустится в любой системе.

Засим прощаюсь. Искренне ваш, el
2
Действие ПКМ Thunar "PDF2DOCX".
Thunar custom action PDF2DOCX
Превращает в DOCX только PDF с текстовым слоем. Как создать в PDF этот самый текстовый слой (OCR в один клик) я писал чуть ранее в этой теме.
Команда:
pdftotext -q -nopgbrk -layout %n ; sed -i -r -z 's/--/-/g;s/-\n//g;s/[.]\n/&#/g;s/[;]\n/&#/g;s/[!]\n/&#/g;s/[?]\n/&#/g;s/^[0-9]/#&/g;s/\n/ /g;s/#/\n/g;s/--/-/g;s/  */ /g'  "$(basename -s .pdf %n)".txt ; sed -i -r 's/^[ \t]*//;s/[ \t]*$//;/^\s*$/d' "$(basename -s .pdf %n)".txt ; abiword --to=docx "$(basename -s .pdf %n)".txt; rm "$(basename -s .pdf %n)".txtЧтобы написать это, пришлось побороть исконно присущий человеку страх перед sed.
Команда работает очень быстро. Формирует абзацы автоматически.
Чтобы работало, необходимо установить pdftotext и abiword. В принципе, можно было написать команду и на Libreoffice, но тогда при  открытом в GUI Libreoffice скрипт не работает.
Услопия появления: галка на "Другие файлы", маска: *.pdf;*.PDF
Иконка любая.
Видео как это работает

Искркнне ваш, el
3
Цитата: xub от апреля 06, 2021, 06:17:47Часто приходилось превращать всё в обычный текст
Так я и пишу, что надо всё в обычный текст, потом txt превращаем в docx (или odt) с форматированием при конвертации прямо в консоли> потом чистка автозаменой> потом добрасываем картинки из PDF и таблички, распознанные через Free Online OCR>потом открываем и форматируем загловки>получаем файл, разбитый по нумерации и абзацы, с картинками и табличками. Когда умеешь, то превратить боршюру PDF в 20 листов в доклад формата docx (или odt) - полчаса с перекурами.
и да, в предыдущем посте я дал рецепт ручной чистки текста. Для автоматизации у el guahiro существует команда. Причешу - опубликую.

PS. С проблемами кодировки не сталкивался уже года два. Наверное потому, что допилил всё на уровне ОС.
4
Приводим в порядок текст, вставленный в документ из других программ.
Этот текст написан для продуктивной работы в Libreoffice. Необходим например студентам, чтобы скачанный в сети скан превратить в курсовую.
В моей же работе часто бывает так, что необходимо создать файл доклада или презентации Libreoffice, а в наши руки попал документ, форматирование в котором оставляют желать много лучшего - это либо документ, сконвертированный из MS Word в PDF, либо текст, скопированный из браузера с неподходящей нам разметкой, либо текстовый файл, переносы строк в котором отнюдь не обозначают новых абзацев. Либо это просто текст с распознанного скана с хорошим нужным  текстом.
Как вытаскивать текст из файлов PDF, неоднократно писалось на на этом форуме, в том числе в этой теме. Можно например открыть файл в MasterPdf Editor, Foxit Reader, Evince или Okular и скопировать текст, можно извлечь в командной строке с помощью различных утилит, например pdftotext.
Самым простым решением наверное было бы отправить PDF в Fine Reader. Но Fine Reader под Linux не работает и не собирается. Я отправлял в прошлом году в Fine Reader запрос, мне ответили что разработка под Linux не планируется. Можно купить программу InstallAble2ExtractPro у https://www.investintech.com/. Но она стоит 10 000 рублей на наши деньги, что не мало, если платить из своего кармана. К тому же у меня она в Xubuntuт18.04 не установилась, сказав про неразрешимые зависимости. Не больно то и хотелось.
В итоге аффтор этих строк озадачился автоматизацией процесса создания *.docx или *.odt из PDF, а заодно из *.txt и *.html. Для этого прибегнем к  исправлению текста с помощью функции libreoffice «Найти и Заменить».
Для начала необходимо удалить пробелы в начале и конце строк, заменив при помощи  диалога «Найти и заменить» «^[ \s]+|[ \s]+$» на пустое место. Иногда несколько раз, если пробелов много.
Далее, первая часть из изложенного материала от автора Roman Kuznetsov взята отсюда http://antilibreoffice.blogspot.com/2017/11/blog-post.html:
Замена множества пробелов идущих подряд на один:
a. В диалоге «Найти и заменить» в строку «Найти» вбиваем два пробела   #заменил оригинал от Roman Kuznetsov по результатам тестирования.
b. В строку «Заменить» вбиваем " *" (пробел и звезду без кавычек)
c. Далее раскрываем «Другие параметры» и отмечаем галочкой опцию «Регулярные выражения»
d. Нажимаем на кнопку «Заменить все».
Делаем раза два-три.
Замена знака разрыва строки на знак абзаца:
a. В диалоге «Найти и заменить» в строку «Найти» вбиваем \n
b. В строку «Заменить» также вбиваем \p
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
При обратной замене - поменять выражения
Замена нескольких подряд идущих знаков абзаца (пустые строки) на один знак абзаца:
a. В диалоге «Найти и заменить» в строку «Найти» вбиваем ^$
b. В строку «Заменить» ничего не вбиваем, оставляем её пустой.
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
-----------------
Далее рецепты от el guahiro.
1  Таблицы.
Таблицы хорошо распознаёт сервис Free Online OCR https://www.onlineocr.net/. Кушает не более одной странички за раз.
2  Текст.
Текст нам попадается двух видов: Нумерованные(маркированные) списки и Абзацы. Внутри одного абзаца или списка попадаются лишние знаки абзаца, и их надо убрать.
2.1  Нумерованные/маркированные списки
Выделяем список. В диалоге «Найти и заменить» ставим галку «Только текущее выделение»
a. Далее в диалоге «Найти и заменить» в строку «Найти» вбиваем \p\d
\d здесь обозначает - «любая цифра».
b. В строку «Заменить» вбиваем \n&
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
После этого внутри выделения элементы списка отделяются друг от друга принудительным разрывом строки.
Далее, не снимая выделения:
a. Далее в диалоге «Найти и заменить» в строку «Найти» вбиваем \p
b. В строку «Заменить» вбиваем пробел
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
Потом, не снимая выделения, меняем принудительный разрыв строки обратно на абзац:
a. В диалоге «Найти и заменить» в строку «Найти» вбиваем \n
b. В строку «Заменить» также вбиваем \p
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
Для макрированного списка приблизительно тот же алгоритм, только в строку «Найти» вбиваем \p и символ маркированного списка (кружочек, квадратик, галочка и т.п.)
2.2 Абзацы
Можно просто выделять абзацы, заменяя знак абзаца на пробел внутри него:
Выделяем абзац. В диалоге «Найти и заменить» ставим галку «Только текущее выделение»
a. Далее в диалоге «Найти и заменить» в строку «Найти» вбиваем \p
b. В строку «Заменить» вбиваем пробел
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
Потом переходим к следующему абзацу, десятому...сотому и т.д.
Но если текст большой, то на это уйдёт много времени. Поэтому способ второй - отделяем абзацы друг от друга по признаку: «точка+знак абзаца=конец абзаца». Можно этот способ использовать и для списков.
Выделяем блок абзацев, затем:
a. Далее в диалоге «Найти и заменить» в строку «Найти» вбиваем [.]\p
b. В строку «Заменить» вбиваем .\n
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
Аналогично сделать для [!] и [;]
Далее, не снимая выделения:
a. Далее в диалоге «Найти и заменить» в строку «Найти» вбиваем \p
b. В строку «Заменить» вбиваем пробел
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
Абзацы сгрупировались как надо, без лишних переносов строк.
Потом, не снимая выделения, меняем принудительный разрыв строки обратно на абзац:
a. В диалоге «Найти и заменить» в строку «Найти» вбиваем \n
b. В строку «Заменить» также вбиваем \p
c. «Регулярные выражения» также должны быть активированы
d. Нажимаем на кнопку «Заменить все».
Иногда надо ещё убрать табуляцию:
Найти: \t
Заменить на: - оставить пустое окошко

На этом всё, надеюсь, и уверен, многим поможет. Искренне ваш, el
5
Поскольку форум всё же про Xubuntu, указанный выше уважаемым qqq скрипт под Xubuntu будет иметь следующий вид:
#!/bin/bash
IFS=$'\#'
filename=$1

if [ "${filename##*.}" = "docx" ]; then
docx2txt < $filename |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi

if [ "${filename##*.}" = "odt" -o "${filename##*.}" = "ods" -o "${filename##*.}" = "odp" ]; then
odt2txt --width=80 $filename |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi

if [ "${filename##*.}" = "doc" ]; then
antiword -f -w 0 $filename |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi

if [ "${filename##*.}" = "rtf" -o "${filename##*.}" = "ppt" ]; then
catdoc $filename |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi

if [ "${filename##*.}" = "xls" ]; then
xls2csv $filename |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi

if [ "${filename##*.}" = "xlsx" ]; then
xlsx2csv $filename |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi

if [ "${filename##*.}" = "txt" -o "${filename##*.}" = "md" ]; then
cat $filename |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi

if [ "${filename##*.}" = "png" -o "${filename##*.}" = "jpg" ]; then
w3m $filename
fi

if [ "${filename##*.}" = "html" ]; then
html2text $filename |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi

if [ "${filename##*.}" = "pdf" ]; then
pdftotext -q -layout $filename - |less | sed '/\S/!d; s/  / /g;s/  / /g;s/  / /g; s/,,/ /g'
fi
Какие утилиты надо доставить, можно понять из команд. Измождённый за неделю обалдуями-проектировщиками el guahiro сделать этого уже не в силах. Как-нибудь сами.

Искренне ваш, el
6
Цитата: qqq от апреля 02, 2021, 14:02:23Вот что получилось:
Я бы добавил после less:
| sed '/\S/!d; s/  / /g;s/  / /g; s/  / /g; s/,,/ /g'так вывод будет компактней.
А так скрипт годный. Для некоторых ситуаций (например, когда открытие офисного файла в стандартном редакторе фиксируется  и нежелательно) даже очень.
Правда была раньше для предпросмотров уже программка, я о ней писал на этом форуме, называется  Gloobus , с 2013г не поддерживается, но может и сейчас запустится на Альтах, на Астре с её древней пакетной базой запустится точно...... 
Но велосипед мы / Вы изобрели хороший, с возможностью дальнейшего прогресса. :)
7
Цитата: qqq от марта 31, 2021, 15:23:45В моем примере - это doc, docx, odt.
Предлагаю расширить скрипт, взяв утилиты вывода содержимого файлов в терминал, основываясь на готовую наработку от el - скрипт ищи_pro2:
#!/bin/bash
# Created by el guahuro, elguahiro@gmail.com.
#This script performs a recursive search for the contents of files in all popular office formats.
echo -e "\n
Поиск слова во всех файлах этой папки, введите запрос \n
Результаты поиска по введенному далее запросу \n"
echo -e "\033[1m\033[38;5;11m"Чтобы открыть найденный файл, выдели название этого файла и закрой терминал"\033[0m"


echo -e "\033[37;1;41m  "СЛОВО:" \033[0m"
read response

find . -iname "*.doc" |
while read i ; do catdoc "$i" |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.docx" |
while read i ; do docx2txt < "$i" |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.xls" |
while read i ; do xls2csv "$i" |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.xlsx" |
while read i ; do xlsx2csv "$i" |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.pdf" |
while read i ; do pdftotext -q -layout "$i" - | less |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.odt" |
while read i ; do odt2txt "$i" |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.odp" |
while read i ; do odt2txt "$i" |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.ods" |
while read i ; do odt2txt "$i" |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.rtf" |
while read i ; do catdoc "$i" |
rg -i "$response" && echo -e "\033[37;1;41m  "$(realpath "$i")"\033[0m" ; done

find . -iname "*.csv" |
while read i ; do enconv "$i"; done

rg -i "$response"

echo -e "\033[1m\033[38;5;11m"Время поиска $SECONDS секунд"\033[0m"

Сей скрипт был написан аффтором в глубокой тоске по поводу отсутствия нормального полнотекстового поиска в Linux, ежедневно тестируется уже длительное время и показывает результаты, лучшие от аналогов. К тому же не требует индексации ФС.
Работа вариантов скрипта описана здесь и здесь
Видео по работе скрипта:
8
Распознавание скриншота экрана  (фрагмента экрана) "на лету" - с отправкой текста в буфер обмена.
Screenshot OCR "on the fly" - with sending the text to the clipboard
Делаем хоткей на команду (Настройки>Клавиатура>Комбинации клавиш):
bash -c 'xclip -selection clipboard -t image/png -o > /tmp/0.png ; mogrify -resize 400% -modulate 110,110,100 -median 1 -blur 0x0.4 -unsharp 0x12+2+0 -density 300 /tmp/0.png; tesseract /tmp/0.png /tmp/0 -l eng+rus --psm 6 &> /dev/null ; cat /tmp/0.txt | xsel -bi'Как использовать:
1. Делаем скриншот любым доступным способом
2. Нажимаем хоткей, который мы назначили на команду
3. В буфере обмена через секунду-другую появляется распознанный текст со скриншота.

Должно быть установлено: imagemagick, tesseract с языковыми пакетами; xclip

Думаю многим пригодится.

Искренне ваш, el
9
Цитата: qqq от марта 29, 2021, 10:03:51Не получается из docx2txt направлять выхлоп в терминал
В мане утилиты есть замечание про перенаправление. Прочитав его, с учётом ограничений Thunar пишем скрипт docx2term.sh:
#!/bin/bash
IFS=$'\#'
for i in $@;  do docx2txt < "$i" ; done
done
Потом создаём действие ПКМ Thunar на команду:
xfce4-terminal -H -e "docx2term.sh %n"
Условие появления: Другие, *.docx
10
Превратности российского капитализма. В то время, когда многие мои коллеги находится без работы, тех кто работает, в частности меня, грузят до физического предела. В воскресенье - сижу, разбираю чертежи по новому объекту. Понимаю, что что разработчики проектной документации не профессионалы (с моей точки зрения). У меня критерий такой: Если направляют чертежи, конвертированные с DWG или любого другого цифрового формата то нормально - парни экономит бумагу и рабочее время своего персонала. Если приходят чертежи в виде сканов ранее распечатанных на бумаге - это не профессионалы, так как не экономят  бумагу и рабочее время своего персонала. Заодно не экономят моё время, т.к. чтобы писать отзывы и цитировать, приходится не копировать, а перепечатывать текст, а это уже лишнее время.
Наконец, дойдя до белого каления, пытаюсь написать команду на  хоткей. Задумка такая: скопировать часть текста в буфер обмена> из буфера обмена передать в tesseract> полученный текст передать обратно в буфер обмена. Возможно, с использованием промежуточных конструкций типа:
xclip -sel clip -o > /tmp/1.jpg
Но время поджимает. Пока придумал копировать и вставлять в поиск Яндекс-картинок. Сервис при этом распознаёт clipboard. Но это не по-линуксовому и зависишь от интернета, а он не везде на объектах есть, особенно на новых и отдалённых.
С ходу написать  команду на  хоткей не получается. Вопрос к xub и остальным знатокам, есть какие-то идеи?
11
Цитата: qqq от марта 26, 2021, 08:43:35Хочу сделать просмотр odt файлов из thunar'a.
Команда:
xfce4-terminal -H -e   "odt2txt %n"Маска: Другие, *.odt
файл открывается в терминале.
Можно реализовать для прочтения всех популярных типов файлов через while и утилиты, открывающие эти mimetypes в терминале.

Если получится, выпейте за моё здоровье. Выходные же!

PS. Дельная затея. Быстрее просматривать получается, особенно наверное для слабых машин. Браво, qqq!
12
О пользе находчивости. Для инженеров.
Cut an image into 3 parts using Imagemagick
Прислали на отдалённый объект альбом чертежей трасс коммуникаций, сплошняком состоящий из чертежей формата 3×A3. Плоттера, естественно, на объекте строительства нет, но есть принтер формата А3. Выход один - порезать все чертежи на три части, под формат А3, затем склеить.
Я как-то писал на этом форуме о о команде Imagemagick для разрезки чертежей, типа такой:
convert -crop 50%x100%  *.jpg  %d.png; rm *.jpg;convert -page 2482x1755  *.png output.pdf;rm *.pngНо это чтобы порезать на 2 части. Три части это 33,333...%x100%. Но увы, Imagemagick нецелых  процентов в такой команде не понимает.
Как всегда, - лезу в интернет, чтобы почерпнуть мудрость с англоязычных сайтов. Натыкаюсь на очень замудреную дискуссию, которая затрагивает высшую математику и глубинные настройки Imagemagick. Образования мне для понимания данной дискуссии не хватает (высшую математику я изучал почти 40 лет назад), поэтому придумываю, что попроще:
Сто процентов Imagemagick без труда делит так: 100%=33%+33%+33%+1%. Одинаково успешно Imagemagick прибавляет к любому изображению поле в 1% ширины. Исходя из этого пишу скрипт под названием split_mage_into_3_parts.sh:
#! /bin/bash
IFS=$'\#'
for i in "$@" ; do convert  -append -background white -gravity west -extent 101%x100% "$i" tmp"$i" ; convert -crop 33%x100% tmp"$i" ./%d_"$i" ; rm  tmp"$i" ; rm 3_"$i" ; done
Потом делаю ПКМ  Thunar под названием "Разделить картинки на 3 части" с командой:
split_mage_into_3_parts.sh %N
Условия появления: Изображения
Иконка: Любая
Теперь можно спокойно в графическом интерфейсе резать любой чертеж ровно на 3 части.
Примечание:
Во всех в скриптах я стараюсь, чтобы утилита Imagemagick работала с изображениями (jpg,png) - по причине политики авторов Imagemagick и по причине того, что с PDF Imagemagick работает не очень корректно - портит качество. Поэтому чертежи  PDF перед разрезкой необходимо разобрать на картинки, а после разрезки опять собрать всё в PDF. Соответствующие ПКМ Thunar в моём арсенале имеются, основаны они отнюдь не на convert, а на других утилитах, и работают быстрее.
В итоге чертежи все я порезал много быстрее, чем писал этот пост, хотя писал его с помощью голосового ввода speechnotes.

Думаю, что кому-то пригодится...
Засим прощаюсь. Искренне ваш, el
13
ПКМ Thunar "Отправить симлинк"
ПКМ отправляет симлинк в любое место файловой системы через GUI. Лишена "родовых пятен" штатного действия ПКМ Thunar "Отправить на рабочий стол" - при изменении родительской директории файла симлинк работает, битым не становится.
Команда:
ln -s "$(realpath %f)" "$(zenity --file-selection --directory --title="Выбери папку")"Должна быть установлена утилита zenity
Условия появления: галки ставим везде
Иконка - любая
14
Файл, пж сбросьте.
по идее llpp должно всё открывать.
Репозиторий https://launchpad.net/~alex-p/+archive/ubuntu/llpp
15
Цитата: xub от марта 21, 2021, 15:11:55Просто такие команды где-то должны быть записаны и должна также быть навигация по их поиску. У меня это сделано в простом текстовом файле..
Профессор, я думал, что Вы знаете Textlines Indicator - выпадающий аплет на панели, именно для таких целей. Очень рекомендую

Цитата: xub от марта 21, 2021, 15:11:55перемещение выбранного для удаления для инспекции дабы не удалить чего лишнего ...
Для инспекции - либо затереть, либо в зашифрованный архив, либо зашифровать с помощью nc, либо иезуитский метод - переименовать рекурсивно файлы pdf в рdf (первая буква расширения - русская р => файлы в Винде не читаются).