{"id":4071,"date":"2021-04-20T16:05:58","date_gmt":"2021-04-20T14:05:58","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=4071"},"modified":"2021-05-05T13:31:52","modified_gmt":"2021-05-05T11:31:52","slug":"scanner-home","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2021\/04\/20\/scanner-home\/","title":{"rendered":"scanner.home"},"content":{"rendered":"\n<p>Pues ya tengo tambi\u00e9n el escaneado de documentos v\u00eda web en la red casera. Y estoy que no me lo creo de lo f\u00e1cil que ha sido. <\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Una vez que he conseguido que la instalaci\u00f3n del esc\u00e1ner en red sea una realidad y no me vuelva m\u00e1s loco de lo habitual quer\u00eda obtenerlo tambi\u00e9n empleando el navegador, por ver si pod\u00eda ser incluso m\u00e1s sencillo de integrar en los sistemas que utilizar los programas habituales de escritorio de Linux.<\/p>\n\n\n\n<p>Y buscando he encontrado una aplicaci\u00f3n web que hace justamente eso que estaba buscando: <a href=\"https:\/\/github.com\/sbs20\/scanservjs\" target=\"_blank\" rel=\"noreferrer noopener\">scanservjs<\/a>. La he instalado y la he retocado un poco para que tenga un frontal web como los otros y el resultado de uso es fascinante:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"457\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js-1024x457.png\" alt=\"\" class=\"wp-image-4072\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js-1024x457.png 1024w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js-300x134.png 300w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js-768x343.png 768w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js-1536x686.png 1536w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js-600x268.png 600w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js.png 1908w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Tiene todo lo que esperas de la aplicaci\u00f3n de escaneado, proceso y guardado de resultados. Como se han instalado las aplicaciones <em>tesseract-ocr<\/em> e <em>imagemagick<\/em> -entre otras- se puede obtener documentos en PDF con texto o distintos formatos de imagen. <\/p>\n\n\n\n<p>Los archivos est\u00e1n disponibles para descarga directa:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"179\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js2-1024x179.png\" alt=\"\" class=\"wp-image-4076\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js2-1024x179.png 1024w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js2-300x53.png 300w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js2-768x134.png 768w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js2-1536x269.png 1536w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js2-600x105.png 600w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2021\/04\/Screenshot_2021-04-20-scanserv-js2.png 1908w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Y como es posible escanear p\u00e1ginas por lotes, con aviso manual si es preciso o alimentador si el esc\u00e1ner lo soporta, est\u00e1 tan bien pensando que si el formato es de imagen las diferentes exploraciones las guarda en un zip. Si es un PDF (con soporte de OCR o no) lo descarga en un documento con varias p\u00e1ginas. <\/p>\n\n\n\n<p><strong>Nota:<\/strong> Un detalle que me he encontrado es que el programa <em>pierde<\/em> los cambios en la configuraci\u00f3n de manera que cada vez que abres la p\u00e1gina (nueva) aparecen todos los valores para el entorno ingl\u00e9s, incluyendo el OCR. De momento no es molesto porque son un par de <em>clicks<\/em> para cambiarlo pero &#8230; <\/p>\n\n\n\n<p><strong>Y a\u00f1adido<\/strong>: creo que es cosa de Firefox y sus complementos de privacidad porque de momento no parece que ocurra lo mismo con <em>Chromium<\/em>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">El dispositivo del esc\u00e1ner si es USB<\/h4>\n\n\n\n<p>Mucho tuve que estar buscando hasta que llegu\u00e9 a entender qu\u00e9 era necesario hacer para que los permisos fuesen los correctos. <\/p>\n\n\n\n<p>Cuando el esc\u00e1ner es de tipo USB el sistema no garantiza de buenas que tenga siempre el mismo archivo de dispositivo por lo que los permisos quedan siempre mal y no asignados al grupo <em>scanner<\/em> que es al que todos se enganchan. <\/p>\n\n\n\n<p>Para ello tuve que a\u00f1adir un archivo a la configuraci\u00f3n de <em>udev<\/em> de manera que siempre que apareciese el dispositivo de escaneado lo pusiese bajo el grupo indicado.<\/p>\n\n\n\n<p>El archivo est\u00e1 en <em>\/etc\/udev\/rules.d\/scanner.rules<\/em> y es el siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ACTION!=\"add\", GOTO=\"scanner_end_rules\"\n\nENV{libsane_matched}==\"yes\", OWNER=\"saned\", GROUP=\"scanner\"\n\nLABEL=\"scanner_end_rules\"\n<\/pre>\n\n\n\n<p>Viene a decir que si la acci\u00f3n no es a\u00f1adir (<em>add<\/em>) pase al final del archivo indicado con la etiqueta <em>scanner_end_rules<\/em> y que en caso contrario tiene que comprobar la variable de entorno <em>libsane_matched<\/em>; si contiene el valor <em>yes<\/em> entonces el propietario del fichero ser\u00e1 <em>saned<\/em> y el grupo <em>scanner<\/em>. <\/p>\n\n\n\n<p>La variable de entorno mencionada es inicializada por las reglas incluidas en el paquete <em>sane<\/em> y similares. En mi caso, al ser un Epson Perfection 2400 Photo, la variable se encuentra en las reglas de<em> \/lib\/udev\/rules.d\/60-libsane.rules<\/em>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Wildcard: for some Epson SCSI scanners\nATTRS{type}==\"3\", ATTRS{vendor}==\"EPSON\", ATTRS{model}==\"SCANNER*\", ENV{libsane_matched}=\"yes\"\n<\/pre>\n\n\n\n<p>Una vez a\u00f1adido se puede forzar la relectura de estas reglas empleando el programa <a rel=\"noreferrer noopener\" href=\"https:\/\/linux.die.net\/man\/8\/udevadm\" target=\"_blank\">udevadm<\/a>. Luego pasamos a  comprobar c\u00f3mo se han aplicado los cambios:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">$ sudo udevadm control --reload-rules\n$ lsusb\nBus 002 Device 004: ID 04b8:0142 Seiko Epson Corp. GT-F730 [GT-S630\/Perfection V33\/V330 Photo]\n...\n$  ls -ltra \/dev\/bus\/usb\/002\/\ntotal 0\ndrwxr-xr-x 4 root  root          80 feb 21 18:52 ..\ncrw-rw-r-- 1 root  root    189, 129 feb 21 18:52 002\ncrw-rw-r-- 1 root  root    189, 128 may  5 12:36 001\ndrwxr-xr-x 2 root  root         100 may  5 13:00 .\n<strong>crw-rw-rw- 1 saned scanner 189, 131 may  5 13:00 004\n<\/strong><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Apache2 haciendo de proxy <\/h3>\n\n\n\n<p>En principio es bastante sencillo; se emplea el m\u00f3dulo mod_proxy de toda la vida apuntando a la IP y al puerto de escucha del servicio <em>scanservjs<\/em> y el \u00fanico detalle especial ha sido activar <a href=\"https:\/\/stackoverflow.com\/questions\/4390436\/need-to-allow-encoded-slashes-on-apache\" target=\"_blank\" rel=\"noreferrer noopener\">una directiva<\/a> para que algunos URL generados pasasen directamente y no diesen un error 404 en el propio servidor web. <\/p>\n\n\n\n<p>Curiosamente eran los URL de los archivos as\u00ed que s\u00ed que ten\u00edan importancia.<\/p>\n\n\n\n<pre title=\"\/etc\/apache2\/sites-enabled\/scanner.home.conf\" class=\"wp-block-code\"><code lang=\"apacheconf\" class=\"language-apacheconf\">&lt;VirtualHost *:80&gt;\n        ServerName      scanner.home\n        ServerAdmin     root@home\n\n        AllowEncodedSlashes NoDecode\n\n        ProxyPreserveHost On\n        ProxyPass \"\/\" \"http:\/\/127.0.0.1:8088\/\" nocanon\n        ProxyPassReverse \"\/\" \"http:\/\/127.0.0.1:8088\/\"\n\n        LogLevel info \n        ErrorLog \/var\/log\/apache2\/scanner.home\/error.log\n        CustomLog \/var\/log\/apache2\/scanner.home\/access.log combined\n&lt;\/VirtualHost&gt;\n\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Referencias<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a rel=\"noreferrer noopener\" href=\"https:\/\/wiki.debian.org\/udev\" target=\"_blank\">https:\/\/wiki.debian.org\/udev<\/a><\/li><li><a href=\"http:\/\/reactivated.net\/writing_udev_rules.html\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/reactivated.net\/writing_udev_rules.html<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Pues ya tengo tambi\u00e9n el escaneado de documentos v\u00eda web en la red casera. Y estoy que no me lo creo de lo f\u00e1cil que ha sido.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[5],"tags":[874,222,1093,870,1094,44,873,90],"class_list":["post-4071","post","type-post","status-publish","format-standard","hentry","category-hardware","tag-ocr","tag-pdf","tag-red-casera","tag-sane","tag-scanservjs","tag-servicios-web","tag-tesseract","tag-udev"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4071","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=4071"}],"version-history":[{"count":6,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4071\/revisions"}],"predecessor-version":[{"id":4119,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4071\/revisions\/4119"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=4071"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=4071"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=4071"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}