Лучший способ, который я там нашел, без потери качества, убирает тени, шумы,текст со следующей страницы просвечивается и т.д.:
Сначала конвертируйте pdf в отдельные изображения
pdfimages combined_ocr.pdf page
Во-вторых, удалить тени, шум, текст со следующей страницы, истекающие кровью через (кредиты в этот блог)
ls./p*.ppm | xargs -L1 -I {} convert {} -quality 100 -density 300 -fill white -fuzz 80% +opaque "#000000" {}.jpg
это можно добавить либо как дополнительный -шаг, либо вместо приведенной выше команды, чтобы фактически получить только два цвета:
ls./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg
50 -60% процентов fuzz
менее агрессивен и дает более читаемые результаты:
ls./p*.ppm | xargs -L1 -I {} convert {} +dither -colors 2 -type bilevel -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg
Это делается для создания pdf-файла из каждого jpg-изображения без потери разрешения или качества:
ls -1./*jpg | xargs -L1 -I {} img2pdf {} -o {}.pdf
Это позволяет объединить страницы PDF в одну:
pdftk *.pdf cat output combined.pdf
И, наконец, я добавляю текстовый слой с OCR, который не меняет качество сканирования в PDF-файлах, чтобы их можно было найти:
pypdfocr combined.pdf
Следующая строка не имеет смысла:
PRINT=$("ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG} of ${MON}, ${YEAR}")
синтаксис $(...)
предназначен для подстановки команды , поэтому bash
пытается выполнить:
ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG} of ${MON}, ${YEAR}
как команду.
Вместо этого вы могли бы:
PRINT
в строку:PRINT="ipy.log was cleared at ${TIMESTAMP} on ${WEEKDAY} the ${DAY}${TAG} of ${MON}, ${YEAR}"
echo
строка на терминал:echo "$PRINT"
echo
строка в файл:echo "$PRINT" > ~/ipy.log
Присвоение PREV
не работало должным образом, поскольку ~/days.log
был бы существующим, но пустым файлом из-за ошибки:
${WEEKDAY} > ~/days.log
что должно было быть:
echo "$WEEKDAY" > ~/days.log
Здесь немного другой подход:
# This function clears ipy.log every seven or more days
function clear_ipylog() {
typeset -i prev yearmday dif
typeset tag timedate message
typeset -g marker
# read -r prev <"$HOME/days.log" # Should work instead of awk as days.log should only contain '%Y%m%d'
prev=$(awk '/./{line=$0} END{print line}' "$HOME/days.log")
echo $prev >&2
yearmday=$(date '+%Y%m%d')
echo $yearmday >&2
dif=$((yearmday-prev))
if [ $dif -gt 6 ]; then
case ${yearmday:6:2} in
(01) tag='st' ;;
(02) tag='nd' ;;
(03) tag='rd' ;;
(*) tag='th' ;;
esac
timedate=$(date '+%H:%M:%S %F%b')
message=$(printf '%s %d%s\n' "ipy.log was cleared at ${timedate:0:19}, the" \
"${yearmday:6:2}" "$tag of ${timedate:19} ${yearmday:0:4}")
echo "$message" > "$HOME/ipy.log"
echo "$message" >&2
echo $yearmday > "$HOME/days.log"
marker='true'
else
echo "It has been $dif days since your last write, no need to clear logs"
marker='false'
fi
}
clear_ipylog
$prev
, $dif
и т. д. устанавливались как глобальные переменные $marker
, поэтому предположим, что вы хотите установить его как глобальную переменную ~/.bash_profile
,~/.bashrc
читаются непосредственно bash
, поэтому не следует начинать со строки #!/bin/sh
или устанавливать исполняемый режим ~/days.log
устаревшим, изменив формат первой строки ~/ipy.log
, чтобы prev
можно было взять из первой строки/поля ipy.log
В строке 15 вы:
WEEKDAY=$(date '+%Y%m%d')
Таким образом, WEEKDAY == "20200216" или аналогичный. В строке 41 вы:
${WEEKDAY} > ~/days.log
, который заменит ${WEEKDAY}
на «20200216». В bash первая строка, которую вы даете, всегда является командой (, за исключением :ключевых слов, назначений и других вещей, но вы можете забыть об этом на данный момент ). Так что bash
попытается казнить:
20200216
которого не существует. Вы наверное хотели написать:
echo "${WEEKDAY}" > ~/days.log
вместо этого.
Поскольку вы используете арифметическую операцию в строке 20 "DIF=$ ((WEEKDAY -PREV ))", я думаю, что лучше всего будет, если строка 22 будет читать:
22 if [ ${DIF} -gt 6 ]; then
Кроме того, как ранее указывал Томаш Поспишек, строка 40, а также 41 нуждаются в команде перед переменными и, следовательно, должны читаться
40 echo "${PRINT}" > ~/ipy.log
41 echo "${WEEKDAY}" > ~/days.log