ScanTo Button an AllInOne Netzwerkdrucker HP 2840 mittels hplip, sane, cups nutzen

Status
Für weitere Antworten geschlossen.

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Nach einigen Versuchen und mit Hilfe einiger Anleitungen im www habe ich es geschaft, den ScanTo Button meines HP Druckers per Script so abzufragen, daß nach der Betätigung des Buttons am Drucker, der Scan automatisch auf der DiskStation abgelegt wird, ohne das ein PC eingeschaltet sein muß.

Zum Hintergrund: Da die HP Software für meinen AllInOne auf WIN 7 64Bit nicht mehr vernünftig läuft, und die Toolbox von HP, die zum Programmieren des ScanTo Buttons erforderlich ist, nur unter WIN XP oder WIN 2000 funktioniert, habe ich einen Weg gesucht, diese zu umgehen.

ScanTo Button: Der Button befindet sich direkt am Drucker. Für diesen wird mittels og. Software ein Speicherzielort festgelegt. Hierbei muß jedoch der Rechner eingeschaltet bleiben, an dem diese Konfiguration durchgeführt wurde.


Für alle die dieser Anleitung folgen möchten:
Bisher habe ich nur vom HP 2840 gelesen, bei dem dies funktioniert. Durch das "Abhören" der Netzwerkverbindung wurden versteckte Seiten auf dem AllInOne entdeckt (Verweise / Links am Ende dieser Anleitung). Ob es dennoch bei anderen AllInOne funktioniert, weis ich leider nicht. Wer dies mal für seinen AllInOne ausprobieren möchte:
http://<IP_Deines_Drucker>/hp/device/info_scanto_destinations.xml
http://<IP_Deines_Drucker>/hp/device/set_config.html
http://<IP_Deines_Drucker>/hp/device/notifications.xml

Selbst wenn der ScanTo Button nicht funktionieren sollte, bleibt noch die Möglichkeit im NW zB. mittels SaneTwain, Xsane oder Script zu scannen. Diese Anleitungen werden nicht beschrieben, jedoch ein paar links findet Ihr unten. Das normale Scannen vom "Glas" funktioniert aber immer ... Außerdem gibt es unten einen link, der mittel Abfrage des normalen Scanner Buttons ein Scannen per Script ermöglicht.


Hinweis:
Alle Änderungen an Euren DS gehen auf die eigene Kappe.
Da ich diverse Sachen ausprobieren mußte, kann es durchaus sein, daß einige Änderungen nicht zwingend erforderlich sind. Bitte gebt Euer Feedback um das richtig zu stellen.
Änderungen über deren Nutzen ich mir nicht sicher bin oder Hinweise werden mit *********** gekennzeichnet.
Meine Drucker IP 192.168.1.7 und die IP Adressbereiche ist jeweils durch Euere zu ersetzen.

>>>>>>>>>>>>> Bitte prüft zuvor, ob Euer Drucker die og. Seiten anzeigt oder ähnliche Möglichkeiten bietet.
Es ist auch möglich, mit dem normalen Scan Button eines Scanners seitenweise per Script oder direkt per Script zu scannen <<<<<<<<<<<<<<<
>>>>>>>>>>>>> Bitte prüft zuvor, ob Euer Drucker von hplip unterstützt wird. <<<<<<<<<<<<<<<
>>>>>>>>>>>>> Die Anleitung beschreibt einen HP 2840 der NICHT PER USB an der DS angeschlossen ist, sondern entfernt per NW Kabel im NW hängt. <<<<<<<<<<<<<<<
>>>>>>>>>>>>> Mit dem Script ist der Standby ( Hibernation ) der DS NICHT mehr möglich. <<<<<<<<<<<<<<<



Anleitung:

1) Installation von ipgk. Wer noch kein ipkg installiert hat findet hier den entsprechenden Beitrag.


2) Installation von folgenden ipkg Paketen mittels 'ipkg install <Paket>'

xinetd, sane-backends, dbus, py25-dbus-python, cups, libieee1284

===> Erstellt vor der Installation von hplip eine Kopie der dll.conf
'cp /opt/etc/sane.d/dll.conf /opt/etc/sane.d/dll.conf.o'
'ipkg install hplip'

****************************************************************************
Die Abfrage des "Replace" der orig. dll.conf beantwortet Ihr mit 'Yes'
****************************************************************************


3) Nun werden eine ganze Reihe von Änderungen an verschiedenen Dateien mittels dem vi-Editor oä. nötig.

a) xined

===> wir legen zuvor eine Sicherungskopie an
'cp /opt/etc/xinetd.conf /opt/etc/xinetd.conf.o'
'vi /opt/etc/xinetd.conf'

===> wir ändern den Adressbereich
only_from = localhost 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
===> in
only_from = localhost 127.0.0.1 192.168.1.0/24 " ==> hier Euer IP Bereich rein"


b) inetd.conf

*************************************************************************************************************
Bin nicht sicher ob nun sane oder sane-port. sane-port wäre später für SaneTwain erforderlich, welches ich
nicht nutze (siehe weiter unten). Ich habe beide hinzugefügt. Vielleicht kommentiert / testet das mal jemand.

*************************************************************************************************************

'cp /etc/inetd.conf etc/inetd.conf.o'
'vi /etc/inetd.conf'

==> Zeile hinzu
sane-port stream tcp nowait root.root /opt/sbin/saned saned

===> Ein event. bereits vorhandener Eintrag für sane ist bei mir # auszukommentiert
#sane stream tcp nowait root /opt/sbin/saned saned


c) system.conf

'cp /opt/etc/dbus-1/system.conf /opt/etc/dbus-1/system.conf.o'
'vi /opt/etc/dbus-1/system.conf'

===> Ändern den Eintrag
<!-- Run as special user -->
<user>messagebus</user>

===> in den Eintrag
<!-- Run as special user -->
<user>root</user>

====> Wir starten dbus neu ===> Usage: /opt/etc/init.d/S20dbus {start|stop|restart|force-reload}
'/opt/etc/init.d/S20dbus restart'


d) saned.conf

'cp /opt/etc/sane.d/saned.conf /opt/etc/sane.d/saned.conf.o'
'vi /opt/etc/sane.d/saned.conf'

===> unter #scan-client.somedomain.firm IP Adressbereich ändern in 192.168.1.0/24 (Achtung Eurer IP Bereich) und # davor entfernen


e) dll.conf

'cp /opt/etc/sane.d/dll.conf'
'vi /opt/etc/sane.d/dll.conf'

====> komplett alles löschen - nur dieser Eintrag bleibt stehen
hpaio


f) cupsd.conf

'cp /opt/etc/cups/cupsd.conf /opt/etc/cups/cupsd.conf.bak' ==> cupsd.conf.o wird von cups selber angelegt / benutzt
'vi /opt/etc/cups/cupsd.conf'

===> unter "Network Options" ändern
# Listen hostname:631 >>>>> Listen 192.168.1.5:631

===> unter <Location /> hinzufügen und event. Auskommentierung entfernen
Allow From 192.168.1.0/24

===> unter <Location /admin> ändern
AuthType Basic >>>>> BasicDigest
AuthClass System >>>>> User

===> unter <Location /admin> hinzufügen und event. Auskommentierung entfernen
Allow From 192.168.1.0/24

****************************************************************************
Achtung: Bitte oben jeweils Euren IP Adressbereich eintragen
****************************************************************************

4) Startscript für cups anlegen; s55cupsd aus dem wiki kopieren; Zeilenumbruch Unix/linux beachten

'cp /<Quellverzeichnis>/S55cupsd /opt/etc/init.d/S55cupsd'


===> danach starten wir cups neu
'/opt/etc/init.d/S55cupsd restart'

===> Prüfen ob cups wirklich "lauscht" mit
'netstat -an | grep 631'

