2018/06/27

指定ディレクト配下のPDFのファイル名を変更する。

はじめに、OCRをさせる為、Tesseract-OCRをmake installする

その事前準備のライブラリをインストールする

# yum install autoconf automake libtool
# yum install libpng-devel libjpeg-devel libtiff-devel zlib-devel
# yum install libicu-devel
# yum install pango-devel

途中のmakeでmakeでICU(文字コード変換ライブラリ)が必要になるらしいが、
パッケージが無いので、

icu4c をmakeからインストールする
 
# cd /usr/local/src/
# sudo wget http://download.icu-project.org/files/icu4c/56rc/icu4c-56_rc-src.tgz
# tar zxf icu4c-56_rc-src.tgz
# cd icu/source/
# ./configure
# make
# make install

Leptonica という画像解析ライブラリも必要なので、
こちらも、makeからインストール 1.76が最新

# cd /usr/local/src/ 
# wget http://www.leptonica.com/source/leptonica-1.76.0.tar.gz
# tar -xzvf leptonica-1.76.0.tar.gz
# cd leptonica-1.76.0
# ./configure
# make
# make install



tesseract-ocrと辞書のインストール
# cd /usr/local/src/ 
# wget https://github.com/tesseract-ocr/tesseract/archive/3.04.01.tar.gz
# mv 3.04.01.tar.gz tesseract3.01.01.tar.gz
# tar -zxvf tesseract3.01.01.tar.gz
# cd tesseract-3.04.01/
#./autogen.sh
# LDFLAGS="-L/usr/local/lib" CFLAGS="-I/usr/local/include" ./configure --with-training-tools
# make
# make install
# ldconfig


更に、設定ファイルを定義
取敢えず英語の場合、 
tesseract-ocr-3.02.eng.tar.gzをどこからか探してくる。
/usr/local/share/tessdate/配下に 中身をコピーする。


これで、ようやくocrが使える。

 

# pdftoppm 0000.pdf 0000out これで、0000ont.ppmが生成されるので、
これをocrに掛ける。
画像が大きい場合は、optionでトリミングしたりする。

$ pdftoppm /storage1/scanedPdf/20180613133511305.pdf -f 1 -l 1 -mono -x 110 -y 45 -W 140 -H 35 -png  /storage1/scanedPdf/mono

こんな感じで使う。

mono-1.pngをocrに掛ける。
$ tesseract /storage1/scanedPdf/mono-1.png  /storage1/scanedPdf/mono

mono.txtが生成されるので、
これをトリミングして、
欲しい部分だけにする。

$ cat ./mono.txt|tr -d '\n''' > ./mono0.txt
$ cat ./mono0.txt|tr -d ' ' > ./mono1.txt
これで、mono1.txtには
10xx-1XXXXXX が記載されている。

これを使って元のPDFのリネームを行いたい。

ハイフンの全角「ー」と「-」半角を認識する様で、
全角で読み込んでしまうことが有ったので、
nkf コマンドですべて半角にしてしまう事にする。
# yum install nkf
コマンドの際は、
cat $filename-0.txt|nkf -Z4 > $filename.txt
-Zで 全角⇒半角だが、 helpによると-Z4は
JISX0208 Katakana to JISX0201 Katakanaとなっており、
どうもこの方が精度が良いようなので、-Z4でやってみる。


シェルスクリプトの例


#!/bin/bash
#tesseractのパスを通す
export PATH="/usr/local/bin:$PATH"
#ディレクトリ移動
echo "ディレクトリを移動"
cd /storage1/scanedPdf/
#while用にディレクトリ内のファイル数をカウント
count=$(ls | wc -w)
echo "ディレクトリ内のファイル数:"$count
#カウントが0以上なら、ループ処理を行う。
#-ne not equal
while [ $count -ne 0 ]
do
#一行づつ処理するために念のため仕掛ける。いきなり変数でも問題ない。
for file in `\find . -maxdepth 1 -name '*.pdf'| head -n1`; do
basename $file .pdf
done
#変数定義
filename=$(basename $file .pdf)
#pdftoppmでpdfデータの左上(0,0)基準の座標(100,45)から座標(290,80)までを切り出しモノクロのpngを生成する。
pdftoppm $filename.pdf -f 1 -l 1 -mono -x 100 -y 45 -W 190 -H 35 -png  /storage1/scanedPdf/$filename
#上記のpngをOCRで読み取り、テキストファイルを生成する。
#-1は「ファイル名-1.png」が生成されてしまうため、この-1が必要となる。
tesseract $filename-1.png -psm 6  $filename-1
#テキストデータ内の半角スペースを削除する
cat $filename-1.txt|tr -d ' ' > $filename-2.txt
#テキストデータ内の全角―を半角-に書き換える
cat $filename-2.txt|nkf -Z4 > $filename.txt
#変数定義
pdfname=$(head -n 1 $filename.txt)
echo $pdfname
#pdfの名称を1xxx-1xxxxxの形に変更して、/storage1/pdf/に移動
mv ./$filename.pdf /storage1/pdf/$pdfname.pdf
#作業ファイルを削除
rm $filename*
#カウントのデクリメント
count=$(( count -1))
done

