goo blog サービス終了のお知らせ 

rabbit51

it's since Nov.30 2005
May.29 2014, transferred from broach

Canon PIXUS TS9030が動かなくなった

2025-03-29 16:00:00 | 
2024年12月 後ろトレーに30枚ほどインクジェット年賀状を入れて印刷を始めた。10数枚ほど印刷したところで買い物に出かけるため20枚ほど印刷中に追加した。紙送りを確認していたら「かちゃん」「かちゃん」「かちゃん」と音を出し、紙送りに失敗して停止してしまった。枚数を減らして再開すると「用紙詰まり」で停止。確認したが「用紙詰まり」は無い。

再起動すると「排紙トレーが引き出されていません」。引き出して「OK」をタッチするもエラー6004。指示通り「電源コードを抜き差し」して電源投入。何回繰り返しても同じ。
急遽IP4600にインクを装填して、クリーニング、強力クリーニング2回(PGBKインク残量が一気に半減)で復活させ、年賀状印刷を行う。紙送りがおかしかったがなんとか年賀状を印刷した。
TS9030のスキャナ機能は、事業用領収書の電子化に常時使用している。プリント機能より多用しているが、使えない。

(1)TS9030の分解(故障原因を探る)
キャノン TS8230分解動画
キャノン TSシリーズ部品外し取り付け動画
を参考にTS9030を分解した。想像以上に「インク汚れ」がある。


インクヘッド部をずらすとパージユニット(purge unit)が見える。

インク吸取部(赤3)の「ガイド」(赤2)がガイド枠(赤1)から外れて曲がっている。
インク吸取部を左右に移動するためのレバー部(黄色4)にあるスプリング保持部が壊れ、スプリングも存在しない。

プリンターの底部を取り外すと余剰インク吸取り紙の上にプラスチックのカケラとスプリングが見つかった。


(2)TS9030の修復
パージユニットを水洗いして「ガイド」(赤2)をガイド枠(赤1)へ入れ、インク吸取部(赤3)を正常な状態に戻した


下記写真は、インク吸取部を上下(画面に対し)と底部方向へ沈み込む動作をするためのパーツ。左側のレバーと軸は自由に動く。スプリング右端が掛かる部分は、軸部分で下部のギアで制御される。

欠損した部分は、スプリング右側が掛かる部分と一体の軸部分。破断部は、非常に面積が小さく、スプリング応力に勝てなかったようだ。
軸部分で左側レバーと接しているため「接着」させないようにする必要がある。また、スプリング応力が「黄色矢印方向」にかかるため「アロンアルファ」だけの接着では難しい。荷造り札の針金(ワイヤ)を使い補強した。

(3)TS9030その他
新機種の購入を検討したが、「WiFi」接続だけで「Wire(Ethernet)」接続機種が無い。
(MacOSへのスキャナデータ送信が失敗する事が多いので買い替えたいのだが)


インクジェットのヘッド部スペーサー(前部高さ調整機構)(組み立て方法をメモとして残す)







purgeユニットのギアレバー組立時位置



purgeユニット内をボンディングアース線が走る

このカバーをつける前にボンディングアース線を這わせる


底部カバーを取り付けるビスがpurgeユニットのスクレイパーで隠れてしまう

ギアを動かし、スクレイパーの位置を移動する必要がある


分解した状態で2ヶ月ほど放置していたのでインクジェットのヘッド部がカバーされず「乾燥」
PGBK以外印字出来なくなった。ヘッドの水洗でBK以外復活。ここでインク切れ。Amazonで価格を調べた(2025年2月24日)。
「BCI-371+370/6MP」  が¥5,800円(標準容量)
「BCI-371+370XL/6MP」 が¥8,299円
「BCI-371+370XL/6MPV」が¥7,980円(写真用紙30枚の抱合せ)
そうだ、GYとBKが残っているので、「BCI-371+370XL/5MP」を調達を検討する。
「BCI-371+370/5MP」  が¥4,893円(標準容量)
「BCI-371+370XL/5MP」 が¥5,900円(中古品でほぼ新品)
「BCI-371+370XL/5MPV」が¥7,000円(写真用紙30枚の抱合せ)
流石に中古品(「取付期限」の明記していないバラインクセット)と言うわけにいかないので「5MPV」とした。
見事な抱合せ商品。。。
これでは、「クリーニング」や「強力クリーニング」を気軽に出来ない。
インクヘッドのBKノズル水洗浄をしっかりやってみる事にする。





