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座標の範囲を0~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を指定すると無制限になります。
地紋やノイズの多い画像で、処理時間が極端に長くなることを防ぐための設定です。
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コードの内容は、処理名をデータ名としたユーザーデータに、「QRコード読み取り」と同じ形式で保存されます。以下の例の「QRコード読み取り(v2)1」は処理名です。処理名を変更した場合は、変更後の処理名を指定してください。
ユーザーデータには、「処理名 > ページ内で読み取ったQRコードの番号 > 項目名」のキーで保存されます。番号は1から始まり、読み取り順(上から下、左から右)に付けられます。読み取ったQRコードの数は、「{%GET_USER_DATA_KEY_COUNT(処理名)}」で取得できます。
「{%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)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コード読み取り(v2) |
|---|---|---|
| Dpi | 出力解像度で指定した値(複数指定した場合は、読み取った解像度) | イメージのページはページの解像度、それ以外は300 |
| QRコードの並び順 | 解析エンジンが検出した順 | 読み取り順(上から下、左から右) |
| 座標 | 単位はどちらもmmですが、解析方法の違いにより、同じQRコードでも0.2mm程度異なる場合があります。 | |
| 追加された情報 | - | QRコードごとの情報のMaskPattern、CharacterSet、ErrorsCorrected、DetectorStrategy、IsStructuredAppendと、「処理名_Info」 |
{%WRITE_LOG(Data:{%GET_U(QRコード読み取り(v2)1,1,Data)})}
{%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)})}
)}
{%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)})}
)}
{%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)}は処理時間の上限で解析を打ち切りました)}
,)}