Rich (BBCode):
/ # netstat -an | grep 631
tcp        0      0 0.0.0.0:631             0.0.0.0:*               LISTEN
tcp        0      0 192.168.1.5:631         192.168.1.13:62054      ESTABLISHED
tcp        0      0 ::%136903888:631        ::%135699616:*          LISTEN
udp        0      0 0.0.0.0:631             0.0.0.0:*
/ #
**************************************************************************************
da ist mein Laptop gerade dabei ...
**************************************************************************************
/ # killall cupsd
/ # /opt/etc/init.d/S55cupsd restart
cupsd: no process found
Starting Service: cupsd
/ # netstat -an | grep 631
tcp        0      0 0.0.0.0:631             0.0.0.0:*               LISTEN
tcp        0      0 ::%136903680:631        ::%135699616:*          LISTEN
udp        0      0 0.0.0.0:631             0.0.0.0:*
/ #


5) Passwort ändern um Drucker hinzufügen zu können; ich habe root und admin hinzugefügt

Rich (BBCode):
/ # lppasswd -g sys -a root
Enter password:
Enter password again:
/ #
/ # lppasswd -g sys -a admin
Enter password:
Enter password again:
/ #

**************************************************************************************
Wir verwenden die Standard System Passwörter der User
**************************************************************************************


6) sane-port muß noch angelegt werden, da sie nicht existiert


'mkdir /opt/etc/xinetd.d/sane-port'
'vi /opt/etc/xinetd.d/sane-port'

===> folgenden Inhalt hinzufügen

service sane-port
{
socket_type = stream
port = 6566
server = /opt/sbin/saned
protocol = tcp
user = root
group = root
wait = no
disabled = no
}

===> Rechte ändern falls erforderlich
'chmod 644 /opt/etc/xinetd.d/sane-port'


***********************************************************************************************
Bitte beachtet meine Hinweise zu sane oben. Der Eintrag meiner saned lautet

===> Ändern
'vi /opt/etc/xinetd.d/saned'

service saned
{
socket_type = stream
server = /opt/sbin/saned
protocol = tcp
user = root
group = root
wait = no
disable = no
}

Hinweis: Bei mir sind derzeit noch beide gestartet. Ich habe noch nicht herausgefunden wieso.
***********************************************************************************************


7) Laut hp-check (wird später eventuell zur Fehlersuche benötigt) wird cupsd.conf nicht gefunden, da
/etc/cups/cupsd.conf erwartet wird, sie aber hier /opt/etc/cups/cupsd.conf steht

===> Wir erzeugen uns einen Link
'ln -s /opt/etc/cups/cupsd.conf /etc/cups'
 
Zuletzt bearbeitet:

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
8) hp-setup sucht später nach backend/hp

===> Wir legen das entsprechende Verzeichnis an und erstellen einen Link
'mkdir /usr/lib/cups/backend'
'ln -s /opt/lib/cups/backend/hp /usr/lib/cups/backend/hp'



**************************************************************************************************************************************
**************************************************************************************************************************************
**************************************************************************************************************************************

Es gibt jetzt zwei mögliche weitere Vorgehensweisen.

A) Wir führen die unten stehenden Befehle aus, und fügen den Drucker durch hp-setup hinzu ===> habe ich gewählt und ist beschrieben
B) Wir nehmen des Web-Interface von cups mit 'http://<IP_DEINER_DS>:631'; wo allerdings einiges zu beachten ist

In jedem Falle es es empfehlenswert, die Seite von cups 'http://<IP_DEINER_DS>:631'
einmal testweise aufzurufen, und den Administrator Bereich zu testen.


**************************************************************************************************************************************
**************************************************************************************************************************************
**************************************************************************************************************************************



9) Wir entpacken den erforderlichen Treiber

===> das Euerm Drucker entsprechende File entpacken; suchen mittels 'find -name <*Nummer*> -print'
'gz -d /opt/share/ppd/HP/hp-color_laserjet_2840-ps.ppd.gz /opt/share/ppd/HP/hp-color_laserjet_2840-ps.ppd'
'chmod 644 /opt/share/ppd/HP/hp-color_laserjet_2840-ps.ppd'


10) Wir prüfen, ob der Drucker gefunden wird

===> Leider wird bei mir die "models.dat" nicht gefunden; ein 'export path=' bringt leider nichts, weshalb wir im Install-Verzeichnis starten
'cd /opt/share/hplip/'
'hp-makeuri 192.168.1.7' ===> -g - Option führt hp im Debugmodus zur Fehlersuche aus ===> also hp-makeuri -g 192.168.1.7

===> Die Ausgabe sollte in etwa so aussehen

Rich (BBCode):
/opt/share/hplip # hp-makeuri 192.168.1.7

HP Linux Imaging and Printing System (ver. 0.0.0)
Device URI Creation Utility ver. 5.0

Copyright (c) 2001-9 Hewlett-Packard Development Company, LP
This software comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to distribute it
under certain conditions. See COPYING file for more details.

CUPS URI: hp:/net/HP_Color_LaserJet_2840?ip=192.168.1.7
SANE URI: hpaio:/net/HP_Color_LaserJet_2840?ip=192.168.1.7
HP Fax URI: hpfax:/net/HP_Color_LaserJet_2840?ip=192.168.1.7

Done.
/opt/share/hplip #

***************************************************************************************************
Bitte kopiert Euch die Ausgabe CUPS URI; SANE URI; HP FAX URI in eine Datei, falls noch benötigt
***************************************************************************************************


11) Jetzt führen wir hp-setup aus

'hp-setup 192.168.1.7' ===> -g - Option führt hp im Debugmodus zur Fehlersuche aus ===> also zB. hp-setup -bnet -g

===> Es erfolgen mehrere Abfragen, laut Ausgabe wie folgt

Rich (BBCode):
/opt/share/hplip # hp-setup 192.168.1.7

HP Linux Imaging and Printing System (ver. 0.0.0)
Printer/Fax Setup Utility ver. 9.0

Copyright (c) 2001-9 Hewlett-Packard Development Company, LP
This software comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to distribute it
under certain conditions. See COPYING file for more details.

(Note: Defaults for each question are maked with a '*'. Press <enter> to accept the default.)
                                                                                                                                                                                      

      Using device: hp:/net/HP_Color_LaserJet_2840?zc=NPI14EB68


Setting up device: hp:/net/HP_Color_LaserJet_2840?zc=NPI14EB68



---------------------
| PRINT QUEUE SETUP |
---------------------


Please enter a name for this print queue (m=use model name:'HP_Color_LaserJet_2840'*, q=quit) ?HP_2840
Using queue name: HP_2840
Locating PPD file... Please wait.
warning: No PPD found for model color_laserjet_2840 using new algorithm. Trying old algorithm...
error: No PPD found for model color_laserjet_2840 using old algorithm.
error: Unable to find an appropriate PPD file.

Would you like to specify the path to the correct PPD file to use (y=yes, n=no*, q=quit) ? y

Please enter the full filesystem path to the PPD file to use (q=quit) :/opt/share/ppd/HP/hp-color_laserjet_2840-ps.ppd
Description for the file: HP Color LaserJet 2800 Series Postscript (recommended)

Use this file (y=yes*, n=no, q=quit) ? y
Enter a location description for this printer (q=quit) ?*
Enter additonal information or notes for this printer (q=quit) ?*

Adding print queue to CUPS:
Device URI: hp:/net/HP_Color_LaserJet_2840?zc=NPI14EB68
Queue name: HP_2840
PPD file: /opt/share/ppd/HP/hp-color_laserjet_2840-ps.ppd
Location: *
Information: *
You do not have permission to add a printer.
Username: root
Password:
Done.
/opt/share/hplip #


**************************************************************************
Sollte diese Meldung bei Euch auftreten, habt Ihr vergessen das Passwort
anzulegen, oder Ihr müßt noch den User root der Gruppe lp hinzufügen.
error: Printer queue setup failed. Please restart CUPS and try again.

**************************************************************************


==> Solltet Ihr hier angekommen sein, wird es nun Zeit das System neu zu starten.


12) Wir prüfen ob der Drucker eingerichtet ist und richtig läuft

'lpstat -t'

Rich (BBCode):
/ # lpstat -t
scheduler is running
system default destination: hp_color_laserjet_2840
device for hp_color_laserjet_2840: hp:/net/HP_Color_LaserJet_2840?ip=192.168.1.7
hp_color_laserjet_2840 accepting requests since Fri Apr 20 15:51:39 2012
printer hp_color_laserjet_2840 is idle.  enabled since Fri Apr 20 15:51:39 2012
        ready to print
/ #


13) Jetzt prüfen wir ob der Scanner erkannt wird und bereit ist