上手く動いた。
当初、パスを通していなかったため、上手く動かなかったが、cronでも問題なく動いた。
複合機で一つ一つのファイルを開いて中身を確認して名称を付けるのは非常に面倒くさいし、もの凄い時間を浪費する。
これは、かなり便利だと思う。

2018/06/19

リモートデスクトップ接続が出来ない(windowsアップデートによる)


WindowsServer2012へリモートデスクトップ接続を行なおうとすると、

認証エラー
要求された関数はサポートされません

サーバ:192.168.0.xxx

のダイアログが表示されて接続できない。


環境
サーバ
Windows 2012R2
クライアント
windows7 Home(セキュリティパッチのみ)


2018 年 5 月の更新プログラム適用によるリモート デスクトップ接続への影響
https://blogs.technet.microsoft.com/askcorejp/2018/05/02/2018-05-rollup-credssp-rdp/

4-2. リモート デスクトップ接続元 (クライアント) での回避策
リモートデスクトップ接続元にて以下レジストリを手動もしくは REG ADD コマンドで追加いただくことでも回避策 1 と同様の効果が得られます。

レジストリ パス : HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters
値 : AllowEncryptionOracle
データの種類 : DWORD
値 : 2

REG ADD コマンドで追加いただく場合には以下のコマンド ラインとなります。
REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2

とのこと。


コマンドプロンプトを監理者権限で起動し、

REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\CredSSP\Parameters /v AllowEncryptionOracle /t REG_DWORD /d 2

を叩くと接続できた。

根本的な解決は、サーバ側に更新プログラムを適用させろ
との事なので、早めにやろう。

2018/06/04

postgresql 初期化と接続 外部からのdump

postgresqlがインストールされているか確認。
pgsql --version
psql (PostgreSQL) 9.2.18

起動テストをしてみる。
# systemctl start postgresql.service
Job for postgresql.service failed because the control process exited with error code. See "systemctl status postgresql.service" and "journalctl -xe" for details.

初期化が必要だった。
# service postgresql initdb
Hint: the preferred way to do this is now "postgresql-setup initdb"
Initializing database ... OK

動かしてみる。
# systemctl start postgresql.service
[root@localhost ~]# systemctl status postgresql.service
● postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled; vendor preset: disabled)
   Active: active (running) since 月 2018-06-04 18:54:47 JST; 12s ago
  Process: 1627 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
  Process: 1619 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 1630 (postgres)
   CGroup: /system.slice/postgresql.service
           tq1630 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
           tq1631 postgres: logger process
           tq1633 postgres: checkpointer process
           tq1634 postgres: writer process
           tq1635 postgres: wal writer process
           tq1636 postgres: autovacuum launcher process
           mq1637 postgres: stats collector process

 6月 04 18:54:46 localhost.localdomain systemd[1]: Starting PostgreSQL database server...
 6月 04 18:54:47 localhost.localdomain systemd[1]: Started PostgreSQL database server.

動いた。


一旦停止して、外部からのアクセスが出来るようにする。
# nano /var/lib/pgsql/data/postgresql.conf
L60位のlisten_addressを許容
listen_addresses = '*'                  # what IP address(es) to listen on;

# nano /var/lib/pgsql/data/pg_hba.conf
末尾にIPアドレスの設定

# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                trust
#host    replication     postgres        127.0.0.1/32            trust
#host    replication     postgres        ::1/128                 trust
# for server
host    all         all         192.168.xxx.0/24        password
host    all         all         192.168.xxx.0/24       password
host    all         all         192.168.xxx.0/24       password
# for vendor
host    all         all         xxx.xxx.xxx.xxx/28     password


firewallを開放
# firewall-cmd --add-service=postgresql --permanent
success
# systemctl restart firewalld.service

再度起動

恐らく問題なく接続できている。

pg_dumpで外部サーバに接続する場合は、同じユーザを作成し、ルートに .pgpass を作成
書き方は
192.168.0.XXX:5432:DB名:ユーザ名:パスワード

複数のDBがある時は、
192.168.0.xxx:5432:*:user:password でOK

$ chmod 600 .pgpass パーミッションは600指定
パーミッション600にしないと、エラーになった。

$ pg_dump -Ft -h 192.168.0.xxx -p 5432 -U user -w dbName > /home/user/dbName_`date '+%y%m%d%H%M'`

-wがパスワード請求無しのオプション
こんな感じでdump出来るので、これをシェルスクリプトにして、crontabに書いて終了。