HELP

QRコード読み取り(v2)設定

QRコード読み取り(v2)設定は、DocuWorks文書からQRコードを読み取る場合に設定を行います。

QRコード読み取り」の後継となる処理で、新しいQRコード解析エンジンを使用しています。1ページに多数並んだQRコード、小さなQRコード、網点やFAXで印刷されたQRコードの読み取り率が向上しています。UTF-8で格納されたQRコードにも対応し、処理時間の上限と、読み取れなかったQRコードの検知(読み漏らし候補)の機能が加わりました。

XDW文書オープンの下か、ページの繰り返しの子ノードに追加します。

読み取り結果は、「QRコード読み取り」と同じ形式(項目名、座標の単位、QRコードの数の取得方法)でユーザーデータに保存されます。「QRコード読み取り」用に作ったマクロは、処理名を変えればそのまま使えます。処理時間や読み漏らし候補など、QRコード読み取り(v2)だけの情報は「処理名_Info」という別のユーザーデータに保存されます。

オープン処理名

XDW文書オープン処理を選択します。最後にオープンされたオープン処理名を返すマクロ「{%DW_GET(OpenName)}」がデフォルト表示されます。

ページ

QRコードの読み取りを行うページを1以上の整数で指定します。

ページの繰り返し処理内に処理を追加した場合は、処理中ページのカウンタを取得するマクロ「{%DW_GET(PageLoopCount)}」を使用できます。

ページの繰り返し処理内でない場合は、「1」などのページを直接指定します。

モード

QRコードの解析方法を「速度優先」「標準」「認識優先」から選択します。通常は「標準」を選択してください。

モード 内容
速度優先 最も高速なモードです。解析方法を絞り込み、大きな画像の分割解析や読み漏らし候補の検知を行いません。明瞭なQRコードが少数印刷された文書に向いています。小さなQRコードや劣化したQRコードは読み取れない場合があります。
標準 速度と読み取り率のバランスをとったモードです。
認識優先 読み取り漏れを最も少なくするモードです。小さなQRコードも検知しやすくし、処理時間の上限も長くとります。処理時間は長くなります。

各モードでは、詳細設定の項目に以下の値が使われます。

項目 速度優先 標準 認識優先
処理時間の上限 3000ms 8000ms 20000ms
固定2値化しきい値 0(自動) 0(自動) 0(自動)
最小モジュールサイズ 1 1 1
ファインダー検出の最小モジュール 使用しない 2.5px 2.0px
検出最大数 0(無制限) 0(無制限) 0(無制限)
読み漏らし候補の検知 しない する する

文字コード

文字コードを「ShiftJIS」「UTF-8」「自動判定」から選択します。

「ShiftJIS」「UTF-8」を選択すると、QRコードに格納されている文字を、選択した文字コードとしてデコードします。「自動判定」を選択すると、QRコードに格納されている文字の文字コードを判定してデコードします。

自動判定は文字の並びから文字コードを推定するため、短い文字列や記号だけの文字列では、正しく判定できない場合があります。QRコードの文字コードが決まっている場合は、「ShiftJIS」か「UTF-8」を選択してください。
また、UTF-8で取得した文字はUNICODEとして内部で記憶されますが、ログやテキストファイル等に出力する際にUTF-8を指定しないと文字化けしてしまいます。

範囲指定する

「基本設定」タブにあります。チェックすると、QRコードの読み取りする範囲をパーセント指定で指定できます。

X座標・Y座標

X座標とY座標の範囲を0~100の整数(パーセント)で指定します。開始には終了より小さい値を指定します。起点は左上になります。下記の例では、赤い部分が読み取りの対象となります。


X座標 0%~50%
Y座標 0%~50%

X座標 50%~100%
Y座標 50%~100%

QRコードの位置が決まっている場合は、範囲を指定すると処理速度が向上します。

範囲を指定しても、読み取り結果の座標(LeftTopXなど)は、ページ全体の左上を起点とした値になります。

検索文字を指定する

「基本設定」タブにあります。チェックすると、検索文字(正規表現)を指定できます。

検索文字(正規表現)

QRコードの内容から検索する文字を正規表現で指定します。検索文字に一致したQRコードだけが読み取り結果に残ります。

例えば、「A0001」の様な識別コードが格納されたQRコードを対象に読み取りを行いたい場合で、同じページに「http://www.test.com」の様な関係のないQRコードも印刷されている可能性がある場合に、以下のような正規表現を指定すれば、識別コードが格納されたQRコードのみを読み取り対象とすることができます。

^[A-Z]{1}[0-9]{4}$

上記の正規表現は、先頭(^)からA~Zのアルファベット1文字、数字4文字($は末尾の意味)が格納されたQRコードという意味になります。

分割マークをつける

「基本設定」タブにあります。チェックするとQRコードを検出したページをメモリに記憶します。ページ分割はファイル移動・コピー処理で行うことができます。検索文字を指定した場合は、検索文字に一致したQRコードがあるページが対象になります。

分割データ

ファイル移動・コピー処理で、分割を行う際に取得できるデータを指定します。

例えば、「{%GET_U(QRコード読み取り(v2)1,1,Data)}」と記述しておけば、ページ分割を行った際に、分割後のファイル名にQRコードのデータを使用することができるようになります。

詳細設定

「詳細設定」タブにあります。チェックすると、以下の5項目を指定できます。通常はチェックする必要はありません。特定の文書で読み取りがうまくいかない場合や、処理時間を調整したい場合に使用します。

詳細設定をチェックすると、5項目すべての値が、モードで決まる値の代わりに使われます。例えば「認識優先」を選択して詳細設定をチェックした場合、処理時間の上限は認識優先の20000msではなく、入力した値になります。入力欄の初期値は「標準」モードと同じ値です。選択したモードに合わせて、5項目とも値を見直してください。

処理時間の上限

1ページのQRコードの解析にかける時間の上限をミリ秒で指定します。上限に達すると解析を打ち切り、それまでに読み取れたQRコードを結果とします。打ち切りが起きたかどうかは、ユーザーデータ「処理名_Info」の「TimedOut」で確認できます。0を指定すると無制限になります。

地紋やノイズの多い画像で、処理時間が極端に長くなることを防ぐための設定です。

固定2値化しきい値

QRコードを解析する際に、画像を白と黒に分ける明るさのしきい値を0~255の整数で指定します。0を指定すると、画像の明るさに応じて自動で判定します。

特定のスキャナーで読み取った画像が極端に明るい場合や暗い場合に指定します。通常は0のままにしてください。

最小モジュールサイズ

モジュール(QRコードを構成する最小の正方形)の大きさの下限を、1~255の整数(ピクセル)で指定します。大きなQRコードだけを対象にして処理を速くしたい場合に大きくします。通常は1のままにしてください。

ファインダー検出の最小モジュール

読み漏らし候補の検知に使う値です。位置検出パターン(QRコードの3つの角にある四角い模様)を探す際の、モジュールの大きさの下限をピクセルで指定します。0より大きい数値を指定でき、小数も指定できます。

小さくすると小さなQRコードも読み漏らし候補として検知しますが、汚れやノイズを誤って検知しやすくなります。大きくすると誤った検知は減ります。「速度優先」モードでは読み漏らし候補の検知を行わないため、この値は使用されません。

検出最大数

1ページで読み取るQRコードの最大数を指定します。0を指定すると無制限になります。読み取り順(上から下、左から右)で先頭から数えます。

検索文字による絞り込みは、この数で打ち切った後に行われます。

ページのイメージ変換について

QRコードの読み取りは、ページを内部でイメージに変換して解析します。イメージのページはそのページの解像度で、それ以外のページ(アプリケーション文書のページなど)は300dpiで変換します。「QRコード読み取り」にあった出力解像度の設定はありません。変換した解像度は、読み取り結果の「Dpi」に保存されます。

詳細設定の「px」は、この変換後のイメージのピクセル単位です。

処理を実行すると、ログに「Page:1 QR:2 Time:208ms TimedOut:False」のように、ページ、読み取ったQRコードの数、解析にかかった時間、打ち切りの有無が出力されます。

QRコード読み取り(v2)で取得したデータの取得方法

QRコード読み取り(v2)で取得したQRコードの内容は、処理名をデータ名としたユーザーデータに、「QRコード読み取り」と同じ形式で保存されます。以下の例の「QRコード読み取り(v2)1」は処理名です。処理名を変更した場合は、変更後の処理名を指定してください。

ユーザーデータには、「処理名 > ページ内で読み取ったQRコードの番号 > 項目名」のキーで保存されます。番号は1から始まり、読み取り順(上から下、左から右)に付けられます。読み取ったQRコードの数は、「{%GET_USER_DATA_KEY_COUNT(処理名)}」で取得できます。

QRコードごとの情報

「{%GET_U(処理名,番号,キー)}」のように、2番目の引数に番号、3番目の引数に以下のキーを指定すると、対応した情報が取得できます。「Dpi」から「CheckDigit」までは、「QRコード読み取り」と同じキー、同じ並び順です。