'scanimage --list-devices'

Rich (BBCode):
/ # scanimage --list-devices
device `hpaio:/net/HP_Color_LaserJet_2840?ip=192.168.1.7' is a Hewlett-Packard HP_Color_LaserJet_2840 all-in-one
/ #


Weiterhin kann man den Status des Gerätes im Frontend von cups prüfen.
'http://<IP_DEINER_DS>:631'

Pinter_status.JPG


***********************************************************************************************************
Hinweis: Das per ipkg zur Verfühung stehende Paket von hplip unterstützt leider kein Scannen.
"error: Scanning disabled in build. Exiting" Deshalb wird auf scanimage von sane zurückgegriffen.

***********************************************************************************************************


14) Hier das erste Script, welches wir verwenden, um die die "Variablen" im AllInOne anzulegen.


scanto_destination
Rich (BBCode):
#!/bin/bash
# command to maintain the scan-to destination list in the HP Color LaserJet 2840 printer
if [ "$1" == "-a" ]; then
    name=$2
    [[ ! "$name" =~ ":" ]]&& name="$HOSTNAME:$name"
    postdata="AddScanToDest_1=127.0.0.1-$HOSTNAME^${name/:/%3a}^DestFolder"
    wget -q -O - --post-data="$postdata" http://192.168.1.7/hp/device/set_config.html
elif [ "$1" == "-d" ]; then
    name=$2
    [[ ! "$name" =~ ":" ]]&& name="$HOSTNAME:$name"
    postdata="RemoveScanToDest_1=${name/:/%3a}"
    wget -q -O - --post-data="$postdata" http://192.168.1.7/hp/device/set_config.html
elif [ "$1" == "-l" ]; then
    wget -q -O - http://192.168.1.7/hp/device/info_scanto_destinations.xml \
    | sed -n '/<DeviceDisplay>/s/<\/*DeviceDisplay>//gp'
else
    echo 'usage: scanto_destination -l -a <destname> -d <destname> for listing adding and deleting destinations'
fi


Zur Erklärung: Normalerweise werden diese durch die HP Software Toolbox angelegt. Um diese nicht installieren zu müssen (siehe Hinweise oben),
werden diese mittels Script, jedoch ähnlich der Toolbox zum Drucker gesendet. Dabei entspricht die Angabe der "Variablen" - Abkürzung Hostname des
PC : Name der "Variable". Der Drucker stellt nur 14 Zeichen im Display dar, die restlichen werden durchgescrollt. Bei längeren Namen kann es zu Probemen kommen.


Anhang anzeigen 8501
 
Zuletzt bearbeitet von einem Moderator:

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
15) Nun kopieren wir uns das Script auf die DS nach zB. /usr/local/scanto


'mkdir /usr/local/scanto'
'cp /<Quellverzeichnis>/scanto_destination /usr/local/scanto/scanto_destination
'chmod 755 -R /usr/local/scanto'


===> Jetzt könnten wir alle benötigten "Variablen" mit diesem Script einzeln angelegen.


'sh /usr/local/scanto/scanto_destination -a "Variable"'


Aber halt ! Wir machen das mit einem späteren Script auf einmal.


**********************************************************************************************************************************
Hinweis: Wenn man sich etwas mehr damit beschäftigt, stellt man fest, daß dabei der (Hostname:) nur der Erkennung des
angesprochenen PC dient. Da wir dies in diesem Fall nicht brauchen, vereinfacht sich die Variable auf den Teil nach dem :
**********************************************************************************************************************************


Beispiel:
'sh /usr/local/scanto/scanto_destination -a TIF_300_DPI'




Zur späteren einfacheren Übertragung an den Drucker packen wir die einzelnen "Variablen" in eine Datei.


scanto_destination_list
Rich (BBCode):
PDF_1_BLACK
PDF_1_COLOR
PDF_2_BLACK
PDF_2_COLOR
PDF_3_BLACK
PDF_3_COLOR
PDF_4_BLACK
PDF_4_COLOR
PDF_5_BLACK
PDF_5_COLOR
PDF_6_BLACK
PDF_6_COLOR
PDF_7_BLACK
PDF_7_COLOR
PDF_8_BLACK
PDF_8_COLOR
PDF_9_BLACK
PDF_9_COLOR
TIF_150_DPI
TIF_300_DPI
TIF_600_DPI
DBL_SCN_COLOR
DBL_SCN_BLACK
CONV_TO_PDF


Auch diese Datei kopieren wir zb. in das Verzeichnis /usr/local/scanto:
'cp /<Quellverzeichnis>/scanto_destination_list /usr/local/scanto/scanto_destination_list
'chmod 755 -R /usr/local/scanto'


Es können maximal 30 "Variablen" angelegt werden. Meine Anzahl mag erschrecken. Da ich aber bisher keinen Weg gefunden habe,
den Automatischen Dokumenteneinzug des Scanners zu steuern, ohne zuvor die Seitenanzahl angeben zu haben, wird es vorerst so
bleiben. Immer wenn man eine undefinierte Anzahl mittels dem Parameter '-- batch' aus dem Einzug scannt, hängt sich der
Scanner nach der letzten Seite auf (Siehe offene Punkte unten). Jedoch wird bei Neuauswahl am Drucker immer die letzte Auswahl
zuerst angeboten, also halb so schlimm.




Später können die im Drucker hinterlegten "Variablen" mittels 'scanto_destination -l' abgefragt werden.
Löschen wäre mit 'scanto_destination -a Variable' möglich.


Außerdem ist die Abfage per http://<IP_Deines_Drucker>/hp/device/info_scanto_destinations.xml möglich.


===> Hier ein Beispiel:

destinations.JPG

16) Dieses Script übernimmt die "Überwachung" des Scanners und erzeugt letztlich die Scan's. Dazu wird alle 5 Sekunden der Netzwerkanschluß
des AllInOne abgefragt. Wird der Scanto Button betätigt, wird die zuvor angelegte "Variable" überprüft und der entsprechende Scan durchgeführt.
Bei den PDF werden die einzelnen TIF komprimiert, zu einem TIF zusammengefaßt, beim Wandeln in ein PDF optimiert (optimiertes Ladeverhalten).
Auch bei den einzelnen TIF's ist ein Scan aus dem Vorlageneinzug möglich.


**********************************************************************************************************************************
Die PDF Variante wird mittels pdfopt optimiert. Falls Ihr das verwenden wollt, müßt Ihr noch Ghostscript installieren.
'ipkg install ghostcript'
**********************************************************************************************************************************




===> Dieses Script kopieren wir auch nach zB. /usr/local/scanto


'cp /<Quellverzeichnis>/scanto /usr/local/scanto/scanto'
'chmod 755 -R /usr/local/scanto'


===> Zur Benutzung des Sripts legen wir auch noch zwei Verzeichnisse unterhalb scanto an:






scanto
Rich (BBCode):
#!/bin/sh
# Default options, modify to your needs


DIR="/usr/local/scanto"                # Hier werden die Scripte abgelegt
TARGETDIR="/volume1/download/_Scan"        # Hier werden die Scans gespeichert
TEMPDIR="/usr/local/scanto/tmp"            # Hier werden die TIF und PDF Dateien zwischengespeichert
TEMPDIRDOUBLE="/usr/local/scanto/tmp/convert"    # Hier werden die TIF Dateien für die PDF Konvertierung beim Einzelscan (=DBL) zwischengespeichert
DESTINATION="scanto_destination -a"        # Script zum Speichern der Variablen im AllInOne ff.
LIST="scanto_destination_list"            # In dieser Liste speichern wir die Variablen = Auswahl im AllInOne für "Scanto Button"
                        # Folgende Varianten sind zulaessig, Beispiele:
                        # PDF_5_COLOR ( PDF_Anzahl Seiten_COLOR|BLACK )        ==> Scan von Seiten dieser Anzahl mit dem ADF in ein PDF
                        # TIF_300_DPI ( TIF_Aufloesung nach Scanner_DPI )    ==> Scan einzelner Seiten mit dieser Aufloesung in ein TIF
                        # DBL_SCN_BLACK ( DBL_SCN_BLACK|COLOR )            ==> Scan einzelner Seiten in ein tmp Verz. zum Konvertieren
                        # CONV_TO_PDF                        ==> Konvertiert einzelne Seite aus tmp Verz. in ein PDF
COUNTDOUBLE=101


for i in $(cat $DIR/$LIST); do sh $DIR/$DESTINATION $i ; done     # Diese Zeile legt die einzelnen "Variablen" im AllInOne an


cd /$TEMPDIR
echo $$ > /opt/var/run/scanto.pid
set -o pipefail
while true; do
    # if scan-to button pressed - run the command corresponding to the destination name
    NAME=`wget -q -O - http://192.168.1.7/hp/device/notifications.xml \
            | egrep -o '<ScanToDeviceDisplay>(.*)</ScanToDeviceDisplay>' \
            | sed -e 's/<ScanToDeviceDisplay>//' \
            | sed -e 's/<\/ScanToDeviceDisplay>//' \
            | sed -e 's/.*://'` && {
            if [ "$NAME" != "" ]; then
            TYP=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $1}'`
            TINT=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $3}'`
              if [ "$TYP" == "PDF" ]; then
                rm $TEMPDIR/*.tif | rm $TEMPDIR/*.pdf
                COUNT=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $2}'`
                  if [ "$TINT" == "COLOR" ]; then
                      scanimage --format tiff --mode Color --batch-count="$COUNT" --resolution=150 -l 0 -t 0 -x 210mm -y 297mm --source Auto
                  elif [ "$TINT" == "BLACK" ]; then
                    scanimage --format tiff --mode Gray --batch-count="$COUNT" --resolution=150 -l 0 -t 0 -x 210mm -y 297mm --source Auto
                  fi
                tiffcp -c lzw $TEMPDIR/out*.tif $TEMPDIR/temp.tif
                tiff2pdf -z $TEMPDIR/temp.tif -o $TEMPDIR/temp.pdf
                pdfopt $TEMPDIR/temp.pdf $TARGETDIR/document_`date +%Y%m%d`_`date +%H%M%S`.pdf
              elif [ "$TYP" == "TIF" ]; then
                RESOLUTION=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $2}'`
                scanimage --format tiff --mode Color --resolution="$RESOLUTION" -l 0 -t 0 -x 210mm -y 297mm --source Auto > $TARGETDIR/Scan_`date +%Y%m%d`_`date +%H%M%S`.tif
              elif [ "$TYP" == "DBL" ]; then
                  if [ "$TINT" == "COLOR" ]; then
                      scanimage --format tiff --mode Color --resolution=150 -l 0 -t 0 -x 210mm -y 297mm --source Auto > $TEMPDIRDOUBLE/out$COUNTDOUBLE.tif
                  elif [ "$TINT" == "BLACK" ]; then
                    scanimage --format tiff --mode Gray --resolution=150 -l 0 -t 0 -x 210mm -y 297mm --source Auto > $TEMPDIRDOUBLE/out$COUNTDOUBLE.tif
                  fi
                COUNTDOUBLE=$(($COUNTDOUBLE+1))
              elif [ "$TYP" == "CONV" ]; then
                  scanimage --format tiff --mode Gray --resolution=75 -l 0 -t 0 -x 210mm -y 297mm --source Auto > $TEMPDIR/out$COUNTDOUBLE.tif
                rm $TEMPDIR/*.tif | rm $TEMPDIR/*.pdf
                mv $TEMPDIRDOUBLE/*.tif $TEMPDIR
                tiffcp -c lzw $TEMPDIR/out*.tif $TEMPDIR/temp.tif
                tiff2pdf -z $TEMPDIR/temp.tif -o $TEMPDIR/temp.pdf
                pdfopt $TEMPDIR/temp.pdf $TARGETDIR/document_`date +%Y%m%d`_`date +%H%M%S`.pdf
              fi
            fi
    }
    sleep 5
done




**********************************************************************************************************************************
Zur Erklärung:
- Die Variante PDF Scan scant eine Anzahl, wie in der Variable, und nur genau diese in ein PDF.
Bitte nehmt keine Seite weniger, da sich der Drucker sonst aufhängt. Falls dennoch passiert: Aus-/ Einschalten und Script restarten.
- Die Variante TIF scant normale TIF.
- Die Variante DBL - steht für zweiseitige oder auch Einzelscans in ein PDF. In diesem Schritt werden aber nur TIF erzeugt. Scant
also mittels dem erneuten Ausfruf per Scanto Button so viele Seiten wie gewünscht.
- Unter CONV werden die Seiten aus DBL dann in ein PDF gepackt. Leider müssen wir hier eine Blank Seite scannen, da sich der Drucker
sonst aufhängen würde, welche aber gleich wieder gelöscht wird.
**********************************************************************************************************************************
 
Zuletzt bearbeitet von einem Moderator:

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
17) Startscript für Scanto - Hier habe ich ein Startscript erstellt, welches mittels screen den Prozeß startet.


'ipkg install screen'




S68scanto
Rich (BBCode):
#!/bin/sh
#
# Start / Stop Script for scanto
#
prefix="/opt"
NAME="scanto"
DIR="/usr/local/scanto"
#
#
start() {
       if [ "x$(cat /opt/var/run/$NAME.pid)" != 'x' ]; then
       echo "Service: $NAME is already running"
       else
       echo "Starting Service: $NAME"
       screen -dmS $NAME $DIR/$NAME
       fi
}
#
stop() {
       echo "Stopping Service: $NAME"
       [ "x$(cat /opt/var/run/$NAME.pid)" != 'x' ] && kill $(cat /opt/var/run/$NAME.pid) && echo > /opt/var/run/$NAME.pid
}
#
case "$1" in
       start)
               start
               ;;
       stop)
               stop
               ;;
       restart)
               stop
               sleep 4
               start
               ;;
       *)
               echo "Usage: $0 (start|stop|restart)"
               exit 1
               ;;
esac
#
# End




===> Wir kopieren das Script nach

'cp /<Quellverzeichnis>/S68scanto /opt/etc/init.d/S68scanto'
'chmod 755 /opt/etc/init.d/S68scanto'




===> Danach starten wir scanto per Startsript


'/opt/etc/init.d/S68scanto start'

Rich (BBCode):
/ # /opt/etc/init.d/S68scanto
Usage: /opt/etc/init.d/S68scanto (start|stop|restart)
/ #
/ # /opt/etc/init.d/S68scanto restart
Stopping Service: scanto
Starting Service: scanto
/ #


****************************************************************************************
Achtung: Bitte vor dem Start per Startsript den event. laufenden scanto Prozeß löschen
****************************************************************************************






Viel Spaß beim Testen
Struppix






**********************************************************************************************************************************
Fehlersuche:
- Sollte nicht gescannt werden, scant testweise ( kann nie schaden ) von der Kommandozeile direkt vom Glas, zB.
scanimage --format tiff > /<Zielverzeichnis>/scan.tiff
- Mit dem Ausschalten des Druckers werden die Einträge gelöscht. Danach sind sie mit 'scanto_destination -a *** wieder anzulegen.
**********************************************************************************************************************************




**********************************************************************************************************************************
Offene Punkte:
- Abfrage mit Zeitfenster "letzter Scan + 15 sec ==> stop Scannvorgang + wiederkehrende Schleife für Einzelscan", da an meinem Scanner
der leere Einzug nicht erkannt wird, und der Scanner seinen Dienst mit "error device i|o" quittiert. Hier hilft nur der Neustart.
Man könnte so beliebig vielen Blätter Scannen, da das Script bei "überfälligen" Scan abgebrochen wird. Hier fehlt mir leider das Wissen ..
- Automatisches Löschen von PDF's nach 2 Monaten
.....
**********************************************************************************************************************************
Referenzen // Quellen
http://rende.se/index.php?n=Main.ScanToFolder
http://forum.synology.com/enu/viewtopic.php?f=27&t=14801
http://forum.synology.com/enu/viewtopic.php?f=27&t=14612
http://forum.qnap.com/viewtopic.php?f=19&t=8351&start=20
http://wiki.ubuntuusers.de/SANE-Scanserver_im_Netzwerk
http://wiki.ubuntuusers.de/CUPS
http://sanetwain.ozuzo.net/
http://www.synology-forum.de/showth...ane-Backend-auf-DS-einrichten&highlight=saned
http://wl500g.info/showthread.php?2...Server-mit-XSane-Frontend&p=226834#post226834
http://wiki.ubuntuusers.de/scanbuttond
http://wiki.debianforum.de/Scan2Pdf
http://www.pro-linux.de/artikel/2/101/2,next.html
**********************************************************************************************************************************
 
Zuletzt bearbeitet von einem Moderator:

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
2
Punkte
84
zu 14) Dafür ist doch das "scanto_destination -a <destname>" da.
 

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
zu 14) Dafür ist doch das "scanto_destination -a <destname>" da.

Hi Merthos,

dies ist korrekt. Durch das Script werden die "Variablen" angelegt.

Ich mußte allerdings feststellen, daß das so nicht ganz paßt, da wenn man im Drucker kein "Speicherziel" per Toolbox anlegt ( also gar kein Ziel definiert hat ), dieser auch nicht per Scanto scant. Er meldet dann "PC Scan nicht eingerichtet" osä. Anders hat es bei mir leider nicht funktioniert. Die DS hat die angelegten Variablen erkannt, dem Drucker war das schnuppe.... Keine Ahnung ob das bei dem Ersttester ( erster link unten ) funktioniert hat, bei mir leider nicht.

Erst wenn man zumindest ein Ziel anlegt, geht es. Dann wiederum ist das Script nicht mehr zwingend nötig, das die Ziele direkt aus dem Drucker ausgelesen werden.
Anders ausgedrückt, konnte ich nichts in den Drucker "schreiben" hierzu gibt es ja in dem Beitrag eine "Anleitung" To add the scan-to destination tpw:TPW2, POST the following string to this address:. Das geht aber irgendwie nicht.

Ist im Script der Fehler ? Werde ich nachher nochmals testen. Der Drucker steht aber im Keller, sodaß Muskelkater vorprogrammiert ist.

Wie ich bereits schrieb, bin ich für jeden Tip dankbar, da ich diese Software hasse, und das ist noch Untertreibung. Die ist als Murks noch gelinde bezeichnet ...
Wenn man die Einträge ohne Software auf den Drucker bekommen könnte, wäre das der clou.

Eine Idee, wo es klemmen könnte ?

Struppix
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
2
Punkte
84
Das sieht eigentlich OK aus. Aber durchaus möglich, dass initial noch was anderes gemacht werden muss. Da müsstest Du dann mit einem Netzwerksniffer ran...
 

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Arrrrrrrrrrrrrrrrgggggggg,

wieso hast Du Dich nicht eher gemeldet. :mad: Nene aber mal Scherz beiseite.

Ich habe mal eben den direkten Befehl ins Term geworfen

Rich (BBCode):
wget -q -O - --post-data=AddScanToDest_1=127.0.0.1-tpw%5etpw%3aTPW2%5eDestFolder http://192.168.1.7/hp/device/set_config.html

und siehe da

Rich (BBCode):
 # sh scanto_destination -l
TOSHI:PDF1
TOSHI:PDF2
TOSHI:PDF3
TOSHI:PDF4
TOSHI:PDF5
TOSHI:PDF6
TOSHI:PDF7
TOSHI:PDF8
TOSHI:PDF9
TOSHI:SCAN
TOSHI:TIF300
TOSHI:TIF600
tpw:TPW2

der Eintrag steht drinn.

Nun steht fest, das etwas am Script nicht paßt ! Unglaublich.

Jetzt zum Überprüfen noch eine frei gewählter Eintrag.

Rich (BBCode):
wget -q -O - --post-data=AddScanToDest_1=127.0.0.1-tpw%5eTOSHI%3atest2%5eDestFolder http://192.168.1.7/hp/device/set_config.html

Auch das geht. Brat mir einer nen Storch.

Jetzt habe ich das Script wieder wie im Original mit den =~ geändert:

Rich (BBCode):
#!/bin/bash
# command to maintain the scan-to destination list in the HP Color LaserJet 2840 printer
if [ "$1" == "-a" ]; then
	name=$2
	[[ ! "$name" =~ ":" ]]&& name="$HOSTNAME:$name"
	postdata="AddScanToDest_1=127.0.0.1-$HOSTNAME%5e${name/:/%3a}%5eDestFolder"
	wget -q -O - --post-data="$postdata" http://192.168.0.43/hp/device/set_config.html
elif [ "$1" == "-d" ]; then
	name=$2
	[[ ! "$name" =~ ":" ]]&& name="$HOSTNAME:$name"
	postdata="RemoveScanToDest_1=${name/:/%3a}"
	wget -q -O - --post-data="$postdata" http://192.168.0.43/hp/device/set_config.html
elif [ "$1" == "-l" ]; then
	wget -q -O - http://192.168.0.43/hp/device/info_scanto_destinations.xml \
	| sed -n '/<DeviceDisplay>/s/<\/*DeviceDisplay>//gp'
else
	echo 'usage: scanto_destination -l -a <destname> -d <destname> for listing adding and deleting destinations'
fi

Auch jetzt wird der Eintrag angelegt. Sagenhaft. Das hat vorher nicht geklappt. Er spuckt nur die Meldung aus "sh: =~: unknown operand", aber er macht es.

Jetzt zum Schluß den Drucker ausgeschalten, und damit alle Einträge gelöscht. Und es klappt doch. Danke Merthos.

Zum Schluß: Merthos, hast Du ne Idee, wie ich die Einträge

Rich (BBCode):
TOSHI:PDF1
TOSHI:PDF2
TOSHI:PDF3
TOSHI:PDF4
TOSHI:PDF5
TOSHI:PDF6
TOSHI:PDF7
TOSHI:PDF8
TOSHI:PDF9
TOSHI:SCAN
TOSHI:TIF300
TOSHI:TIF600

mit einmal reinbekomme, ohne das Script für jeden Eintrag einzeln aufzufen zu müssen ?

===> Kann Bitte mal ein Administrator die Beiträge 2, 3, 4, 5 nochmal zum Editeren aufmachen. Danke


Vielen Dank Merthos

PS: Ich bin natürlich jedesmal zum Drucker geflitz, um es zu überprüfen.
 
Zuletzt bearbeitet:

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
2
Punkte
84
Du kannst einfach die Zeilen rausnehmen, die fügen nur den Teil vor dem : hinzu, wenn nicht enthalten.

Ansonsten mach Dir ein (weiteres) Skript, das die alle anlegt.
 

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Du kannst einfach die Zeilen rausnehmen, die fügen nur den Teil vor dem : hinzu, wenn nicht enthalten.

Ansonsten mach Dir ein (weiteres) Skript, das die alle anlegt.

Hi Merthos,

Dein Post meint zwar etwas anderes, hat mich aber auf eine interessante Idee gebracht. Nachdem ich gestern und heute morgen ein wenig probiert habe, wie gesagt der Drucker steht im Keller puhhhh, ist mir folgendes aufgefallen, was im Nachhinein umso logischer erscheint.

Wie ich bereits schrieb ist die "Variable", die durch die eigentliche HP Software Toolbox angelegt wird "Hostname (Abkürzung max. 5 Zeichen) plus Doppelpunkt plus einen Namen für das Speicherziel".
Jetzt habe ich überlegt, prüft der Drucker den vorhandenen Host im NW, aber wie sollte er das machen. Somit bleibt die Erkenntnis nach meinen Tests, das dies nur dem identifizieren des eigentlichen Computer dient, der ja selber nur lauscht ob ein Scan kommt, mehr nicht. Dies führt mich zu dem Fazit, daß man das überhaupt nicht braucht. Wenn man nun mit dem Script ein wenig spielt (es erstellt die Destinations aber auch so), merkt man, das man nur den Namen angeben muß. Also zB. nicht TOSHI:pDF1, sondern nur PDF1.

Hier ein Auszug:

Rich (BBCode):
/ # sh /usr/local/scanto/scanto_destination -l
PDF_1_BLACK
PDF_1_COLOR
TIF_150_DPI
TIF_300_DPI
TIF_600_DPI
/ #

Struppix
 

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Hi Merthos,

ich hatte wieder mal etwas Zeit, für eine neue Idee. Hier komme ich aber nicht weiter und bräuchte etwas Hilfe :eek:

Wie von Dir angedeutet habe ich mir ein kleines Script erstellt, was meine "Variablen" in einem Rutsch zum Drucker schickt.

scanto_destination_auto
Rich (BBCode):
#!/bin/sh
# Default options, modify to your needs

DIR="/usr/local/scanto"
LIST="scanto_destination_list"
COMMAND="scanto_destination -a"

for i in $(cat $LIST); do sh $DIR/$COMMAND $i ; done

Hierzu benötigen wir eine Liste in der die Variablen stehen.

scanto_destination_list
Rich (BBCode):
PDF_1_BLACK
PDF_1_COLOR
PDF_2_BLACK
PDF_2_COLOR
PDF_3_BLACK
PDF_3_COLOR
PDF_4_BLACK
PDF_4_COLOR
PDF_5_BLACK
PDF_5_COLOR
PDF_6_BLACK
PDF_6_COLOR
PDF_7_BLACK
PDF_7_COLOR
PDF_8_BLACK
PDF_8_COLOR
PDF_9_BLACK
PDF_9_COLOR
TIF_150_DPI
TIF_300_DPI
TIF_600_DPI

Wie man sieht, ist das aber recht lang, da ich ja beim pdf die Zeilenanzahl vorgeben muß ... Wäre schön, wenn jemand da ne Idee hätte.

Außerdem habe ich mir auch mittels einer Vorlage ein php gebastelt, was die Einträge in der Liste vornehmen und ich denke auch scanto starten kann.

Nun die Idee: Die Liste auszufüllen macht erst dann Sinn, wenn man den Inhalt im Script scanto abfragen und vergleichen kann.

scanto ==> Auszug
Rich (BBCode):
#!/bin/sh
# Default options, modify to your needs

TARGETDIR="/volume1/download/_Scan"
TEMPDIR="/usr/local/scanto"
LIST="scanto_destination_list"

cd /$TEMPDIR
echo $$ > /opt/var/run/scanto.pid
set -o pipefail
while true; do
	# if scan-to button pressed - run the command corresponding to the destination name
	name=`wget -q -O - http://192.168.1.7/hp/device/notifications.xml \
			| egrep -o '<ScanToDeviceDisplay>(.*)</ScanToDeviceDisplay>' \
			| sed -e 's/<ScanToDeviceDisplay>//' \
			| sed -e 's/<\/ScanToDeviceDisplay>//' \
			| sed -e 's/.*://'` && {
		if [ "$name" != "" ]; then                                         # gibt die Auswahl (Variable) bei Betätigung des Scanto Buttons aus
                                          for i in $(cat $LIST); do                # gibt Zeilenweise alle Variablen der Liste aus
                                          if [ "$name" = "PDF_(Hier müßte die Var Zähler stehen / abgefragt werden)_(Hier müßte die Var Black oder Color stehen /abgefragt werden" ]; then
                                          scanimage blablabla

Also nochmals zur Erläuterung:
- Ich möchte das ewig lange Script kürzen, aber mit Variablen, die die Einträge mit der Liste vergleichen
- Im Beispiel: Scanto Button gibt PDF_1_Black
Wir vergleichen die Ausgabe mit dem Eintrag der Liste, aber derart mit Variablen, welche erzeugt oder ersetzt werden, das ich diese im nachfolgenden Befehl zur Vereinfachung gleich verwenden kann.

Das tolle wäre nämlich dann, wenn man sich an den Terminus hält, man noch Éinträge in der Liste aufnehmen könnte, ohne die Scripe ändern zu müssen.


Ich hoffe, mich einigermaßen verständlich ausgedrückt zu haben.

Danke
Struppix
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
2
Punkte
84
Ändern die sich so oft, dass es den Aufwand wert ist?

Ansonsten ist der Weg wie in dem Ursprungsposting, das Du verlinkt hattest, schon ganz gut. Also ein Verzeichnis mit Skripten, wobei jedes eine dieser Konfigurationen darstellt. Der Name ist die Konfiguration, über ein Verzeichnislisting kannst Du den Drucker initial befüllen und im Scan-Monitor-Skript rufst Du einfach das Skript passend zum Namen auf.
 
Zuletzt bearbeitet:

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Ändern die sich so oft, dass es den Aufwand wert ist?

Nein, natürlich nicht. Es ist aber ne schöne "Spielerei", und ich komme endlich mal dazu, mich mit dem Thema Scripting mehr zu befassen.

Nun muß ich allerdings beim Thema Variablen im Vergleich passen. Da muß ich mich erst etwas genauer belesen.

..........Scanto Button - (Wert).....<=Vergleich=>......Listenausgabe - (Wert)............
..........(PDF_1_BLACK)................<=Vergleich=>......((PDF_$(VAR1)_$(VAR2))..........

Die Variablen
1 = Zähler und
2 = Black // Color möchte ich abfragen und gleichzeitig "belegen", sodaß ich dann den Befehl

'scanimage blabla $VAR1 blabla $VAR2 blabla' ausführen kann. Somit kann das Script neutral bleiben, wenn in einem Schritt die Variablen abgefragt und mit der Ausgabe belegt werden. Geht das ?

Wie mache ich das vom Syntax her, und wie lege ich den Zähler an, bzw. muß ich den anlegen ??? Ich raffe das noch nicht.

Struppix
 

Merthos

Benutzer
Mitglied seit
01. Mai 2010
Beiträge
2.709
Punkte für Reaktionen
2
Punkte
84
Na wenn es zum Lernen ist, dann nur ein paar Stichworte: regex in (ba)sh, echo + tr oder awk. :D Mit allen drei Varianten kann man den Namen splitten, so dass Du die einzelnen Bestandteile hast, wobei awk wahrscheinlich die am einfachsten verständliche sein dürfte.
 

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Hi,

nachdem ich dieses Wochenende wieder etwas Zeit hatte, ist dieses Script entstanden:

scanto
Rich (BBCode):
#!/bin/sh
# Default options, modify to your needs

DIR="/usr/local/scanto"                        # Hier werden die Scripte abgelegt
TARGETDIR="/volume1/download/_Scan"            # Hier werden die Scans gespeichert
TEMPDIR="/usr/local/scanto"                    # Hier werden die TIF und PDF Dateien zwischengespeichert
DESTINATION="scanto_destination -a"            # Script zum Speichern der Variablen ff.
LIST="scanto_destination_list"                 # In dieser Liste speichern wir die Variablen = Auswahl im Drucker für "Scanto Button"
                                               # Folgende Varianten sind zulaessig, Beispiele: PDF_5_COLOR ( PDF_Anzahl Seiten_COLOR|BLACK )
                                               #                                               TIF_300_DPI ( TIF_Aufloesung nach Scanner_DPI )


for i in $(cat $DIR/$LIST); do sh $DIR/$DESTINATION $i ; done

cd /$TEMPDIR
echo $$ > /opt/var/run/scanto.pid
set -o pipefail
while true; do
	# if scan-to button pressed - run the command corresponding to the destination name
	NAME=`wget -q -O - http://192.168.1.7/hp/device/notifications.xml \
			| egrep -o '<ScanToDeviceDisplay>(.*)</ScanToDeviceDisplay>' \
			| sed -e 's/<ScanToDeviceDisplay>//' \
			| sed -e 's/<\/ScanToDeviceDisplay>//' \
			| sed -e 's/.*://'` && {
			if [ "$NAME" != "" ]; then
			TYP=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $1}'`
			  if [ "$TYP" == "PDF" ]; then
				rm $TEMPDIR/out*.tif | rm $TEMPDIR/temp.tif | rm $TEMPDIR/temp.pdf
				TINT=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $3}'`
				COUNT=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $2}'`
				  if [ "$TINT" == "COLOR" ]; then
				  	scanimage --format tiff --mode Color --batch-count="$COUNT" --resolution=150 -l 0 -t 0 -x 210mm -y 297mm --source Auto
				  elif [ "$TINT" == "BLACK" ]; then
					scanimage --format tiff --mode Gray --batch-count="$COUNT" --resolution=150 -l 0 -t 0 -x 210mm -y 297mm --source Auto
				  fi
				tiffcp -c lzw $TEMPDIR/out*.tif $TEMPDIR/temp.tif
				tiff2pdf -z $TEMPDIR/temp.tif -o $TEMPDIR/temp.pdf
				pdfopt $TEMPDIR/temp.pdf $TARGETDIR/document_`date +%Y%m%d`_`date +%H%M%S`.pdf
			  elif [ "$TYP" == "TIF" ]; then
				RESOLUTION=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $2}'`
				scanimage --format tiff --mode Color --resolution="$RESOLUTION" -l 0 -t 0 -x 210mm -y 297mm --source Auto > $TARGETDIR/Scan_`date +%Y%m%d`_`date +%H%M%S`.tif
			fi
		 fi
	}
	sleep 5
done

Mittels der scanto_destination_list wird beim Start der Drucker automatisch mit dem Startstript "befüllt".

Ich habe zwar auch eine Variante mit dem Vergleich zur Liste erstellt, aber dann verworfen. Letztlich muß die geänderte Liste eh zum Drucker übertragen werden, was wir nun mit einem Rutsch machen.

Als letztes werde ich noch ein wenig mit dem Scannen von beidseitigen Vorlagen experimentieren. Vielleicht gibt es ja da auch eine Lösung ...

Struppix
 
Zuletzt bearbeitet:

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Hallo,

nachdem jahlives den ursprünglichen Beitrag #1-4 für mich nochmals editiert hat ( vielen Dank ... ), ist die Anleitung wieder auf dem neuesten Stand.

Geändert wurde ua.
- wir benötigen die Toolbox nun doch nicht mehr und lösen dies per script
- die Liste der Variablen wird jetzt per Liste auf einmal zum Scanner übertragen - äußerst praktisch
- es können über einen einfachen Umweg doppelseite Vorlagen als PDF gescannt werden - siehe Anleitung
- dem Startscript wurde die Abfrage hinzugefügt, ob der Prozeß brereits läuft, da man ihn doppelt starten konnte ...

Zur Fehlersuche ist mir aufgefallen, das der dbus-daemon beim Neustart des Systems manchmal nicht sauber gestartet wird.
Dies äußert sich zB. beim Scannen mit der Fehlermeldung.

Rich (BBCode):
/ # scanimage --format tiff --source Auto > /volume1/download/scan.tiff
process 12088: arguments to dbus_connection_send() were incorrect, assertion "connection != NULL" failed in file dbus-connection.c line 3141.
This is normally a bug in some application using the D-Bus library.
  D-Bus not built with -rdynamic so unable to print a backtrace
Aborted (core dumped)
/ #

Wir löschen dann die PID von Hand
'rm /opt/var/run/dbus/pid'

und starten dbus mittels
'/opt/etc/init.d/S20dbus start' neu

Rich (BBCode):
# /opt/etc/init.d/S20dbus restart
Stopping system message bus: killall: /opt/bin/dbus-daemon: no process killed
/opt/var/run/dbus # /opt/etc/init.d/S20dbus start
Starting system message bus: dbus.
/opt/var/run/dbus # ps | grep dbus
14705 root      2132 S    /opt/bin/dbus-daemon --system
14729 root      2476 S    grep dbus
/opt/var/run/dbus #

Struppix
 

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Endlich - Seitenanzahl automatisch dem ADF überlassen ...

Bisher hat der automatische Blatteinzug beim Scannen ja nur mit Angabe der zu scannenende Seiten funktioniert. Dies war äußerst umständlich.
Als ich vor einiger Zeit beim Stöbern auf diese Seite gestoßen bin, kam der richtige Anstoß ... Die Variable beim Scannen --source ADF ist die Lösung. Ich könnte schwören dies getestet zu haben, aber was soll's.

Nun funktioniert auch das tadellos, sodaß wir auf die Angabe der Seiten verzichten können. Im www wird berichtet, daß der ADF nur etwa 20 Seiten in einem Rutsch annimmt. Dies kann ich nicht bestätigen. Er frißt auch 30 und mehr.

Die unterstützten Funktionen könnt ihr an Euerem Scanner mittels 'scanimage -A' entlocken.

Hier nun die aktuellsten Scripte

scanto
Rich (BBCode):
#!/bin/sh
# Default options, modify to your needs

DIR="/usr/local/scanto"							# Hier werden die Scripte abgelegt
TARGETDIR="/volume1/download/_Scan"				# Hier werden die Scans gespeichert
TEMPDIR="/usr/local/scanto/tmp"					# Hier werden die TIF und PDF Dateien zwischengespeichert
TEMPDIRDOUBLE="/usr/local/scanto/tmp/convert"	# Hier werden die TIF Dateien für die PDF Konvertierung beim Einzelscan (=DBL) zwischengespeichert
DESTINATION="scanto_destination -a"				# Script zum Speichern der Variablen im AllInOne ff.
LIST="scanto_destination_list"					# In dieser Liste speichern wir die Variablen = Auswahl im AllInOne für "Scanto Button"
												# Folgende Varianten sind zulaessig, Beispiele:
												# PDF_COLOR ( PDF_COLOR|BLACK )						==> Scan von Seiten dieser Auswahl mit dem ADF in ein PDF
												# TIF_300_DPI ( TIF_Aufloesung nach Scanner_DPI )	==> Scan einzelner Seiten mit dieser Aufloesung in ein TIF
												# DBL_SCN_BLACK ( DBL_SCN_BLACK|COLOR )				==> Scan einzelner Seiten in ein tmp Verz. zum Konvertieren
												# CONV_TO_PDF										==> Konvertiert einzelne Seite aus tmp Verz. in ein PDF
COUNTDOUBLE=101

for i in $(cat $DIR/$LIST); do sh $DIR/$DESTINATION $i ; done  # Diese Zeile legt die einzelnen "Variablen" im AllInOne an

cd /$TEMPDIR
echo $$ > /opt/var/run/scanto.pid
set -o pipefail
while true; do
	# if scan-to button pressed - run the command corresponding to the destination name
	NAME=`wget -q -O - http://192.168.1.7/hp/device/notifications.xml \
			| egrep -o '<ScanToDeviceDisplay>(.*)</ScanToDeviceDisplay>' \
			| sed -e 's/<ScanToDeviceDisplay>//' \
			| sed -e 's/<\/ScanToDeviceDisplay>//' \
			| sed -e 's/.*://'` && {
			if [ "$NAME" != "" ]; then
			TYP=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $1}'`
			TINT=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $2}'`
			  if [ "$TYP" == "PDF" ]; then
				rm $TEMPDIR/*.tif | rm $TEMPDIR/*.pdf
				  if [ "$TINT" == "COLOR" ]; then
				  	scanimage --batch --batch-start=11 --format=tiff --mode Color --resolution=150 -l 3 -t 0 -x 210 -y 297 --source ADF
				  elif [ "$TINT" == "BLACK" ]; then
					scanimage --batch --batch-start=11 --format=tiff --mode Gray --resolution=150 -l 3 -t 0 -x 210 -y 297 --source ADF
				  fi
				tiffcp -c lzw $TEMPDIR/out*.tif $TEMPDIR/temp.tif
				tiff2pdf -z $TEMPDIR/temp.tif -o $TEMPDIR/temp.pdf
				pdfopt $TEMPDIR/temp.pdf $TARGETDIR/document_`date +%Y%m%d`_`date +%H%M%S`.pdf
			  elif [ "$TYP" == "TIF" ]; then
				RESOLUTION=`echo "$NAME" | awk 'BEGIN { FS = "_" } ; { print $2}'`
				scanimage --format tiff --mode Color --resolution="$RESOLUTION" -l 0 -t 0 -x 210 -y 297 --source Auto > $TARGETDIR/Scan_`date +%Y%m%d`_`date +%H%M%S`.tif
			  elif [ "$TYP" == "DBL" ]; then
				  if [ "$TINT" == "COLOR" ]; then
				  	scanimage --format tiff --mode Color --resolution=150 -l 0 -t 0 -x 210 -y 297 --source Auto > $TEMPDIRDOUBLE/out$COUNTDOUBLE.tif
				  elif [ "$TINT" == "BLACK" ]; then
					scanimage --format tiff --mode Gray --resolution=150 -l 0 -t 0 -x 210 -y 297 --source Auto > $TEMPDIRDOUBLE/out$COUNTDOUBLE.tif
				  fi
				COUNTDOUBLE=$(($COUNTDOUBLE+1))
			  elif [ "$TYP" == "CONV" ]; then
			  	scanimage --format tiff --mode Gray --resolution=75 -l 0 -t 0 -x 210 -y 297 --source Auto > $TEMPDIR/out$COUNTDOUBLE.tif
				rm $TEMPDIR/*.tif | rm $TEMPDIR/*.pdf
				mv $TEMPDIRDOUBLE/*.tif $TEMPDIR
				tiffcp -c lzw $TEMPDIR/out*.tif $TEMPDIR/temp.tif
				tiff2pdf -z $TEMPDIR/temp.tif -o $TEMPDIR/temp.pdf
				pdfopt $TEMPDIR/temp.pdf $TARGETDIR/document_`date +%Y%m%d`_`date +%H%M%S`.pdf
			  fi
			fi
	}
	sleep 5
done

scanto_destination_list
Rich (BBCode):
PDF_BLACK
PDF_COLOR
TIF_150_DPI
TIF_300_DPI
TIF_600_DPI
DBL_COLOR_SCN
DBL_BLACK_SCN
CONV_TO_PDF

Außerdem habe ich das Startscript nochmals geändert. Wurde der Prozeß unverhergesehen beendet kam es zu Problemen. Nun wird das PID des Prozeßes mit dem Eintrag des PIDFILE verglichen, sodaß scanto richtig und nicht doppelt gestartet wird.

S68scanto
Rich (BBCode):
#!/bin/sh
#
# Start / Stop Script for scanto
#
prefix="/opt"
NAME="scanto"
DIR="/usr/local/scanto"
#
#
start() {
      	PID=`ps | egrep -v 'grep /bin/sh /usr/local/scanto/scanto' | grep '/bin/sh /usr/local/scanto/scanto' | awk '{print $1}'`
      	if [ "$PID" == "" ]; then
		echo "Starting Service: $NAME"
	  	screen -dmS $NAME $DIR/$NAME
		else
			PIDFILE=`cat /opt/var/run/$NAME.pid`
			if [ "$PIDFILE" != "" ]; then
				if [ "$PIDFILE" == "$PID" ]; then
				echo "Service: $NAME is already running"
				else
				kill $(ps | egrep -v 'grep SCREEN -dmS scanto' | grep 'SCREEN -dmS scanto' | awk '{print $1}')
				echo "Starting Service: $NAME"
				screen -dmS $NAME $DIR/$NAME
				fi
			fi
      	fi
}
#
stop() {
       echo "Stopping Service: $NAME"
       [ "x$(cat /opt/var/run/$NAME.pid)" != 'x' ] && kill $(cat /opt/var/run/$NAME.pid)
       echo > /opt/var/run/$NAME.pid
}
#
case "$1" in
       start)
               start
               ;;
       stop)
               stop
               ;;
       restart)
               stop
               sleep 4
               start
               ;;
       *)
               echo "Usage: $0 (start|stop|restart)"
               exit 1
               ;;
esac
#
# End


Gruß
Struppix
 

Gunman

Benutzer
Mitglied seit
20. Feb 2013
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Hallo Struppix (oder wer sonst helfen kann),

danke für die Arbeit! Ich hoffe sehr, das umsetzen zu können auf eine DS 112+ mit Laserjet 3055. Allerdings bin ich ein echter Newbie, was Linux und die Kommandozeile angeht.

Bisher ging alles gut, aber jetzt hänge ich hier:

4) Startscript für cups anlegen; s55cupsd aus dem wiki kopieren; Zeilenumbruch Unix/linux beachten

'cp /<Quellverzeichnis>/S55cupsd /opt/etc/init.d/S55cupsd'

Ich finde auf der 112+ keine Datei oder Ordner mit dem Namen S55cupsd (wohl aber /usr/syno/etc.defaults/rc.d/S55cupsd.sh). Aus welchem Wiki soll ich das kopieren? Wo finde ich das <Quellverzeichnis>? Und was macht diese S55cupsd überhaupt?

Und noch was zu 3 f) cupsd.conf
===> unter "Network Options" ändern
# Listen hostname:631 >>>>> Listen 192.168.1.5:631

Ist damit die IP des Druckers gemeint?

Wenn mir jemand helfen kann, schon mal eine großes Danke im Voraus.

LG Gunnar
 

Struppix

Benutzer
Mitglied seit
10. Apr 2009
Beiträge
883
Punkte für Reaktionen
185
Punkte
63
Hallo Gunar,

ich möchte mal kurz auf Deine Fragen antworten.

Die Datei S55cupsd kannst Du dort nicht finden, da wir sie in diesem Schritt erst anlegen. Es handelt sich um eine Startdatei um den Druckerdienst zu starten.
Die DS bringt eine Standard Installation für CUPS mit, die wir ersetzen.
Einen Link ins Wiki findest Du hier.
Interessant ist der Absatz "syno DSM CUPS beenden und ipkg CUPS installieren", "und syno cups dauerhaft stoppen" und "start/stop script für cups anlegen" mit dem Link zum Script.

Ich habe diese Schritte ein wenig gestrafft. Grundsätzlich findest Du vieles in unserem Wiki.


Bitte lies Dir meine Anleitung mal komplett durch.

Gleich in dem Punkt Deiner zweiten Frage 4) findest Du die Antwort.
Die IP ist die der DiskStation ( in dem Fall meiner DS ) und 631 ist der Port, auf dem die Druckerverbindung läuft. Der Dienst "lauscht" nun nach Aus- oder Eingänge auf diesem Port.
Später kannst Du Dich unter der IP Deiner DS und diesem Port am Webinterface anmelden, um die Druckereinstellungen vorzunehmen. Dies findest Du unter Punkt 13).

Eine Frage mal zum Schluß:
Da ich den Drucker nicht kenne, hast Du mal geschaut, ob Du bei Deinem Drucker die Seiten
http://<IP_Deines_Drucker>/hp/device/info_scanto_destinations.xml; set_config.html; notifications.xml
aufrufen kannst ?


Ich hoffe war alles verständlich ...

Gruß
Karsten
 

Gunman

Benutzer
Mitglied seit
20. Feb 2013
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Hallo Karsten,

die drei Seiten kann ich aufrufen. Allerdings zeigt mein Firefox bei set_config.html nur Kästchen bzw. Formularfelder o.Ä..

Ich bin auch einen Schritt weiter - hoffe ich jedenfalls. Das Webinterface bekomme ich nun über 'https://diskstation:631/printers/' zu sehen. Dort habe ich den Drucker konfiguriert. Die Testseite spuckt er brav aus. Der Treiber heißt "HP LaserJet 3052 Postscript". Der 3052 entspricht bis auf die Faxfunktion meinem Drucker.

Ich habe diesen Weg des Setup gewählt, weil '/opt/share/hplip # hp-makeuri' und '/opt/share/hplip # hp-setup' nicht funktionieren. Die Diskstation meckert, dass sie die Befehle nicht kennt. Es ist aber Python25 installiert. '/opt/share/hplip/' enthält auch entsprechende PY-Scripte. Aber ich bekomme sie nicht zum Laufen.

'lpstat -t' gibt aus:
scheduler is running
system default destination: HPLJ_3055
device for HPLJ_3055: socket://192.168.0.5
HPLJ_3055 accepting requests since Sat Sep 28 17:22:17 2013
printer HPLJ_3055 is idle. enabled since Sat Sep 28 17:22:17 2013
Ready to print.

Wenn ich deine Angaben als Vorlage nehme, bekomme ich folgendes:
> lpstat -t
scheduler is running
system default destination: HPLJ_3055
device for HPLJ_3055: hp:/net/hp-laserjet_3052?ip=192.168.0.5
HPLJ_3055 accepting requests since Sat Sep 28 17:52:55 2013
printer HPLJ_3055 is idle. enabled since Sat Sep 28 17:52:55 2013
/opt/lib/cups/backend/hp failed


'scanimage --list-devices' meldet:

No scanners were identified. ...


Vermutlich ist es irgendein Noob-Fehler. Aber hier hänge ich gerade fest. Wenn du (oder sonst wer) einen hilfreichen Tip hast, wäre das super.

Gruß, Gunnar
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat