Tak jsem navic zjistil, ze scanimage zpusobuje chybu, kdyz rozmer skenovane plochy je pres 210 x 250 bodu.
pnmtojpeg: EOF / read error reading a row of pixels
Standardni A4 je ale samozrejme vetsi, takze zmensit skenovanou plochu neni reseni.
Zjistil jsem, ze sice ohlasi chybu, ale vyprodukuje soubor a pnmtojpeg he prevede na jpeg. V souboru je chyba videt, posledni radek obrazku neni dokonceny, ale obecne to nevadi. 297 bodu uz je za koncem A4, takze obsah je zachovany cely.
Script ScannerStorage.php jsem musel upravit. Pridat do nej zdroj flatbed a vykomentovat kontrolu navratoveho stavu. Viz, ze chybu ohlasi vzdy a presto chci vysledek ulozit.
S timto hackem to uz funguje dobre.
Jeste jsem zapomnel popsat usecase:
- scanovani z pocitace, kde neni nainstalovany scanner
- scanovani z pocitace, ktery je pres vpn pripojen ven a nevidi tedy domaci sit (nextcloud je pristupny zvenku)
upravena sekce ScannerStorage.php
<------>public function scanFile($name, $mode = 0, $resolution = 300) { <------><------>if ($this->storage->nodeExists($name)) { <------><------><------>// TODO: This can happen because we don't refresh the file listing <------><------><------>throw new StorageException($this->trans->t('File already exists'));
<------><------>}
<------><------>$file = $this->storage->newFile($name);
<------><------>// TODO: There's probably a way to stream this without the tempfile
<------><------>exec(
<------><------><------>"sudo scanimage --mode {$this->modes[$mode]} --source flatbed --resolution {$resolution} -x 215 -y 297| pnmtojpeg > /tmp/img",
<------><------><------>$output,
<------><------><------>$status
<------><------>);
#<-----><------>if ($status) {
#<-----><------><------>throw new StorageException($this->trans->t('Something went wrong while attempting to scan'));
#<-----><------>}
<------><------>$data = file_get_contents('/tmp/img');
<------><------>$file->putContent($data);
<------><------>return $this->trans->t('Success');
<------>}