Автоматизация пережатия pdf файлов

Задача: есть некоя файловая помойка, размер которой вырос до неприличных размеров. Необходимо pdf файлы пережать до «еле читабельного» состояния.

Решение: напишем соответствующий скрипт на Bash

#! /bin/bash
from='2025-01-15'
to='2025-01-17'

find ~/wedwewe -type f -newermt "$from" ! -newermt "$to" -name "*.pdf" | while read fname; do
  echo "-compress: $fname"
  gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=res.pdf "$fname"
  if [ $? -eq 0 ]; then
    echo OK
    mv res.pdf "$fname"
  else
    echo FAIL
  fi
done

Что делает этот скрипт? А просто ищет все файлы созданные в указанном диапазоне дат. Далее последовательно пытается пережать каждый файл, и если это происходит успешно, то заменяет оригинал на получившийся пережатый файл. Опции dPDFSETTINGS:

/screen Более низкое качество и меньший размер. (72 т/д)
/ebook Лучшее качество, но чуть больший размер (150 dpi)
/prepress Вывод имеет более высокий размер и качество (300 dpi)
/printer Качество вывода подходит для принтерной печати (300 dpi)
/default Выбирает вывод, который подходит для нескольких целей, однако может создавать большие PDF-файлы.

Update: со временем скрипт чуть изменился. А именно добавил проверку «а помогло ли сжатие». Если эффекта нет, то и не заменяем пережатый файл

#! /bin/bash
from='2025-01-13'
to='2025-01-17'

find ~/shwedwed -type f -newermt "$from" ! -newermt "$to" -name "*.pdf" | while read fname; do
  echo "-compress: $fname"
  gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray -dNOPAUSE -dQUIET -dBATCH -sOutputFile=res.pdf "$fname"
  if [ $? -eq 0 ]; then
    echo OK
    size_before=$(wc -c <"$fname")
    size_after=$(wc -c <"res.pdf")
    if [[ $size_before -gt $size_after ]]
	then 
	    echo "-результат сжатия хороший. Заменяем файл..."
	    mv res.pdf "$fname"
	else 
	    echo "-сжатие не удачное, пропускаем.."
    fi
  else
    echo FAIL
  fi
done

Печать на принтере TSC-210 из консоли

В ходе эксплуатации принтера этикеток TSC-210 в среде 1С под Linux выявилась особенность, что он не выдерживает правильные отступы при печати, даже при установке нужных параметров бумаги. Выходом явилось сохранение печати в файл, а затем печать полученного файла при помощи просто скрипта вида:

#!/usr/bin/sh
lpr -P цув-tsc210-03 -o portrait -o media=Custom.58x28mm -o page-top=5 -o page-bottom=1 -o page-left=1 -o page-right=1 -o page-border=none ~/Документы/вывод.ps

Яндекс OCR: разметка данных

В ходе использования облака Yandex OCR для распознавания данных, выявилось что при анализе получаемого на выходе JSON, очень не достаёт визуализации полученных данных. Для того чтобы эту ситуацию чуть улучшить, написал скриптик, который на входе получает картинку для распознавания и JSON полученный от Яндекса, а на выходе выдаёт картинку с нанесенными распознанными блоками и таблицами.

Собственно код:

<?php
$res=json_decode(file_get_contents("res.json"));  // прочитаем json
$source = imagecreatefromjpeg ("pdfs/11-1.jpg");
$pink = imagecolorallocate($source, 255, 105, 180);
$white = imagecolorallocate($source, 255, 255, 255);
$green = imagecolorallocate($source, 132, 135, 28);
$blue = imagecolorallocate($source, 0, 0, 255);

// размечаю блоки
$bl=0;
foreach ($res->result->textAnnotation->blocks as $block) {    
    $kof=1.5;
    $points=[];
    $points[]=$block->boundingBox->vertices[0]->x*$kof;
    $points[]=$block->boundingBox->vertices[0]->y*$kof;
    $points[]=$block->boundingBox->vertices[1]->x*$kof;
    $points[]=$block->boundingBox->vertices[1]->y*$kof;
    $points[]=$block->boundingBox->vertices[2]->x*$kof;
    $points[]=$block->boundingBox->vertices[2]->y*$kof;
    $points[]=$block->boundingBox->vertices[3]->x*$kof;
    $points[]=$block->boundingBox->vertices[3]->y*$kof;
    $points[]=$block->boundingBox->vertices[0]->x*$kof;
    $points[]=$block->boundingBox->vertices[0]->y*$kof;    
    imagepolygon($source,$points,$green);
    imagettftext($source,20,0,$points[0],$points[1],$green,"/usr/share/fonts/truetype/r7-office/ext/PTS55F.ttf",$bl);
    $bl++;
};

//размечаю таблицы
$bl=0;
foreach ($res->result->textAnnotation->tables as $table) {    
    $kof=2.1;
    $offset_x=110;
    $offset_y=10;
    $points=[];
    $points[]=$table->boundingBox->vertices[0]->x*$kof+$offset_x;
    $points[]=$table->boundingBox->vertices[0]->y*$kof+$offset_y;
    $points[]=$table->boundingBox->vertices[1]->x*$kof+$offset_x;
    $points[]=$table->boundingBox->vertices[1]->y*$kof+$offset_y;
    $points[]=$table->boundingBox->vertices[2]->x*$kof+$offset_x;
    $points[]=$table->boundingBox->vertices[2]->y*$kof+$offset_y;
    $points[]=$table->boundingBox->vertices[3]->x*$kof+$offset_x;
    $points[]=$table->boundingBox->vertices[3]->y*$kof+$offset_y;
    $points[]=$table->boundingBox->vertices[0]->x*$kof+$offset_x;
    $points[]=$table->boundingBox->vertices[0]->y*$kof+$offset_y;    
    imagepolygon($source,$points,$blue);
    imagettftext($source,20,0,$points[0],$points[1],$blue,"/usr/share/fonts/truetype/r7-office/ext/PTS55F.ttf",$bl);
    $bl++;
    
}
imagejpeg($source, 'out.jpg');

Получаем картинку вида:

разметка на основе Yandex.ocr

GitItea: does not appear to be a git repository

Как оказалось такая совершенно не очевидная ошибка показывается (помимо варианта что и на самом деле вы напутали с URL репозитария) и когда что-то случилось с вашим открытым SSH ключём. Соответственно достаточно сгенерировать новый:

ssh-keygen -t ed25519 -C "your_email@example.com"

А затем добавить содержимое файла ~/.ssh/id_ed25519.pub в админке GitItea в раздел «Ключи SSH»

Chromedriver устаревших версий

До версии 114 включительно, драйвера для тестирования можно было скачать по ссылке http://chromedriver.storage.googleapis.com/index.html Но с версии 115 и выше, гугл стал в открытом виде выкладывать chromedriver только для последних актуальных версий своего браузера. Тем не менее скачать вебдрайвер для «Устаревших» версий браузера остаётся возможным, но несколько надуманным способом.

  1. Открыть ссылку вида https://googlechromelabs.github.io/chrome-for-testing/127.0.6533.88.json, указав в URL необходимую версию
  2. В ответном json найти ссылку и скачать
1 3 4 5 6 7 59