キー
Dpi ページをイメージに変換した解像度。
Data QRコードの内容。改行を含む場合があります。
Version QRコードの型番。(1~40)
Level QRコードの誤り訂正レベル。「0」(L)、「1」(M)、「2」(Q)、「3」(H)のいずれかです。
LeftTopX QRコードの左上のX座標。(単位はmm)
LeftTopY QRコードの左上のY座標。(単位はmm)
RightTopX QRコードの右上のX座標。(単位はmm)
RightTopY QRコードの右上のY座標。(単位はmm)
RightBottomX QRコードの右下のX座標。(単位はmm)
RightBottomY QRコードの右下のY座標。(単位はmm)
LeftBottomX QRコードの左下のX座標。(単位はmm)
LeftBottomY QRコードの左下のY座標。(単位はmm)
Dgree QRコードの回転角度。(0~359)
DegreeForRotatePage QRコードを使った正立用の回転角度。(0、90、180、270)
TotalNumber QRコードの連結情報の連結個数。
例えば、3個で構成されたQRコードの場合は「3」となります。連結していない場合は「0」です。
SequenceNumber QRコードの連結情報の連結番号。
例えば、3個で構成されたQRコードの1番目のQRコードの場合は「1」となります。連結していない場合は「0」です。
CheckDigit QRコードの連結情報のチェックディジット。
分割前のデータのXORによるチェックサムパリティ(8ビット)が、10進数(0~255)で返却されます。
QRコードが分割されていない場合は「0」が返却されます。
MaskPattern QRコードのマスクパターン番号。(0~7)
判定できなかった場合は「-1」になります。
CharacterSet QRコードの内容から推定した文字コードの名前。「SHIFT_JIS」「UTF-8」「US-ASCII」など。
文字コードを指定した場合も推定した結果が入るため、指定した文字コードと一致しない場合があります。大文字と小文字は一定しません(「UTF-8」と「utf-8」など)。推定できなかった場合は空になります。
ErrorsCorrected 誤り訂正で訂正したコードワードの数。
多いほど、QRコードの汚れや欠けが大きいことを示す目安になります。
DetectorStrategy 読み取りに成功した解析方法の名前。(調査用)
IsStructuredAppend 連結QRコード(1つのデータを複数のQRコードに分割して格納したもの)の場合は「True」、それ以外は「False」。

座標は、ページの左上を起点としたmm単位の値です。小数点以下2桁までの値になります。四隅の座標は、QRコードの向きを基準にした角の位置です。QRコードが回転して印刷されている場合は、LeftTopXとLeftTopYの位置がページの左上側になるとは限りません。

処理名_Info (QRコード読み取り(v2)だけの情報)

解析全体の情報と読み漏らし候補は、処理名の後ろに「_Info」を付けたデータ名のユーザーデータに保存されます。例えば、処理名が「QRコード読み取り(v2)1」の場合は「QRコード読み取り(v2)1_Info」になります。「{%GET_U(処理名_Info,キー)}」のように指定して取得します。

キー
Count 読み取ったQRコードの数。検索文字を指定した場合は、検索文字に一致したQRコードの数です。
「{%GET_USER_DATA_KEY_COUNT(処理名)}」と同じ値です。
TimedOut 処理時間の上限に達して解析を打ち切った場合は「True」、それ以外は「False」。
「True」の場合は、読み取れていないQRコードがある可能性があります。
ElapsedMilliseconds 解析にかかった時間。(単位はミリ秒)
SuspectedRegionCount 読み漏らし候補の数。

読み漏らし候補の情報

読み漏らし候補は、位置検出パターン(QRコードの3つの角にある四角い模様)は見つかったものの、QRコードとして読み取れなかった領域です。「QRコードがありそうだが読めなかった」ことを示します。モードが「標準」「認識優先」の場合に検知します。候補の領域は自動で再解析され、読み取れたものは候補から除かれます。

「処理名_Info > SuspectedRegions > 候補の番号 > 項目名」のキーで保存されます。「{%GET_U(処理名_Info,SuspectedRegions,番号,キー)}」のように指定して取得します。

キー
Left 領域の左上のX座標。(単位はmm)
Top 領域の左上のY座標。(単位はmm)
Width 領域の幅。(単位はmm)
Height 領域の高さ。(単位はmm)
CenterX 領域の中心のX座標。(単位はmm)
CenterY 領域の中心のY座標。(単位はmm)
FinderCount 領域内で見つかった位置検出パターンの数。
Confidence 読み漏らしの確からしさ。「Low」(位置検出パターン1個相当)、「Medium」(2個相当)、「High」(3個。QRコードの形が成立している)のいずれかです。

ページの繰り返しの中では、読み取り結果はページごとに上書きされます。文書全体で「QRコードが1つも無い」ことを判定する場合は、ページごとの結果をADD_USER_DATAなどで累積し、繰り返しの後で累積した結果を判定してください。