ノズル部分を「お湯(水)」につける事2日。「BK」のインク装着部からポンプで(空になった点眼液のケースにシリコンチューブを付け圧をかけた)水を挿入。ノズル部から水が出るのを確認。
「BK」は復活したが、「GY」と「Y」が出なくなる。
「GY」は、ノズルから水が出るのを確認。復活。
「Y」は、簡易ポンプでは、ノズルから水が出ない。

スキャナーが復活したので、印刷不具合対策は、時間を置いて対策する事にする。

 


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

H2Vサービス廃止対策

2025-02-20 17:00:00 | 
2025年中に変更あるいは終了するPC・ネットワーク関連サービスの対応について

電力消費とPHEV車への充電量をモニターしまとめてくれるサービス。月毎の充電量を集計し、事業比率を掛け、青色申告の事業経費に計上していたが、使えなくなる。

H2Vサービスは、H2V Controllerで使用電力と充電電力が計測され、H2V Gatewayで表示とトヨタスマートセンターへデータを提供している。スマートセンターは、データを蓄積し、グラフ化した情報をiPhoneなどのスマートフォンアプリやPCデータ(pdfなど)で利用できる情報を提供する。導入システムの詳細は下記参照。2025年3月31日でスマートセンターのデータ提供を終了する連絡が来た(必要なデータ収集を行なったので経費のかかるシステム維持は終わりと言う事か)。

(1)H2VGateway


「設定」「ルータ設定」画面(BuffaloのWiFiルータとほぼ同じ)

H2VControllerから定時的にWiFi接続で送られてくる使用電力と充電電力を表示したり、トヨタスマートセンターへインターネット経由でデータを送出する。WiFi接続に不具合があるとH2VControllerに一時的に情報が蓄えられ、WiFi接続が回復すると蓄えられた情報を送出する。プロトコルは公開されていない。

H2VManagerのトップ画面には「消費電力(本日)(昨日)[Kwh]」の積算値、「現在の消費電力[Kw]」「充電使用電力[Kw]」が表示されている。画面情報をHTMLテキストから取り出そうと調べていると、HTML headの前に下記情報がコメントで含まれているのが判った。
Device Num : 1
Device-ID[1] = [34 c7 31 XX XX XX]
本日[6932]
昨日[22436]
平均[817]
最大[849]
車充電[2]
ピークカット状態[0]
リレー状態[1]
最新電力情報の時刻[2025/02/20 20:09]
PCC接続状態[-64]
TSC接続状態[4]
充電開始時刻(nooffset)[1970/01/01 09:00]
「Device-ID」は、H2VControllerのMAC address。「最新電力情報の時刻」は、JST+9の時刻と思われる。GMT+9なら判るが。。。

スケシューラで1分毎に下記Pythonスクリプトを起動し月毎のcsvファイルを作る
h2vmgr.py
#!/usr/bin/python
import os
import urllib.request
import re
from datetime import datetime, timedelta

pat1='(本日)\[(\d+)\]'
pat2='(昨日)\[(\d+)\]'
pat3='(平均)\[(\d+)\]'
pat4='(最大)\[(\d+)\]'
pat5='(車充電)\[(\d+)\]'
pat6='(ピークカット状態)\[(\d+)\]'
pat7='(リレー状態)\[(\d+)\]'
pat8='(最新電力情報の時刻)\[([\d\s/:]+)\]'
pat9='(PCC接続状態)\[([\d-]+)\]'
pat10='(TSC接続状態)\[(\d+)\]'
pat11='(充電開始時刻\(nooffset\))\[([\d\s/:]+)\]'

h2vurl="http://h2vmgr.matsuura/h2v/top_phv_ev.html"
req=urllib.request.Request(h2vurl)

try:
    with urllib.request.urlopen(req) as res:
        body=res.read().decode("euc-jp")
        res1=re.search(pat8,body,re.S) #最新電力情報の時刻
        if res1:
            dt=datetime.strptime(res1.group(2),"%Y/%m/%d %H:%M")
            dt=dt-timedelta(hours=9)
            os.chdir(os.path.dirname(os.path.abspath(__file__)))
            ofn=dt.strftime("%Y%m")+"h2vmgr-rawd.csv"
            csvh="\""+res1.group(1)+"\""
            csvd="\""+dt.strftime("%Y/%m/%d %H:%M")+"\""

        res1=re.search(pat1,body,re.S) #本日
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+","+res1.group(2)
        res1=re.search(pat2,body,re.S) #昨日
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+","+res1.group(2)
        res1=re.search(pat3,body,re.S) #平均
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+","+res1.group(2)
        res1=re.search(pat4,body,re.S) #最大
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+","+res1.group(2)
        res1=re.search(pat5,body,re.S) #車充電
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+","+res1.group(2)
        res1=re.search(pat6,body,re.S) #ピークカット
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+","+res1.group(2)

        res1=re.search(pat9,body,re.S) #PCC接続状態
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+","+res1.group(2)

        res1=re.search(pat10,body,re.S) #TSC接続状態
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+","+res1.group(2)

        res1=re.search(pat11,body,re.S) #充電開始時刻(nooffset)
        if res1:
            csvh=csvh+",\""+res1.group(1)+"\""
            csvd=csvd+",\""+res1.group(2)+"\""

        dtn=datetime.now()
        if ( dt.strftime("%Y/%m/%d %H:%M") == "1970/01/01 00:00" ):
            with open(ofn, mode='a') as f:
                f.write(csvd+",\""+dtn.strftime("%Y%m%d%H%M")+"\"\n")
        else:
            if not os.path.isfile(ofn):
                with open(ofn, mode='w') as f:
                    f.write(csvh+"\n")
            with open(ofn, mode='a') as f:
                f.write(csvd+"\n")

except urllib.error.HTTPError as e:
    if e.code >= 400:
        print(e.reason)
    else:
        raise e
毎月1日に下記Pythonスクリプトを実行し使用電力と充電電力の集計を行う
h2vmgrmsum.py
#!/usr/bin/python
# "最新電力情報の時刻","本日","昨日","平均","最大","車充電","ピークカット状態","PCC接続状態","TSC接続状態","充電開始時刻(nooffset)"
import csv
import os
from datetime import date, datetime, timedelta

# 毎月1日に前月分の消費電力と充電電力を計算する
dt=date.today()   #dt=date(2025,2,1)
dtp=dt-timedelta(days=27)  # 集計月(前月)
dtd=date(dt.year,dt.month,1)-date(dtp.year, dtp.month,1)  # 集計月の日数
# 前月の集計するファイル名
fni=dtp.strftime("%Y%m")+"h2vmgr-rawd.csv"
fno=dtp.strftime("%Y%m")+"h2vmgr-sum.txt"
os.chdir(os.path.dirname(os.path.abspath(__file__)))
ofn=dt.strftime("%Y%m")+"h2vmgr-rawd.csv"

tpwr=0
chrg=0
cnt=0
data=""
with open(fni, newline='') as f:
    h2vd=csv.reader( f )
    header=next(h2vd)
    for row in h2vd:
            tpwr=tpwr+int(row[3])
            chrg=chrg+int(row[5])
            cnt=cnt+1
data="Sumary of the "+dtp.strftime("%Y/%m")+"\n"
data=data+"Total used power(Kwh) : "+str( '{:8g}'.format(tpwr/60000) ) + "\n"
data=data+"Total charged power(Kwh) : " + str( chrg/60000 ) + "\n"
data=data+"Lost " + str(dtd.days*1440-cnt) + "/ Recorded " + str(cnt) + " minutes("+str(dtd.days) +"days)\n"
#print(data)

if not os.path.isfile(fno):
    with open(fno, mode='w') as f:
        f.write(data+"\n")
with open(fno, mode='a') as f:
    f.write(data+"\n")
毎月の集計値ファイルが作られる
202501h2vmgr-sum.txt
Sumary of the 2025/01
Total used power(Kwh) :  653.023
Total charged power(Kwh) : 21.29235
Lost 10/ Recorded 44630 minutes(31days)



 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

2025年中に変更あるいは終了するPC・ネットワーク関連サービスの対応について

2025-01-28 11:00:00 | 
2025年中にネットワーク関連サービス廃止や価格変更が通知されてきた。対応と対策を実施する必要がある。


(1)フレッツ 光ネクスト
https://flets.com/2024_rebalance/
ファミリー・ハイスピードタイプの月額220円値上げ(2025年4月1日からファミリー・ギガラインライプと同じ月額5940円)
対策:ギガラインタイプへ工事費無料で変更(2025年2月1日より申し込み開始)

フレッツ 光ネクストのサービスタイプ(ハイスピードからギガライン)を変更した」(2025/02/14追記)

(2)ひかり電話
https://flets.com/2024_rebalance/
https://flets.com/sagitaisaku/
「付加サービス割引」の廃止と「ダブルチャンネルの月額220円値上げ(2025年4月1日から月額440円)
対策:「ナンバーディスプレー」「ナンバーリクエスト」の高齢者無償化(70歳以上あるいは同居)対応

(3)ぷらら プライベートホームページの終了
https://www.docomo.ne.jp/info/notice/page/240627_01.html
「プライベートホームページ」サービスが2025年3月31日で終了
対策:自前のホームページをDDNSとDS-216Jで2025年4月1日以降稼働

(4)Windows10のサポート終了
Windows10のサポートが2025年10月14日で終了
対策:メインで使用しているWindows10をWindows11へアップデートする
 ハードウェア:MacBook pro (Retina, 15-inch, Late 2013) [ Intel(R) Core(TM) i7-4850HQ CPU @ 2.30GHz ]
 メインOS: MacOS BigSur バージョン 11.7.10
 仮想 OS:Parallels Desktop 18 for Mac Version 18.3.3(53627)
 Windows OS:Windows 10 Home バージョン 22H2, OS build 19045.5371

対策:「Parallels Desktop 18 for Mac」がTPMとUEFI BIOS対応しているので、Legacy BIOSでインストールされたWindows 10 HomeをUEFI/TPM対応に変換する(MBR2GPT.exeを使用)。その後、Windows11のCore i7-4850HQのCPU未対応問題を検討する。

(5)H2Vサービス廃止
トヨタのPHEV車プリウスPHEV用に家庭で充電する時の充電制御サービスである「Home to Vehicle(H2V)」が2025年3月一杯で廃止される。
日毎の家庭での電力消費とPHEV車への充電量をモニターし月毎にまとめてくれるサービス。月毎の充電量を集計し、事業比率を掛け、青色申告の事業経費に計上していたが、使えなくなる。
https://www.tsc-h2v.com/manager/Dashboard/

対策:
H2Vサービス廃止対策

(6)その他サービス廃止
東京ガス:銀行口座引き落とし割引の廃止(実質値上げ)(各社続きそう・・・)



コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

みずほ銀行 明細ofxリンクが消えた Felica2moneyのcsv変換定義ファイル

2024-11-26 16:00:00 | 
先月までは明細OFXファイルのダウンロードリンクが表示されていた。
今月アクセスしてみると画面構成が大きく変化。スマートフォン対応か。。。
明細のダウンロードリンクもどこにあるかわからない。。。
「確認する」「口座一覧」を表示し、目的の口座表示の枠内をクリック


入出金明細が表示される。不親切な構成
ダウンロードリンクから「OFX」は消えた


「%userprofile%\AppData\Local\tmurakam.org\FeliCa2Money」
MizuhoBank.xml
<?xml version="1.0" encoding="UTF-8"?>
<CsvRules>
  <Version>20241126.01</Version>
  <Rule>
    <Ident>MizuhoBank</Ident>
    <Name>みずほ銀行</Name>
    <FirstLine>明細通番,日付,お引出金額,お預入金額,残高,お取引内容</FirstLine>
    <Format>Dummy,Date,Outgo,Income,Balance,Desc</Format>
    <Order>Ascent</Order>
  </Rule>
</CsvRules>



 

ゆうちょ銀行 明細csvファイル用 Felica2moneyのcsv変換定義ファイル
りそな銀行の明細ofxファイルがダウンロード出来なくなった
三井住友銀行 明細csvファイル用 Felica2moneyのcsv変換定義ファイル
コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Panasonic KX-PD102DのFaxTiffWriterをWinFaxで代替え

2024-11-22 10:00:00 | 

Panasonic KX-PD102DのFaxTiffWriterがインストール出来ない」でFaxTiffWriterが作成するTIFFデータとWindowsのFAX Driverが作るTIFFを比較分析した。この分析結果をもとにWindows FAX Driver作成のTIFFをSDメモリーカードに記録し、Panasonic KX-PD102DでFAX送信してみた。

(1)Win FAX DriverのTIFFをスクリプトで変換
・Tagデータの次にImageデータとなるよう配置を変更
・Imageデータの開始位置が固定となるようTagデータを処理
・Resolutionの単位をインチからセンチへ変更。設定値はA4サイズ固定値
・複数ページデータを1ページ毎のファイルにする
・指定された出力ファイル名をページ毎に「ファイル名01」から「ファイル名99」とする
・TIFF拡張子は「tif」とする
splitwinfax.sh
#!/bin/bash
# split win fax pages to files

function readbinary {
  data=()
  local LC_ALL=C byte i=0 buff
  while IFS= read -r -d '' -n 1 byte; do
    data[i++]="'$byte"
  done
  printf -v buff '%d ' "${data[@]}"
  data=($buff)
  while ((--i>=0)); do ((data[i]&=0xFF)); done
}
function writebinary {
  local buff
  printf -v buff '\\x%x' "${odata[@]}"
  LC_ALL=C printf "$buff"
}

function getbyte()  {
  printf "%d" ${data[$1]} 
}
function get2bytes(){
  printf "%d" $((data[$1+1]*256+data[$1]))
}
function get4bytes(){
  printf "%d" $((data[$1+3]*16777216+data[$1+2]*65536+data[$1+1]*256+data[$1]))
}

function setbyte() {
    odata[$1]=$(printf "$(printf '%d' $2)")
}
function set2bytes() {
    odata[$1]=$(printf "$(printf '%d' $(($2%256)) )" )
    odata[$1+1]=$(printf "$(printf '%d' $(($2/256)) )" )
}
function set4bytes() {
    odata[$1]=$(printf "$(printf '%d' $(($2%256)) )" )
    odata[$1+1]=$(printf "$(printf '%d' $(($2%65536/256)) )" )
    odata[$1+2]=$(printf "$(printf '%d' $(($2%16777216/65536)) )" )
    odata[$1+3]=$(printf "$(printf '%d' $(($2/16777216)) )" )
}

## read tif file
if [[ $1 ]]; then
  readbinary < "$1"
else
  readbinary
fi

##
odata=(); cofs=0; fnum=1; bnum=1
DD=`date "+%Y%m%d%H%M"`
FN=$(printf $(printf '\\x%x' $((65+${DD:0:4}-2010))))
if [[ ${DD:4:2} -lt 10 ]]; then FN=$FN$(printf $(printf '\\x%x' $((48+$(expr ${DD:4:2}))))); else FN=$FN$(printf $(printf '\\x%x' $((65+${DD:4:2}-10)))); fi
if [[ ${DD:6:2} -lt 10 ]]; then FN=$FN$(printf $(printf '\\x%x' $((48+$(expr ${DD:6:2}))))); else FN=$FN$(printf $(printf '\\x%x' $((65+${DD:6:2}-10)))); fi
for (( i=1; i<999; i++ )); do
    FNN=""
    FNN=$FN$(printf $(printf "%03d" $i))
    if [[ ! -d $FNN ]]; then break; fi
done
for (( i=1; i<100; i++ )); do
    FNNP=""; FNNP=$FNN$(printf $(printf "%02d" $i))".tif"
    if [[ ! -f $FNNP ]]; then fnum=$i; break; fi
done
#offset address 0x04 after '0x49 0x49 0x2a 0x00' is 1st IFD pointer
IFDP=$(get4bytes 4)
IFDC=$(get2bytes $IFDP)
while [ $IFDP -ne 0 ]; do
  for (( cofs; cofs<4; cofs++ )); do odata[$cofs]=${data[$cofs]}; done
  set4bytes $cofs 8; ((cofs+=4))
  set2bytes $cofs $IFDC; ((cofs+=2))
  sofs=$((IFDP+2))
  for (( i=0; i<$IFDC; i++ )); do
    TID=$(get2bytes $((IFDP+2+i*12)))
    Ttyp=$(get2bytes $((IFDP+2+i*12+2)))
    Tcnt=$(get4bytes $((IFDP+2+i*12+4)))
    Tval=$(get4bytes $((IFDP+2+i*12+8)))
    case ${TID} in
      "273") #0x111 Strip Offsets
        imgadr=$Tval; imgtvaladr=$((cofs+8));;
      "279") #0x117 StripByCounts
        imgsize=$Tval;;
      "282") #0x11A X Resolution
        xresadr=$Tval; xresval1=$(get4bytes $Tval); xresval2=$(get4bytes $((Tval+4))); xrestvaladr=$((cofs+8));;
      "283") #0x11B Y Resolution
        yresadr=$Tval; yresval1=$(get4bytes $Tval); yresval2=$(get4bytes $((Tval+4))); yrestvaladr=$((cofs+8));;
      "296") #0x128 Resolution Unit
        resunit=$Tval; resunittvaladr=$((cofs+8));;
      "305") #0x131 software
          softtextadr=$Tval; softsize=$Tcnt; softtexttvaladr=$((cofs+8));;
      *)
    esac
    for (( j=cofs; j<$((cofs+12)); j++,sofs++ )); do odata[j]=${data[sofs]}; done 
    ((cofs+=12))
  done
    set4bytes $cofs 0; ((cofs+=4)) #terminator for IFDP
# X and Y Resolution cm value
    set4bytes $cofs 80; set4bytes $xrestvaladr $cofs; ((cofs+=4))
    set4bytes $cofs 1; ((cofs+=4))
    set4bytes $cofs 77; set4bytes $yrestvaladr $cofs; ((cofs+=4))
    set4bytes $cofs 1; ((cofs+=4))
    set4bytes $resunittvaladr 3
# Software text value
    for (( i=$softtextadr,j=0; j<$softsize; i++,j++ )); do odata[((cofs+j))]=${data[i]}; done 
    set4bytes $softtexttvaladr $cofs
    ((cofs+=j))
# Image data must be start at offset 0x10b
    setbyte $cofs 32; ((cofs+=1))
    for (( i=imgadr, j=0; j<$imgsize; i++,j++ )); do odata[((cofs+j))]=${data[i]}; done
    set4bytes $imgtvaladr $cofs
    ((cofs+=j))
  IFDP=$(get4bytes $((IFDP+IFDC*12+2)) )
  IFDC=$(get2bytes $IFDP)
writebinary > $(printf "$FNN%02d.tif" $fnum)
printf "Page %02d to the $FNN%02d.tif\n" $bnum $fnum
((fnum+=1)); ((bnum+=1))
cofs=0
done
(2024/12/8一部コード修正)
wordで2ページのfaxテストページを作成し、印刷のWinFaxドライバーで「FaxTest2pages.tif」を作成。
macOSターミナルで上記シェルスクリプトを実行してページ毎のTIFFファイルを作成。
macOS BigSur バージョン 11.7.10
$ uname -a
Darwin muffin2.matsuura 20.6.0 Darwin Kernel Version 20.6.0: Thu Jul  6 22:12:47 PDT 2023; root:xnu-7195.141.49.702.12~1/RELEASE_X86_64 x86_64
$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
Copyright (C) 2007 Free Software Foundation, Inc.
$ ./splitwinfax.sh /Users/someone/FaxTest2pages.tif 
Page 01 to the OBL00101.tif
Page 02 to the OBL00102.tif
$ ls -al OBL*.tif
-rw-r--r--  1 someone  staff  925 11 21 16:56 OBL00101.tif
-rw-r--r--  1 someone  staff  925 11 21 16:56 OBL00102.tif
$ ./splitwinfax.sh /Users/someone/FaxTestExcell.tif 
Page 01 to the OBL00103.tif
$ ls -al OBL*.tif
-rw-r--r--  1 someone  staff  925 11 21 16:56 OBL00101.tif
-rw-r--r--  1 someone  staff  925 11 21 16:56 OBL00102.tif
-rw-r--r--  1 someone  staff  925 11 21 16:58 OBL00103.tif
word文章ファイルだけでなく、Excellファイル、PowerPointファイルなどもWinFaxでTIFFファイルを作成し、「splitwinfax.sh」でfax送信できるTIFFファイルに変換する。ファイル名は、ページ毎に「01」「02」「03」と付番されるようにした。
このままでは、fax送信できないので、SDメモリーカードで扱えるように「DOC_INF.BIN」ファイルを用意する。

(2)「DOC_INF.BIN」の生成
mkdocinf.sh
#!/bin/bash
# make doc_inf.bin
dbg=0
DD=`date "+%Y%m%d%H%M"`
TT="WinFax${DD}" #タイトル:半角20文字以下
PN=1    #ファックス頁数
#
function readbinary {
  data=()
  local LC_ALL=C byte i=0 buff
  while IFS= read -r -d '' -n 1 byte; do
    data[i++]="'$byte"
  done
  printf -v buff '%d ' "${data[@]}"
  data=($buff)
  while ((--i>=0)); do ((data[i]&=0xFF)); done
}
function writebinary {
  local buff
  printf -v buff '\\x%x' "${odata[@]}"
  LC_ALL=C printf "$buff"
}
function getbyte()  {
  printf "%d" ${data[$1]}
}
function get2bytes(){
  printf "%d" $((data[$1+1]*256+data[$1]))
}
function get4bytes(){
  printf "%d" $((data[$1+3]*16777216+data[$1+2]*65536+data[$1+1]*256+data[$1]))
}

function setbyte() {
    odata[$1]=$(printf "$(printf '%d' $2)")
}
function set2bytes() {
    odata[$1]=$(printf "$(printf '%d' $(($2%256)) )" )
    odata[$1+1]=$(printf "$(printf '%d' $(($2/256)) )" )
}
function set4bytes() {
    odata[$1]=$(printf "$(printf '%d' $(($2%256)) )" )
    odata[$1+1]=$(printf "$(printf '%d' $(($2%65536/256)) )" )
    odata[$1+2]=$(printf "$(printf '%d' $(($2%16777216/65536)) )" )
    odata[$1+3]=$(printf "$(printf '%d' $(($2/16777216)) )" )
}

##
cofs=0
dentnum=0
# the initial data for doc_info.bin file.
odata=(0 0 0 0 12 4 0 0 0 0 12 0 255 255 255 255)
data=(0 0 0 0 12 4 0 0 0 0 12 0 255 255 255 255)
for (( i=12; i<$((1024+12)); i++ )); do odata[i]=255; data[i]=255; done
dentd=(0 0 0 0 87 0 2 3)
dentinfd=(1 0 9 0 0 0 0 0 1 1 3 2 6 232 7 11 11 11 11 3 6 232 7 11 11 11 11 6 10 0 0 0 0 0 0 0 0 0 0 8 20 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 10 2 1 0 11 13 32 32 32 32 32 32 0 0 0 0 0 0 0 12 1 0 14 2 2 0)
if [[ $# -lt 1 ]]; then printf "$0 PageNumber <current doc_inf.bin>\n"; exit; fi
if [[ $1 ]]; then PN=$1; fi
## read doc_inf.bin file to data()
if [[ $2 ]]; then  readbinary < "$2"; fi
#
dfirst4=$(get4bytes 0); ddfirst4=0
dentend=$(get4bytes 4); ddentend=1036
dentnum=$(get2bytes 8); ddentnum=0
dentap=12; ddentap=12
dentinfap=$(get2bytes 10); ddentinfap=12
dentinfape=$((dentinfap+dentnum*87)); ddentinfape=12

printf "Loaded ...\n"
if [[ $(get4bytes 4) -eq 0 ]]; then writebinary >"DOC_INF.BIN"; exit; fi
if [[ $dentnum -eq 0 ]]; then set4bytes 0 65536; ddfirst4=65536; fi
#Directory Entry
cofs=$dentap
for (( i=0; i<dentnum; i++ )); do
  for (( j=2; j<8; j++ )); do
    set2bytes $((cofs+i*8)) $(($(get2bytes $((dentap+i*8)))+8))
    odata[$((cofs+i*8+j))]=${data[$((dentap+i*8+j))]}
  done
done
((cofs+=8*dentnum));
if [[ $dfirst4 -ne 0 ]]; then ddfirst4=$dfirst4; fi
ddentnum=$dentnum; ddentinfap=$cofs; ddentinfape=$cofs; ddentend=$((ddentinfape+1024))
ddentinfap=$((cofs+8))
set2bytes $cofs $((ddentinfap+87*dentnum))
for (( j=2; j<8; j++ )); do odata[$((cofs+j))]=${dentd[$j]}; done
((cofs+=8))
set2bytes 10 $ddentinfap
((ddentnum+=1)); set2bytes 8 $ddentnum; ddentinfape=$ddentinfap; ddentend=$((ddentinfape+1024))
set2bytes 4 $ddentend
#copy dentinfo 87*dentnum
for (( i=0; i<dentnum; i++ )); do
  for (( j=0; j<87; j++ )); do  odata[$((cofs+i*87+j))]=${data[$((dentinfap+i*87+j))]}; done
done
((cofs+=dentnum*87))
ddentinfend=$cofs
ddentend=$((ddentinfend+1024))
# Directory Entry Information
for (( i=0; i<87; i++ )); do odata[$((cofs+i))]=${dentinfd[$i]}; done
# ID02-date: 11 data 13 length 6
# ID03-date: 19 data 21 length 6
odata[$((cofs+13))]=$(printf "%d" $((${DD:0:4}%256)))
odata[$((cofs+14))]=$(printf "%d" $((${DD:0:4}/256)))
odata[$((cofs+15))]=$(printf "%d" $(expr ${DD:4:2}))
odata[$((cofs+16))]=$(printf "%d" $(expr ${DD:6:2}))
odata[$((cofs+17))]=$(printf "%d" $(expr ${DD:8:2}))
odata[$((cofs+18))]=$(printf "%d" $(expr ${DD:10:2}))
for (( i=0; i<6; i++ )); do odata[$((cofs+21+i))]=${odata[$((cofs+13+i))]}; done
# ID08-Title: 39 data 41 length 20
TTX=($(printf "${TT}" | iconv -f utf8 -t sjis | od -An -tu1))
for (( i=0; i<${#TTX[@]}&&i<20; i++ )); do odata[$((cofs+41+i))]=${TTX[$i]}; done
# ID0A-Pages: 61 data 63 length 2(short)
odata[$((cofs+63))]=$(printf "%d" $((${PN}%256)))
odata[$((cofs+64))]=$(printf "%d" $((${PN}/256)))
# ID0B-DirectoryName: 65 data 67 length 13
odata[$((cofs+67))]=$((65+${DD:0:4}-2010))
if [[ ${DD:4:2} -lt 10 ]]; then odata[$((cofs+68))]=$((48+$(expr ${DD:4:2}))); else odata[$((cofs+68))]=$((65+${DD:4:2}-10)); fi
if [[ ${DD:6:2} -lt 10 ]]; then odata[$((cofs+69))]=$((48+$(expr ${DD:6:2}))); else odata[$((cofs+69))]=$((65+${DD:6:2}-10)); fi

for (( i=1; i<999; i++ )); do 
    DRN=""
    for (( j=0; j<3; j++ )); do DRN=$DRN$(printf $(printf '\x%x'  "${odata[$((cofs+67+j))]}")); done
    DRN=$DRN$(printf $(printf "%03d" $i))
    if [[ ! -d $DRN ]]; then
        printf "New directory name is $DRN\n"
        mkdir $DRN
        odata[$((cofs+70))]=$((48+${DRN:3:1}))
        odata[$((cofs+71))]=$((48+${DRN:4:1}))
        odata[$((cofs+72))]=$((48+${DRN:5:1}))
        break
    fi
done
((cofs+=87)); ddentinfape=$cofs
for (( i=$cofs; i<$((1024+cofs)); i++ )); do odata[i]=255; done
set2bytes 4 $((cofs+1024))
ddentend=$((cofs+1024))
writebinary >"DOC_INF.BIN"
(2024/12/8 一部コード修正)
送信するfax文書が3ページなので
$ ./mkdocinf.sh 3
Loaded ...
New directory name is OBL001
$ ls -d OBL*/
OBL001/
$ ls OBL*.tif
OBL00101.tif	OBL00102.tif	OBL00103.tif
$ mv OBL*.tif OBL001/
$ ls OBL001/
OBL00101.tif	OBL00102.tif	OBL00103.tif
$ ls DOC_INF.BIN
DOC_INF.BIN
$ 
実行後、作成されたディレクトリ「OBL001」にTIFFファイル「OBL00101.tif」「OBL00102.tif」「OBL00103.tif」を移動する。「DOC_INF.BIN」とディレクトリ「OBL001」をSDメモリーカードの「/PRIVATE/MEIGROPU/PCC/FAX/DOC/」にコピーする。

作成された「DOC_INF.BIN」の内容

「赤枠」部は、ページ数

SDメモリーカードをKX-PD102に挿入認識後、「機能」「SDカード」「SDのパソコンデータ送信」

作成したfaxデータのタイトルが表示される。(追記:DOC_INF.BINの時間と表示時間が1分ほどズレている。サンプルデータを作り直したため)
「表示」でページ毎の内容をディスプレーで確認できる。

「ファックス送信」を選択して送信先電話番号を設定してfax送信ができる。

(3)その他
「DOC/OBL001/OBL001.TXT」は、存在しなくとも機能する
「DOC/DOC_INF.BIN」は、SDメモリを挿入認識させると「隠し属性」が設定される
「DOC/DOC_INF.BAK」は、設定されていなくても動作。SDメモリの挿入認識で自動作成される。
SDメモリのファイル名やディレクトリ名は、「小文字」でも機能する

 

Panasonic KX-PD102DのFaxTiffWriterがインストール出来ない
 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする