CUIで格安文書管理

格安文書管理システムの作り方

パソコンを持っている人は一度は、散在するカタログや切抜きを電子化してしまいたいと思ったことがあるのではないでしょうか。机の上も片付いて、紛失もしなくなるのではと思ったことがあるでしょう。Windows にはそのようなソフトがありますが、Linux にはありません。文書を呼び出すためだけのために再起動するのは面倒臭いし、ひとつここは自分で作ってみましょう。Linux にはただで WWW サーバーがついて来るのでいっそのこと、文書をネットワークから見えるようにしましょう。つぎの4つのスクリプトを作成すれば、ブラウザーで電子化した文書を閲覧できます。

ここをクリックすると見本を見ることができます

このスクリプトを動かすためには、予備知識として、ネットワークの設定、Apache の設定、CGIの知識、SANE(Linuxでスキャナーを使うためのAPI)のインストールが必要です。スクリプトの内訳は、ブラウザーにフレームを表示する index.html を作成するためのスクリプト makeindex.pl、フレームに文書を表示するための CGI スクリプト A.cgi、page.cgi、スキャナーからのデータを jpeg ファイルにする scangray スクリプトです。

Vine Linux の場合、Apache の rpm をインストールしたときに何も設定しなくても、netscape を起動して URL が、localhost および localhost/cgi-bin/namazu.cgi で入力したときに、ページが表示されれば、

$ mkdir /home/(user id)/public_html
$ chmod 755 /home/(user id)/
$ chmod 755 /home/(user id)/public_html

として、public_html という名称の directory を HTML文書用に準備します。(ただし (user id) は自分のアカウントに置き換えます。)次に root 権限で /etc/httpd/conf/access.conf に次の3行を追加します。

<Directory /home/(user id)/>
Options All
</Directory>

そうしておいて httpd を次のようにして再起動します。

# /etc/rc.d/init.d/httpd restart

それから、下のスクリプトの (user id) を自分のアカウントに、(host name) をlocal host に置き換えれば、スクリプトを動かすことができます。ただし、危険なので外のネットワークと継るマシンではやらないでください。

格安文書管理システムの使い方。

概略のディレクトリーの構成は次のようになります。

/home/(user id)/bin に makeindex.pl と scangray
/home/httpd/cgi-bin に cgi-lib.pl、A.cgi、page.cgi
/home/httpd/に 文書表示部の扉の B.html
/home/(user id)/public_html/contents/ に文書をいれます。
このディレクトリーには makeindex.pl で作成した index.html も入ります。

先ず上記のディレクトリーに下の4つのスクリプトを納めます。文書を格納する予定のディレクトリーを ~/public_html/contents とします。

$ cd ~/public_html/contents

で contents ディレクトリーに移動した後、

$ makeindex.pl

として index.html をつくります。そのあと

$ scangrey filename

として文書をスキャナーから contents ディレクトリーに読み込みます。scangrey の設定では A4 版の文書をグレースケールで読み込み、jpeg ファイルで保存します。スクリプトを書き換えることでカラーも読み込むことができます。scanimage (SANE のプログラム群のひとつ) の man ページを参照してください。

準備ができたら netscape で http://(host name)/~(user id)/contentsにアクセスします。contents ディレクトリー内の jpeg または gif ファイルのリストが自動的に左側に表示され、ファイル名をクリックすると右のフレームに文書が表示されます。文書の印刷はブラウザーのメニューからもできますし、

lpr filename

でもできます。

格安文書管理スクリプト

注: 下のスクリプトで、(user id)、(host name) となっているところは実際のユーザIDやホスト名に置き換えてください。ネットワークカードの入っていないスタンドアロンのパソコンでも、(host name) を localhost にしておくとスクリプトが使えます。しかし、(host name) が localhost ではネットワークからはアクセスできません。また、CGIを動かすために cgi-lib.pl version 1.14が必要です。

makeindex.pl

#!/usr/bin/perl

$location=`pwd`;
chop($location);
$location =~ s/\/home\/(user id)\/public_html\///;

open(FILE, ">index.html");
print FILE "<html>\n";
print FILE "<head><title>index.html</title></head>\n";
print FILE "<frameset cols=\"100, *\">\n";
print FILE "<frame src=\"http://(host name)/cgi-bin/A.cgi?location=$location/\&size=100%\" name=\"list\">\n";
print FILE "<frame src=\"http://(host name)/B.html\" name=\"main\">\n";
print FILE "</frameset>\n";
print FILE "</html>\n";
close(FILE);

A.cgi

#!/usr/bin/perl
require "cgi-lib.pl";
&ReadParse;

$size=$in{"size"};
$location=$in{"location"};

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>index page</TITLE>\n";
print "<BASE TARGET=\"main\"></HEAD>\n";
print "<BODY>\n";

@list = `ls /home/(user id)/public_html/$location`;
while ($file = shift(@list)) {
	chop($file);
	if ($file =~ /.jpg|.gif/) {
        print "<A HREF=\"http://(host name)/cgi-bin/page.cgi?location=$location\&file=$file\&size=$size\">$file</A><BR>\n";
	}
}
print "<BR>\n";
print "<A HREF=\"http://(host name)/cgi-bin/A.cgi?location=$location\&size=100%\" TARGET=\"list\">100%</A><BR>\n";
print "<A HREF=\"http://(host name)/cgi-bin/A.cgi?location=$location\&size=150%\" TARGET=\"list\">150%</A><BR>\n";
print "<A HREF=\"http://(host name)/cgi-bin/A.cgi?location=$location\&size=200%\" TARGET=\"list\">200%</A><BR>\n";
print "</BODY>\n";
print "</HTML>\n";

page.cgi

#!/usr/bin/perl
require "cgi-lib.pl";
&ReadParse;

$location=$in{"location"};
$file=$in{"file"};
$size=$in{"size"};

print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>page print</TITLE></HEAD>\n";
print "<BODY><IMG SRC=\"http://(host name)/~(user id)/$location$file\" WIDTH=$size></BODY>\n";
print "</HTML>\n";

scangray

#!/bin/sh
if [ $# = 0 ]
then
	echo "Usage: scangray filename (without extention)"
	exit 1
fi
filename=$1.jpg
if [ -f $filename ]
then
	echo "File exists"
	exit 1
else
	scanimage -d epson --mode Gray --resolution 200 | convert pnm:- $filename
fi

注: scanimage は SANE の、convert は ImageMagic のプログラムです。それぞれをインストールしておく必要があります。SANE は 設定が必要です。最近はどちらもディストリビューションに含まれているようです。

B.html

<HTML>
<HEAD><TITLE>front page</TITLE></HEAD>
<BODY BGCOLOR="white">
<BR><BR><BR>
<CENTER>
<H1>Image Viewer</H1>
<H3>version 0.1</H3>
</CENTER></BODY>
</HTML>