「QRコード読み取り」との違い

読み取り結果の取得方法は「QRコード読み取り」と同じです。以下の点が異なります。

項目 QRコード読み取り QRコード読み取り(v2)
Dpi 出力解像度で指定した値(複数指定した場合は、読み取った解像度) イメージのページはページの解像度、それ以外は300
QRコードの並び順 解析エンジンが検出した順 読み取り順(上から下、左から右)
座標 単位はどちらもmmですが、解析方法の違いにより、同じQRコードでも0.2mm程度異なる場合があります。
追加された情報 QRコードごとの情報のMaskPattern、CharacterSet、ErrorsCorrected、DetectorStrategy、IsStructuredAppendと、「処理名_Info」
例1
QRコード読み取り(v2)1で取得した1番目のQRコードの内容(格納されている文字)をログに出力する。
{%WRITE_LOG(Data:{%GET_U(QRコード読み取り(v2)1,1,Data)})}
例2
QRコード読み取り(v2)1で取得したQRコードの情報を全てログに出力する。
{%LOOP L1 {%GET_USER_DATA_KEY_COUNT(QRコード読み取り(v2)1)}(
  {%WRITE_LOG(---------------------------------------------)}
  {%WRITE_LOG(Data:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],Data)})}
  {%WRITE_LOG(Dpi:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],Dpi)})}
  {%WRITE_LOG(Version:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],Version)})}
  {%WRITE_LOG(Level:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],Level)})}
  {%WRITE_LOG(LeftTopX:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],LeftTopX)})}
  {%WRITE_LOG(LeftTopY:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],LeftTopY)})}
  {%WRITE_LOG(RightTopX:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],RightTopX)})}
  {%WRITE_LOG(RightTopY:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],RightTopY)})}
  {%WRITE_LOG(RightBottomX:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],RightBottomX)})}
  {%WRITE_LOG(RightBottomY:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],RightBottomY)})}
  {%WRITE_LOG(LeftBottomX:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],LeftBottomX)})}
  {%WRITE_LOG(LeftBottomY:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],LeftBottomY)})}
  {%WRITE_LOG(Dgree:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],Dgree)})}
  {%WRITE_LOG(DegreeForRotatePage:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],DegreeForRotatePage)})}
  {%WRITE_LOG(TotalNumber:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],TotalNumber)})}
  {%WRITE_LOG(SequenceNumber:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],SequenceNumber)})}
  {%WRITE_LOG(CheckDigit:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],CheckDigit)})}
  {%WRITE_LOG(MaskPattern:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],MaskPattern)})}
  {%WRITE_LOG(CharacterSet:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],CharacterSet)})}
  {%WRITE_LOG(ErrorsCorrected:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],ErrorsCorrected)})}
  {%WRITE_LOG(DetectorStrategy:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],DetectorStrategy)})}
  {%WRITE_LOG(IsStructuredAppend:{%GET_U(QRコード読み取り(v2)1,[L_IDX(L1)],IsStructuredAppend)})}
)}
例3
QRコード読み取り(v2)1で検知した読み漏らし候補の位置をログに出力する。
{%LOOP L1 {%GET_U(QRコード読み取り(v2)1_Info,SuspectedRegionCount)}(
  {%WRITE_LOG(読み漏らし候補[L_IDX(L1)] 左上:{%GET_U(QRコード読み取り(v2)1_Info,SuspectedRegions,[L_IDX(L1)],Left)}mm/{%GET_U(QRコード読み取り(v2)1_Info,SuspectedRegions,[L_IDX(L1)],Top)}mm 確度:{%GET_U(QRコード読み取り(v2)1_Info,SuspectedRegions,[L_IDX(L1)],Confidence)})}
)}
例4
ページの繰り返しの中で、QRコードが無いページ、読み漏らし候補があるページ、処理時間の上限で打ち切ったページをログに出力する。
{%IF({%GET_USER_DATA_KEY_COUNT(QRコード読み取り(v2)1)}=0,
  {%WRITE_LOG(ページ{%DW_GET(PageLoopCount)}にQRコードがありません)}
,)}
{%IF({%GET_U(QRコード読み取り(v2)1_Info,SuspectedRegionCount)}>0,
  {%WRITE_LOG(ページ{%DW_GET(PageLoopCount)}に読み取れなかったQRコードがある可能性があります)}
,)}
{%IF({%GET_U(QRコード読み取り(v2)1_Info,TimedOut)}=True,
  {%WRITE_LOG(ページ{%DW_GET(PageLoopCount)}は処理時間の上限で解析を打ち切りました)}
,)}