Regina Schaukrug: Linux, Scanner (Quelltext des schon "fertigen" Zeugs)

Beitrag lesen

Was schon läuft:

<?php

class AllScanners {
	
	public $arScanners = false;

	function __construct() {
		if ( false === $this ->  arScanners ) {
			$this -> detectScanners();
	  }
	}
	
	function detectScanners()  {
		
		#$returns = `scanimage -A;`;

    ##### Für die Test (so gehts schneller) ###
		$returns = "
All options specific to device `BrotherADS2200:libusb:001:007':
    -l 0..165.1mm [0]
        Top-left x position of scan area.
    -t 0..304.8mm [0]
        Top-left y position of scan area.
    -x 50.8..215.9mm [215.9]
        Width of scan-area.
    -y 50.8..355.6mm [355.6]
        Height of scan-area.
    --resolution 100|150|200|300|400|600dpi [200]
        Sets the resolution of the scanned image.
    --mode Black & White|Gray|24 bit Color [Black & White]
        Selects the scan mode (e.g., lineart, monochrome, or color).
    --source Automatic Document Feeder(left aligned)|Automatic Document Feeder(left aligned,Duplex) [Automatic Document Feeder(left aligned)]
        Selects the scan source (such as a document-feeder).		
";		
		
		$lines = explode ( "\n", $returns );
		$scannerID = -1;
		foreach ( $lines as $line ) {
			$line = trim ( $line );
			if ( "" !== $line ) {
				#echo $line . "\n";
				if ( 0 === strpos( $line, "All options specific to device"  ) ) {
					$scannerID ++;
					$beginName = strpos( $line, '`' ) + 1 ;
					$endName   = strpos( $line, ':' ) - $beginName;					    
					$arScanners[$scannerID] = array();
					$arScanners[$scannerID]['ScannerName'] = substr ( $line, $beginName, $endName );
					$optionCounter = -1;
						
				} elseif ( 0 === strpos( $line, '-') ) {
					$optionCounter ++;
					list( $option, $rest ) = explode ( ' ', $line, 2 );
					$optionName = str_replace('-', '', $option ) ;					
					$arScanners[$scannerID]['options'][$optionCounter]['option'] = $option;
					$arScanners[$scannerID]['options'][$optionCounter]['optionName'] = $optionName;

				} else {
					if (  strpos ( $rest, '..' ) ) {
						$arScanners[$scannerID]['options'][$optionCounter]['Type'] = 'FromTo';
						list( $values, $rest2 ) = explode ( ' ', $rest );
						List ($strMin, $strMax ) = explode ('..', $values );
						$arScanners[$scannerID]['options'][$optionCounter]['minValue'] = (float)$strMin;
						$arScanners[$scannerID]['options'][$optionCounter]['maxValue'] = (float)$strMax;
						$arScanners[$scannerID]['options'][$optionCounter]['Unit'] = str_replace( (string)(float)$strMax, '', $strMax );
						$arScanners[$scannerID]['options'][$optionCounter]['defaultValue'] = substr( $rest2, 1, -1 );
					} elseif ( strpos ( $rest, '|' ) ) {
						$arScanners[$scannerID]['options'][$optionCounter]['Type'] = 'OneOf';
						list( $values, $rest2 ) = explode ( '[', $rest );						
						$values = explode( '|', trim( $values ) );
						
						$arScanners[$scannerID]['options'][$optionCounter]['defaultValue'] = substr( $rest2, 0, -1 );
						$strLastValue = array_pop( $values );
						
						$floatLastValue  = (float)$strLastValue;
						if ( $floatLastValue and false === strpos($strLastValue, ' ' ) ) { 
							$values[] = $floatLastValue;
							$arScanners[$scannerID]['options'][$optionCounter]['Unit'] = str_replace( (string)$floatLastValue , '', $strLastValue );
						} else {
							$values[] = $strLastValue;
						}
						
						
						$arScanners[$scannerID]['options'][$optionCounter]['values'] = $values;
						
				    } 
				    
					$arScanners[$scannerID]['options'][$optionCounter]['Description'] = $line;
				}
			}
		}
		$this -> arScanners = $arScanners;
	}

    function showScanners () {
		    print '<pre>';
			print_r( $this -> arScanners );
	}	
	
}

####### Test: ###############
$scanner = new AllScanners();
$scanner->showScanners();

Ausgaben:

Array
(
    [0] => Array
        (
            [ScannerName] => BrotherADS2200
            [options] => Array
                (
                    [0] => Array
                        (
                            [option] => -l
                            [optionName] => l
                            [Type] => FromTo
                            [minValue] => 0
                            [maxValue] => 165.1
                            [Unit] => mm
                            [defaultValue] => 0
                            [Description] => Top-left x position of scan area.
                        )

                    [1] => Array
                        (
                            [option] => -t
                            [optionName] => t
                            [Type] => FromTo
                            [minValue] => 0
                            [maxValue] => 304.8
                            [Unit] => mm
                            [defaultValue] => 0
                            [Description] => Top-left y position of scan area.
                        )

                    [2] => Array
                        (
                            [option] => -x
                            [optionName] => x
                            [Type] => FromTo
                            [minValue] => 50.8
                            [maxValue] => 215.9
                            [Unit] => mm
                            [defaultValue] => 215.9
                            [Description] => Width of scan-area.
                        )

                    [3] => Array
                        (
                            [option] => -y
                            [optionName] => y
                            [Type] => FromTo
                            [minValue] => 50.8
                            [maxValue] => 355.6
                            [Unit] => mm
                            [defaultValue] => 355.6
                            [Description] => Height of scan-area.
                        )

                    [4] => Array
                        (
                            [option] => --resolution
                            [optionName] => resolution
                            [Type] => OneOf
                            [defaultValue] => 200
                            [Unit] => dpi
                            [values] => Array
                                (
                                    [0] => 100
                                    [1] => 150
                                    [2] => 200
                                    [3] => 300
                                    [4] => 400
                                    [5] => 600
                                )

                            [Description] => Sets the resolution of the scanned image.
                        )

                    [5] => Array
                        (
                            [option] => --mode
                            [optionName] => mode
                            [Type] => OneOf
                            [defaultValue] => Black & White
                            [values] => Array
                                (
                                    [0] => Black & White
                                    [1] => Gray
                                    [2] => 24 bit Color
                                )

                            [Description] => Selects the scan mode (e.g., lineart, monochrome, or color).
                        )

                    [6] => Array
                        (
                            [option] => --source
                            [optionName] => source
                            [Type] => OneOf
                            [defaultValue] => Automatic Document Feeder(left aligned)
                            [values] => Array
                                (
                                    [0] => Automatic Document Feeder(left aligned)
                                    [1] => Automatic Document Feeder(left aligned,Duplex)
                                )

                            [Description] => Selects the scan source (such as a document-feeder).
                        )

                )

        )

)

Wie ich das Linux dazu bekomme, dem www-run das Scannen zu erlauben weiß ich auch schon. Ein einfaches Scan-Script (mit fixen Optionen) läuft ebenfalls bereits.