Toca do Rapoelho<p><a href="https://tocadorapoelho.wordpress.com/2024/11/07/criei-um-script-para-usar-o-scanner/" rel="nofollow noopener noreferrer" target="_blank">Como eu já relatei em um outro post</a>, eu estava tendo problemas para escanear imagens. O Epson Scan (que eu usava inicialmente) parou de funcionar.</p><p>Depois fui para o Simple Scan do Gnome, que parou de funcionar direito depois que escaneei uns documentos e salvei em PDF. Não importava se eu escolhesse JPEG, PNG ou WebP, tudo o que era salvo no Simple Scan era em PDF.</p><p>Por fim, acabei encontrando o xSANE no AUR, e apesar dele ser bem feio (e um pouco confuso no começo), ele funcionou bem, mas por ser do AUR, me recomendaram remover esse pacote. E assim eu fiz.</p><p>E pesquisando uma forma de usar o SANE por linha de comando, <a href="https://wiki.archlinux.org/title/SANE#Verification" rel="nofollow noopener noreferrer" target="_blank">acabei encontrando uma página na Arch Wiki</a> explicando sobre o <code>scanimage</code> que escaneia imagens por linha de comando. Com isso, decidi fazer esse Script.</p><p><strong>Código do Script</strong></p><p>O código do inSANE 1.0.0 <a href="https://pastebin.com/nxwFb94j" rel="nofollow noopener noreferrer" target="_blank">está disponível no Pastebin</a>. Basta baixar o código pelo próprio Pastebin…</p><p>Depois de baixar do Pastebin, renomeie para <code>insane.sh</code>. E nos dois casos, dê a permissão de execução.</p><p><strong>Como Funciona</strong></p><p>O inSANE funciona de uma forma bem simples: Ele detecta o seu Scanner, e usa o <code>scanimage</code> para escanear a imagem na resolução de 600 DPI e na pasta <code>~/Imagens/Scan</code>.</p><p>E claro, tem como configurar esses dois parâmetros criando um arquivo <code>.insane.conf</code> que o inSANE procura antes de usar os valores padrões, com o arquivo tendo as variáveis da Pasta e da Resolução, sendo mais ou menos assim:</p> <pre>Pasta=~/Imagens/EscaneadosResolucao=300</pre> <p><strong>Como funciona a detecção automática do Scanner?</strong></p><p>Essa pra mim foi uma das partes mais interessantes desse Script e por isso decidi comentar ela. Para o scanimage funcionar, ele precisa ter o dispositivo, o formato do arquivo, o arquivo de saída. Na Arch Wiki, o exemplo que tem é esse aqui:</p> <pre>scanimage --device "pixma:04A91749_247936" --format=tiff --output-file test.tiff --progress</pre> <p>Então a forma para detectar automaticamente o Scanner foi essa aqui:</p> <pre>scanimage -L | grep -v Camera | gawk -F '`' -P '{ print $2 }' | cut -d"'" -f1</pre> <p>E porque esse comando para poder extrair um ID de dispositivo? Começando pelo primeiro comando, o <code>scanimage -L</code> ele existe para que seja feita uma lista de quais dispositivos existem. E a saída dele acaba sendo essa aqui:</p><p>Como observado, só preciso do Scanner, no caso a minha Epson L3150, e não da câmera integrada. Com isso, vem o segundo comando, o <code>grep -v Camera</code> para poder retirar o “Noname Integrated Camera” do caminho.</p><p>Com isso, a linha do Scanner foi isolada. Mas ainda é preciso limpar bastante essa linha, pois preciso apenas do <code>epsonds:libusb:001:091</code>. E nisso, vem o terceiro comando, o <code>gawk -F '`' -P '{ print $2 }'</code>para retirar o <code>device</code> do começo da linha. Com isso, a saída fica assim:</p><p>E por fim, tem que limpar o restante da linha. Com isso, vem o <code>cut -d"'" -f1</code>, que faz esse serviço de cortar tudo o que há depois do ‘. E por fim, a saída se torna assim, que é o que quero para esse Script.</p><p>E isso foi necessário, pois toda vez que eu desconecto e reconecto o Hub USB em que está o Scanner, o ID dele muda. <strong><em>E pode ser que essa Detecção não funcione para todos e que precise de ajustes.</em></strong></p><p><strong>Detecção do Arquivo de Configuração</strong></p><p>Esse Script foi feito se ajustando as minhas necessidades, que é salvar o arquivo na pasta <code>~/Imagens/Scan</code> e com uma resolução de 600 DPI, mas isso não quer dizer que ele não seja configurável.</p><p>Basicamente há uma rotina que verifica se o arquivo <code>.insane.conf</code> existe na pasta pessoal do usuário e se as variáveis existem.</p><p><strong><em>Infelizmente não consegui uma forma de ver se essas variáveis são válidas, o que pode causar erros se as variáveis existirem no arquivo, mas não forem adequadas para o <code>scanimage</code></em></strong></p><p>E claro, se o arquivo de configuração e/ou alguma variável não existir, o inSANE passará os valores padrão para o scanimage e assim fazer o escaneamento do arquivo.</p><p><strong>Detecção da Pasta de Escaneamento</strong></p><p>Outra coisa que o inSANE também faz é verificar se a pasta em que os arquivos serão escaneados existe. Se a pasta existir, o escaneamento será feito normalmente e se não existir, o próprio inSANE cria a pasta. Seja a pasta padrão (<code>~/Imagens/Scan</code>), seja a pasta configurada com a variável <code>Pasta=</code> no <code>.insane.conf</code>.</p><p><strong>O escaneamento em si</strong></p><p>E por fim, o escaneamento. Com todas as variáveis carregadas e configuradas, é hora de usar o <code>scanimage</code></p> <pre>scanimage --device "$Scanner" --format=jpeg --output-file $Pasta/Scan_`date +"%Y-%m-%d_%H-%M-%S"`.jpg --resolution $Resolucao</pre> <p>A variável <code>$Scanner</code> é obtida por meio da rotina de detecção do Scanner, o formato do Arquivo é o JPEG, que dentre os formatos que o meu Scanner suporta é o mais “leve”.</p><p>A variável <code>$Resolução</code> é obtida com a rotina que detecta o arquivo de configuração. E por fim, uma das coisas mais legais desse comando:</p> <pre>--output-file $Pasta/Scan_`date +"%Y-%m-%d_%H-%M-%S"`.jpg</pre> <p>Essa é a variável do Arquivo de saída. Independentemente de onde o Script for executado, ele salvará ou na pasta padrão ou na pasta que está configurada no <code>.insane.conf</code>. E uma coisa é que esse Script sempre salvará os arquivos com o prefixo <code>Scan_</code> e com a data e hora em que o escaneamento começou.</p><p>Optei por isso, pois essa era a forma em que o XnViewMP escaneava os arquivos do Windows: Salvando com o prefixo <code>Scan_</code> junto com a Data e Hora em que o escaneamento foi feito. É uma forma de salvar o arquivo sem pensar muito no nome dele e de manter os arquivos escaneados organizados.</p><p>E um outro detalhe: Se o Zenity estiver instalado, o inSANE vai exibir um diálogo com uma barra de progresso para mostrar que o escaneamento está acontecendo.</p><p><strong>Problemas conhecidos</strong></p><p>Um bug que me deparei com esse código é que às vezes o <code>scanimage -L</code> não consegue detectar o scanner. A solução pra isso é desconectar e conectar o cabo USB do Scanner.</p><p>E o que pode ser um problema: Até onde testei, o inSANE funciona apenas com Scanners conectados via USB. Não consegui testar com nada via Rede.</p><p><strong>Palavras Finais</strong></p><p>Assim como a experiência de fazer aquele Script para a Bateria, essa foi uma experiência que gostei bastante e que decidi compartilhar com vocês. Sei que tem muita coisa que pode ser melhorada, mas para uma primeira versão desse Script estou bem satisfeito.</p><p>Talvez eu possa melhorar esse Script com a adição de opções para digitalizar arquivos em PDF, ou talvez com outros formatos de imagem. Ou mesmo quem sabe, com a opção de rotacionar o arquivo digitalizado (e que pode ser muito útil).</p><p>Enfim, esse foi um Script que fiz seguindo as minhas necessidades, mas que ajustei ele um pouco para atender as necessidades de algumas outras pessoas.</p><p><span></span></p><p><a href="https://tocadorapoelho.wordpress.com/2024/11/10/insane/" class="" rel="nofollow noopener noreferrer" target="_blank">https://tocadorapoelho.wordpress.com/2024/11/10/insane/</a></p><p><a rel="nofollow noopener noreferrer" class="hashtag u-tag u-category" href="https://tocadorapoelho.wordpress.com/tag/linux/" target="_blank">#Linux</a> <a rel="nofollow noopener noreferrer" class="hashtag u-tag u-category" href="https://tocadorapoelho.wordpress.com/tag/sane/" target="_blank">#SANE</a> <a rel="nofollow noopener noreferrer" class="hashtag u-tag u-category" href="https://tocadorapoelho.wordpress.com/tag/script/" target="_blank">#Script</a></p>