基本仕様

  • PDFファイルをオープンすると、そのファイルを識別するためのキーを返却します。以後、識別キーを使って処理を行います。(識別キーはひとつだけメモリに記憶されますので省略することもできます。)

  • マクロでオープンされたPDFファイルで、クローズされていないファイルがある場合は、ファイルの繰り返し処理の最後、又は設定の実行の最後でクローズされます。(この場合のクローズは更新内容は保存されません。)

  • PDFのオープンクローズを使用すると、オープン時にファイルをロックするので他のプロセスが処理中にアクセスするのを防ぐことができます。また、処理の途中でエラーが発生してクローズが行われない場合はPDFの更新が行われないのでトランザクション処理が可能です。

PDFファイルオープン

FORMAT1 {%PDF_OPEN(PDFファイル名)}

引き数で指定されたPDFファイルをオープンします。ファイルが存在しない場合はエラーとなります。

オープンに成功した場合は識別キー、失敗した場合はエラーになります。

オープンに成功した場合は識別キーがメモリに記憶されます。以後、識別キーが省略された場合はメモリに記憶している識別キーを参照します。

メモリに記憶している識別キーは設定の実行が終わるまで保持しています。また、別のファイルをオープンすると上書きされます。

ファイルが使用中など、ファイルをオープンできなかった場合はエラーが発生します。

例1 D:\Home\PdfDemo\Demo01\Sample.pdfをオープンする。

#PDFファイルをオープン
{%PDF_OPEN(D:\Home\PdfDemo\Demo01\Sample.pdf)}

#クローズ
{%PDF_CLOSE()}

例2 識別キーを使用する場合(同時に複数のファイルを扱う場合はこちらを使ってください。)

#PDFファイルをオープン
{%SET_U(Pdf,Handle1,{%PDF_OPEN(D:\Home\PdfDemo\Demo01\Sample1.pdf)})}
{%SET_U(Pdf,Handle2,{%PDF_OPEN(D:\Home\PdfDemo\Demo01\Sample2.pdf)})}

#Sample1.pdfから文書属性(処理日)を取得
{%SET_U(属性,処理日,{%PDF_GET_DOCUMENT_ATTRIBUTE(#Key,{%GET_U(Pdf,Handle1)},処理日)})}

#Sample2.pdfにSample1.pdfから取得した文書属性(処理日)を設定
{%PDF_SET_DOCUMENT_ATTRIBUTE(#Key,{%GET_U(Pdf,Handle2)},処理日,{%GET_U(属性,処理日)})}

#クローズ
{%PDF_CLOSE({%GET_U(Pdf,Handle1)})}
{%PDF_CLOSE({%GET_U(Pdf,Handle2)})}
PDFファイルクローズ

FORMAT1 {%PDF_CLOSE([識別キー])}

引き数に渡されたハンドルのPDFファイルをクローズします。

引き数が省略された場合はメモリに記憶されている識別キーを参照して対象ファイルをクローズします。

オープンされているPDFファイルがない場合に呼び出してもエラーにならず、何も行いません。

PDFテキスト抽出

FORMAT1 {%PDF_EXTRACT_TEXT(ページ番号,抽出済データ用ユーザーデータ名,[領域指定ユーザーデータ名],[方式])}

FORMAT2 {%PDF_EXTRACT_TEXT(#Key,識別キー,ページ番号,抽出済データ用ユーザーデータ名,[領域指定ユーザーデータ名],[方式])}

PDFファイルの指定ページからテキストを抽出します。

ページ番号には抽出対象のページ番号を指定します。Allを指定するとすべてのページが対象となります。

抽出済データ用ユーザーデータ名には、抽出したテキストデータを格納するユーザーデータの名前を指定します。

領域指定ユーザーデータ名には、特定の領域のテキストを抽出するための座標情報をセットしたユーザーデータの名前を指定します。

方式には、テキストのまとまり(単語)の作り方を 1 か 2 で指定します。省略したときは 1 です。(Version 2.7.0から)

  • 1:今までと同じ作り方です。

  • 2:改善版です。文字の位置から行を作り、近い文字をまとめます(DocuWorks文書の DW_EXTRACT_TEXT と同じ作り方)。領域指定は、文字ごとに領域の中にあるかを判定します(まとまりの範囲が丸ごと領域の中にあるときは、そのまとまりの文字をすべて取ります)。抽出済データの最上位に Version(2) が追加されます。

領域指定を使わずに方式だけを指定するときは、領域指定ユーザーデータ名を空にします(例 {%PDF_EXTRACT_TEXT(All,抽出データ,,2)})。

抽出する文字のうち、康熙部首(⽂ など)・CJK部首補助(⻘ など)・CJK互換漢字の3字(漣・煉・溺)は同じ字形の普通の漢字に、半角の円記号(U+00A5)は円記号(U+005C)にしてセットします。見た目が同じでも文字コードが違うため、検索や比較で一致しないのを防ぎます(全角の円記号 ¥ はそのままです)。(Version 2.7.1から)

所有者パスワードで内容のコピーが禁止されたPDFでは、エラーになります。(Version 2.7.0から)

領域指定の方法

領域指定は以下のような階層データをユーザーデータで作成して指定します。

領域指定
    Page
        All(ページ番号の指定も可)
            項目名1(左下座標を指定)
                X        左上X座標
                Y        左上Y座標
                BottomRightX    右下X座標
                BottomRightY    右下Y座標
            項目名2(幅と高さを指定)
                X        左上X座標
                Y        左上Y座標
                Width    幅
                Height   高さ

座標指定には以下の2つの方法があります:

  • 方法1:X、Y、BottomRightX、BottomRightYで指定

  • 方法2:X、Y、Width、Heightで指定

両方の方法で座標を指定した場合、BottomRightX、BottomRightYが優先されます。

工事名と図面名の座標を指定する場合

工事名はA棟と新築工事の間にスペースがあるため、単語の認識が2つに分かれます。

領域を工事名の左側の枠内の範囲にすれば分割された単語をすべて取得することができます。

{%SET_U(範囲指定,Page,All,工事名,X,192.85)}
{%SET_U(範囲指定,Page,All,工事名,Y,179.47)}
{%SET_U(範囲指定,Page,All,工事名,BottomRightX,253.55)}
{%SET_U(範囲指定,Page,All,工事名,BottomRightY,185.20)}
{%SET_U(範囲指定,Page,All,図面名,X,192.61)}
{%SET_U(範囲指定,Page,All,図面名,Y,186.88)}
{%SET_U(範囲指定,Page,All,図面名,BottomRightX,253.55)}
{%SET_U(範囲指定,Page,All,図面名,BottomRightY,193.09)}

抽出結果について

領域指定ユーザーデータ名を指定しない場合

領域指定ユーザーデータ名を指定しない場合、以下のような結果が取得されます:

FileName	図面サンプル.pdf
PageCount	2
Pages
	1
		1
			Text	図面番号
			X	268.25
			Y	179.66
			Width	14.64
			Height	3.42
		2
			Text	3
			X	278.93
			Y	190.12
			Width	2.12
			Height	3.70
			・
			・

領域指定ユーザーデータ名を指定した場合

領域指定ユーザーデータ名を指定した場合、以下のような結果が取得されます:

FileName	ng.PDF
PageCount	1
Pages
	1
		Rect
			工事名
				Texts
					1	A社
					2	新築工事
				TextBlock
					1
						Text	A社
						X	194.61
						Y	180.50
						Width	6.06
						Height	3.48
					2
						Text	新築工事
						X	202.16
						Y	180.44
						Width	14.81
						Height	3.54
				X	192.85
				Y	179.47
				Width	60.70
				Height	5.74
				BottomRightX	253.55
				BottomRightY	185.20
			図面名
				Texts
					1	1階
					2	平面詳細図
			・
			・

例1 sample.pdfの1ページ目からすべてのテキストを抽出する

#PDFファイルをオープン
{%PDF_OPEN(D:\Home\PdfDemo\Demo01\Sample.pdf)}

# PDFテキスト抽出
{%PDF_EXTRACT_TEXT(1,抽出データ)}

# 抽出したテキスト数を確認
{%WRITE_LOG(抽出したテキスト数: {%GET_USER_DATA_COUNT(抽出データ,Pages,1)})}

#クローズ
{%PDF_CLOSE()}

例2 処理中PDFファイルの全ページから工事名と図面名の領域を指定してテキストを抽出する

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

# 領域座標を設定
{%SET_U(範囲指定,Page,All,工事名,X,192.85)}
{%SET_U(範囲指定,Page,All,工事名,Y,179.47)}
{%SET_U(範囲指定,Page,All,工事名,BottomRightX,253.55)}
{%SET_U(範囲指定,Page,All,工事名,BottomRightY,185.20)}
{%SET_U(範囲指定,Page,All,図面名,X,192.61)}
{%SET_U(範囲指定,Page,All,図面名,Y,186.88)}
{%SET_U(範囲指定,Page,All,図面名,BottomRightX,253.55)}
{%SET_U(範囲指定,Page,All,図面名,BottomRightY,193.09)}

# PDFテキスト抽出
{%PDF_EXTRACT_TEXT(All,抽出データ)}

{%LOOP L1 {%GET_U(抽出データ,PageCount)}(
  {%WRITE_LOG(Page:[L_IDX(L1)])}

  # 指定領域毎のテキストを取得(複数に分かれた単語も連結)
  {%SET_U(属性,工事名,{%JOIN(抽出データ,Pages,[L_IDX(L1)],Rect,工事名,Texts, )})}
  {%SET_U(属性,図面名,{%JOIN(抽出データ,Pages,[L_IDX(L1)],Rect,図面名,Texts, )})}

  {%WRITE_LOG(工事名:{%GET_U(属性,工事名)})}
  {%WRITE_LOG(図面名:{%GET_U(属性,図面名)})}
)}

#クローズ
{%PDF_CLOSE()}
PDF OCRテキスト抽出

FORMAT1 {%PDF_OCR_TEXT(ページ番号,抽出済データ用ユーザーデータ名,[領域指定ユーザーデータ名],[OCRオプション用ユーザーデータ名])}

FORMAT2 {%PDF_OCR_TEXT(#Key,識別キー,ページ番号,抽出済データ用ユーザーデータ名,[領域指定ユーザーデータ名],[OCRオプション用ユーザーデータ名])}

オープンしたPDFファイルの指定ページを画像にして文字を読み取り(OCR)、テキストを位置(座標)付きで抽出します。(Version 2.7.0から)

PDFのテキストは使わずにページの画像を読み取るので、スキャンしたイメージのPDFからも抽出できます。結果は PDFテキスト抽出(PDF_EXTRACT_TEXT)と同じ形で、抽出済データ用ユーザーデータにセットされます。PDF_EXTRACT_TEXT 用に作ったマクロ(JOIN・LOOP など)は、そのまま使えます。

識別キー・ページ番号・抽出済データ用ユーザーデータ名・領域指定ユーザーデータ名の指定方法は、PDF_EXTRACT_TEXT と同じです。領域を指定すると、その領域だけを読み取ります(部分OCR)。領域より少し広い範囲を読み取り、領域の中の文字だけでまとまりを作るので、領域の線にかかった文字が崩れて読み取られることはありません。

OCRオプション用ユーザーデータ名を指定すると、読み取りの設定を変えられます(下の表)。領域指定を使わずにOCRオプションだけを指定する場合は、領域指定ユーザーデータ名を空にします(例 {%PDF_OCR_TEXT(All,抽出データ,,OCR設定)})。

戻り値は空文字です。ログには「テキストを抽出しました。 PDFファイル識別子: 識別キー ページ: ページ番号」と出力されます。表認識(OCRオプションの Tables が 1)の場合は、最後に「 表: 見つけた表の数」が付きます。

OCR について

  • 文字の読み取りには、深層学習 OCR の PaddleOCR(PP-OCRv6_small)を使います(深層学習 OCR について)。DocuWorks の OCR は使わないので、DocuWorks Ver.9 の OCR の制限解除のライセンスは要りません。日本語と英数字を読み取ります。

  • このマクロを使うには、64 ビットの Windows が必要です(深層学習 OCR の部品が 64 ビットのため)。

  • テキストのまとまりの作り方は、XDWテキスト抽出(DW_EXTRACT_TEXT)と同じ(改善版)です。

  • 読み取った文字のうち、康熙部首・CJK部首補助・CJK互換漢字の3字(漣・煉・溺)は同じ字形の普通の漢字に、半角の円記号(U+00A5)は円記号(U+005C)にしてセットします(PDF_EXTRACT_TEXT と同じです。Version 2.7.1から)。

  • 読み取りには、1ページ(A4・300dpi)で1~2秒ほどかかります(パソコンの性能と、ページの文字の量によって変わります)。

  • ページに描かれた文字だけを読み取ります。PDFのテキストにあっても、紙面に表示されない文字(白い文字など)は読み取られません。

OCRオプション

OCRオプション用ユーザーデータに、次のキーで値をセットします。キーが無い場合や値が空の場合は、既定値になります。

キー

内容

既定値

Dpi

ページを画像にする解像度(150~600)。文字が小さい文書は、大きくすると読み取れることがあります(時間は長くなります)。

300

Tables

表認識。1:表の罫線を見つけ、罫線で囲まれたセルを1つずつ読み取り、表の行・列とセルの文字を抽出データの Tables にセットします(下の「表認識の結果」)。読み取りの時間は約2倍になります。0:表認識をしません。(Version 2.7.1から)

0

AreaOnly

領域指定がある場合の読み取り方。1:領域だけを読み取る。0:ページ全体を読み取ってから、領域に当てはめる。Auto:領域を広げた面積の合計がページの半分を超える場合はページ全体、超えない場合は領域だけを読み取る。

Auto

Margin

領域だけを読み取る場合に、領域を広げて読み取る幅(mm・0~50)。領域の中の文字だけでまとまりを作るので、結果は領域の中の文字だけです。

10

Timeout

1回の読み取りの上限(秒・10~3600)。超えるとエラーになります。表認識(Tables が 1)の場合の既定値は 600 です。

180(表認識は600)

抽出結果について

PDF_EXTRACT_TEXT と同じ形で、最上位に Source(OCR)・Engine(読み取りに使ったOCR)・Version(2)・Warnings(警告)が加わります(XDW OCRテキスト抽出(DW_OCR_TEXT)と同じ)。文字が1つも読み取れないページ(白紙のページなど)は、Warnings に Code「NoText」がセットされます。

FileName	D:\Sample\見積書_スキャン.pdf
PageCount	1
Source	OCR
Engine	PaddleOCR PP-OCRv6_small
Version	2
Pages
	1
		1
			Text	御見積書
			X	70.62
			Y	21.17
			Width	68.81
			Height	13.89
			・
			・
Warnings

表認識の結果

OCRオプションの Tables に 1 を指定すると、最上位に Tables が加わり、ページごとに見つけた表がセットされます(表が無いページは空です)。表のセルの中のテキストのまとまりには、Cell(表の番号,行,列)が加わります。Pages の形は変わらないので、今までのマクロはそのまま使えます。(Version 2.7.1から)

  • 表の番号は、ページごとに 1 からの番号です。Rows・Cols は表の行と列の数、X・Y・Width・Height は表の位置(mm)です。

  • Cells は、セルごとの行(Row)・列(Col)・結合した行の数(RowSpan)と列の数(ColSpan)・文字(Text)・位置(罫線の内側・mm)です。上の行から、行の中は左から並びます。セルの中で行が分かれている文字は、半角の空白でつないで1つの Text にします。

  • Grid は、行×列のマスの文字です。結合したセルの文字は左上のマスだけに入り、結合で隠れたマスと空のセルは空文字です。表を行ごとに取り出す場合(例2)に使います。

  • 表として認識するのは、罫線で囲まれたセルです。横の点線の罫線(FAXの明細の行の区切りなど)も罫線として扱います(縦の点線は、金額の欄の桁の区切りのことが多いため扱いません)。罫線の無い表は表として認識されず、テキストのまとまりは Pages だけにセットされます。

  • 領域指定と一緒に使う場合は、領域を Margin だけ広げた範囲にある表がセットされ、表に Rect(領域の名前)が加わります。

FileName	D:\Sample\請求書_スキャン.pdf
PageCount	1
Source	OCR
Engine	PaddleOCR PP-OCRv6_small
Version	2
Pages
	1
		1
			・
			・
		34
			Text	御請求額
			X	29.59
			Y	65.53
			Width	10.99
			Height	3.30
			Cell	1,1,1
			・
			・
Tables
	1
		1
			Rows	2
			Cols	7
			X	23.79
			Y	65.11
			Width	173.48
			Height	9.23
			Cells
				1
					Row	1
					Col	1
					RowSpan	1
					ColSpan	1
					Text	御請求額
					X	23.79
					Y	65.11
					Width	22.52
					Height	4.40
				2
					・
					・
			Grid
				1
					1	御請求額
					2	御入金額
					・
					・
				2
					1	105,230
					2	0
					・
					・
		2
			・
			・
Warnings

例1 PDFファイルの1ページ目から、宛名と総金額の領域だけを OCR で読み取る

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

# 領域座標を設定
{%SET_U(領域指定,Page,All,宛名,X,15)}
{%SET_U(領域指定,Page,All,宛名,Y,45)}
{%SET_U(領域指定,Page,All,宛名,Width,60)}
{%SET_U(領域指定,Page,All,宛名,Height,12)}
{%SET_U(領域指定,Page,All,総金額,X,90)}
{%SET_U(領域指定,Page,All,総金額,Y,85)}
{%SET_U(領域指定,Page,All,総金額,BottomRightX,130)}
{%SET_U(領域指定,Page,All,総金額,BottomRightY,95)}

# PDF OCRテキスト抽出
{%PDF_OCR_TEXT(1,抽出データ,領域指定)}

# 指定領域毎のテキストを取得(複数に分かれた単語も連結)
{%WRITE_LOG(宛名:{%JOIN(抽出データ,Pages,1,Rect,宛名,Texts, )})}
{%WRITE_LOG(総金額:{%JOIN(抽出データ,Pages,1,Rect,総金額,Texts, )})}

#クローズ
{%PDF_CLOSE()}

例2 PDFファイルの1ページ目を表認識で読み取り、2つ目の表を1行ずつ「 / 」区切りでログに出力する

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

# OCRの設定 (表認識)
{%SET_U(OCR設定,Tables,1)}

# PDF OCRテキスト抽出
{%PDF_OCR_TEXT(1,抽出データ,,OCR設定)}

# 1ページ目の表の数と、2つ目の表の行数・列数
{%WRITE_LOG(表の数:{%GET_USER_DATA_KEY_COUNT(抽出データ,Tables,1)})}
{%WRITE_LOG(行数:{%GET_U(抽出データ,Tables,1,2,Rows)} 列数:{%GET_U(抽出データ,Tables,1,2,Cols)})}

# 2つ目の表を、1行ずつ「 / 」区切りでログに出力する
{%LOOP L1 {%GET_U(抽出データ,Tables,1,2,Rows)}(
  {%WRITE_LOG({%JOIN(抽出データ,Tables,1,2,Grid,[L_IDX(L1)], / )})}
)}

#クローズ
{%PDF_CLOSE()}

請求書の明細の表を読み取ったときのログの例です(金額には「,」が入るので、区切りは「 / 」にしています)。

表の数:2
行数:25 列数:11
取引年月日 / 品名 / 手数料 / 単量 / 入数 / 個数 / 容量 / 数量 / 単価 / 金額 / 消費税
2025/5/1 / キャベツ ※ /  / 10.00 /  / 1 / 10.00 /  / 350 / 3,500 / 280
2025/5/1 / レタス ※ /  / 10.00 /  / 1 / 10.00 /  / 300 / 3,000 / 240
・
・
PDF QRコード読み取り

FORMAT1 {%PDF_DECODE_QR(ページ番号,結果ユーザーデータ名,[モード],[文字コード],[オプションユーザーデータ名])}

FORMAT2 {%PDF_DECODE_QR(#Key,識別キー,ページ番号,結果ユーザーデータ名,[モード],[文字コード],[オプションユーザーデータ名])}

PDFファイルの指定ページをイメージに変換して、QRコードを読み取ります。

読み取り結果は、DocuWorks文書の処理「QRコード読み取り(v2)」と同じ項目名・同じ値の形式でユーザーデータに格納されます。「QRコード読み取り(v2)」用に作ったマクロは、参照するユーザーデータの階層を変えるだけでそのまま使えます。

戻り値は読み取ったQRコードの総数です。検索文字で絞り込んだ後の件数で、全ページの合計になります。0件はエラーになりません(0を返します)。

引数

内容

ページ番号

読み取り対象のページ番号を指定します。1以上の整数、またはAll(全ページ)を指定します。PDFファイルのページ数を超えるページを指定するとエラーになります。

結果ユーザーデータ名

読み取り結果を格納するユーザーデータの名前を指定します。実行時に同名のユーザーデータがある場合は削除してから作り直します。

モード

SpeedPriority(速度優先)、Standard(標準)、RecognitionPriority(認識優先)のいずれかを指定します。省略した場合はStandardになります。

文字コード

SJIS、UTF-8、自動のいずれかを指定します。省略した場合はSJISになります。

オプションユーザーデータ名

詳細設定・範囲指定・検索文字をまとめた階層データを作成したユーザーデータの名前を指定します。指定したキーだけがモードの値を上書きします。

オプションユーザーデータの指定

オプションユーザーデータは以下のような階層データをユーザーデータで作成して指定します。指定しなかったキーはモードの値のままになります。

オプションユーザーデータ名
    Dpi                    ページをイメージに変換する解像度(72~600)。既定 300
    TimeBudgetMs           処理時間の上限(ms)。0=無制限
    BrightnessBorder       固定2値化しきい値(0~255)。0=自動
    MinimumModuleSize      最小モジュールサイズ(px, 1~255)
    MinFinderModuleSize    ファインダー検出の最小モジュール(px, 0より大きい数値)
    MaxSymbols             検出最大数。0=無制限
    SearchString           検索文字(正規表現)。一致したQRコードだけを結果に残す
    Range
        StartX             範囲 X開始(%, 0~100の整数)
        StartY             範囲 Y開始(%)
        EndX               範囲 X終了(%)  ※開始 < 終了
        EndY               範囲 Y終了(%)

キーの値が空文字の場合は、指定しなかったものとして扱います(モードの値のままになります)。Rangeを指定する場合はStartX・StartY・EndX・EndYをすべて指定してください。

PDFのページには解像度の概念がないため、QRコードを読み取るときの解像度はDpiで指定します。読み取りに使った解像度は結果のDpiに格納されます。範囲指定をしても、結果の座標はページ全体を基準にした値になります。

読み取り結果について

結果ユーザーデータには以下のような内容が格納されます。読み取り対象にしたページは、QRコードが0件でもページのスレッドが作られます。

結果ユーザーデータ名
    FileName        PDFのファイル名
    PageCount       PDFの総ページ数
    Count           読み取ったQRコードの総数(全ページ合計・絞り込み後。戻り値と同じ)
    Pages
        <ページ番号>                ← 対象ページは0件でもスレッドを作る
            <番号 1~n>             ← 読み順(上→下、左→右)
                Dpi                 イメージに変換した解像度(dpi)
                Data                QRコードの内容
                Version             型番 1~40
                Level               誤り訂正レベルの数値 0=L,1=M,2=Q,3=H
                LeftTopX / LeftTopY / RightTopX / RightTopY
                RightBottomX / RightBottomY / LeftBottomX / LeftBottomY
                                    四隅の座標(mm・小数第2位で四捨五入・ページ左上が原点)
                Dgree               QRコードの回転角度(0~359)
                DegreeForRotatePage 正立させる回転角度(0/90/180/270)
                TotalNumber / SequenceNumber / CheckDigit    連結QR情報(非連結は0)
                MaskPattern / CharacterSet / ErrorsCorrected / DetectorStrategy / IsStructuredAppend
    Info                            ← Pages と同じ階層
        Count                   総件数
        TimedOut                いずれかのページで打ち切りが起きたら True
        ElapsedMilliseconds     解析時間の合計(ms)
        SuspectedRegionCount    読み漏らし候補の合計
        Pages
            <ページ番号>
                Count / TimedOut / ElapsedMilliseconds / SuspectedRegionCount
                SuspectedRegions
                    <番号>
                        Left / Top / Width / Height / CenterX / CenterY (mm)
                        FinderCount / Confidence

ページのスレッドの直下はQRコードの番号だけです。解析全体の情報はPagesと同じ階層のInfoに格納されるため、{%GET_USER_DATA_KEY_COUNT(結果ユーザーデータ名,Pages,ページ番号)}でページごとのQRコードの数が取得できます。

取りたいもの

書き方

全体の件数

{%GET_U(QR結果,Count)}

2ページ目の件数

{%GET_USER_DATA_KEY_COUNT(QR結果,Pages,2)}

2ページ目の1件目の内容

{%GET_U(QR結果,Pages,2,1,Data)}

2ページ目が打ち切られたか

{%GET_U(QR結果,Info,Pages,2,TimedOut)}

読み取り対象になったページ数

{%GET_USER_DATA_KEY_COUNT(QR結果,Pages)}

0件・打ち切り(TimedOut)・読み漏らし候補ありは、いずれもエラーになりません。結果とInfoに記録されるので、判定はマクロで行ってください。

QRコード読み取り(v2)との違い

  • 分割マークの機能はありません。分割マークはDocuWorks文書のページに付ける機能です。PDFの分割は{%PDF_SPLIT_PAGE(ページ,出力ファイルパス)}で行ってください。

  • 詳細設定は、オプションユーザーデータで指定したキーだけがモードの値を上書きします。「QRコード読み取り(v2)」はチェックを入れると5項目すべてがモードの値を上書きします。

  • ページ番号にAllを指定して全ページを対象にできます。

  • 解析全体の情報は、別のユーザーデータではなく結果ユーザーデータの中のInfoに格納されます。

  • 文字コードは数値ではなく、SJIS・UTF-8・自動の語で指定します(READ_FILE・READ_CSV_FILEと同じ表記)。

例1 処理中のPDFファイルの全ページからQRコードを読み取り、1件目の内容を文書属性に入れる。

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

#全ページのQRコードを読み取る(認識優先・文字コードは自動判定)
{%SET_U(wk,QR件数,{%PDF_DECODE_QR(All,QR結果,RecognitionPriority,自動)})}

#1件も読めなければ業務エラーとして分岐用のフラグを立てる
{%IF({%GET_U(wk,QR件数)}=0,
  {%SET_U(wk,結果,QRなし)}
,
  {%SET_U(wk,結果,OK)}
  {%SET_U(属性,管理番号,{%GET_U(QR結果,Pages,1,1,Data)})}
)}

#PDFファイルをクローズ
{%PDF_CLOSE()}

例2 範囲と検索文字を指定して読み取り、ページごとに件数を確認する。

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

#読み取り条件(右上25%・管理番号で始まるQRだけ・上限5秒)
{%SET_U(QR条件,Range,StartX,50)}
{%SET_U(QR条件,Range,StartY,0)}
{%SET_U(QR条件,Range,EndX,100)}
{%SET_U(QR条件,Range,EndY,50)}
{%SET_U(QR条件,SearchString,^管理番号)}
{%SET_U(QR条件,TimeBudgetMs,5000)}

#全ページのQRコードを読み取る
{%SET_U(wk,QR件数,{%PDF_DECODE_QR(All,QR結果,Standard,SJIS,QR条件)})}

#ページごとに件数と打ち切りを記録する
{%LOOP L1 {%GET_U(QR結果,PageCount)}(
  {%WRITE_LOG(Page:[L_IDX(L1)] 件数:{%GET_USER_DATA_KEY_COUNT(QR結果,Pages,[L_IDX(L1)])} 打ち切り:{%GET_U(QR結果,Info,Pages,[L_IDX(L1)],TimedOut)})}
)}

#PDFファイルをクローズ
{%PDF_CLOSE()}
PDF文書情報取得

FORMAT1 {%PDF_GET_DOCUMENT_INFO(結果格納用ユーザーデータ名)}

FORMAT2 {%PDF_GET_DOCUMENT_INFO(#Key,識別キー,結果格納用ユーザーデータ名)}

オープンされているPDFファイルから文書情報を取得します。

結果格納用ユーザーデータ名には、取得した情報を格納するユーザーデータの名前を指定します。指定したユーザーデータに既存の内容がある場合は置き換えられます。

結果格納用ユーザーデータの内容

名前

内容

Pages

ページ数

Version

PDFのバージョン(1.4、1.7 など)

バージョンを取得できなかった場合は空文字が格納されます。

例1 PDFファイルのページ数とバージョンを取得してログに出力する。

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

#文書情報を取得
{%PDF_GET_DOCUMENT_INFO(DocInfo)}

{%WRITE_LOG(ページ数:{%GET_U(DocInfo,Pages)})}
{%WRITE_LOG(バージョン:{%GET_U(DocInfo,Version)})}

#クローズ
{%PDF_CLOSE()}

結果
ページ数:3
バージョン:1.4

例2 識別キーを使用して、同時にオープンした複数のPDFファイルのページ数を取得する。

#PDFファイルをオープン
{%SET_U(Pdf,Handle1,{%PDF_OPEN(D:\Home\PdfDemo\Demo01\Sample1.pdf)})}
{%SET_U(Pdf,Handle2,{%PDF_OPEN(D:\Home\PdfDemo\Demo01\Sample2.pdf)})}

#それぞれの文書情報を取得
{%PDF_GET_DOCUMENT_INFO(#Key,{%GET_U(Pdf,Handle1)},DocInfo1)}
{%PDF_GET_DOCUMENT_INFO(#Key,{%GET_U(Pdf,Handle2)},DocInfo2)}

{%WRITE_LOG(Sample1.pdf:{%GET_U(DocInfo1,Pages)}ページ)}
{%WRITE_LOG(Sample2.pdf:{%GET_U(DocInfo2,Pages)}ページ)}

#クローズ
{%PDF_CLOSE({%GET_U(Pdf,Handle1)})}
{%PDF_CLOSE({%GET_U(Pdf,Handle2)})}
PDF文書属性取得

FORMAT1 {%PDF_GET_DOCUMENT_ATTRIBUTE(属性名,[未定義時の処理(エラー|空文字返却)])}

FORMAT2 {%PDF_GET_DOCUMENT_ATTRIBUTE(#Key,識別キー,属性名,[未定義時の処理(エラー|空文字返却)])}

PDF文書オープン処理名で指定されたPDF文書から、文書属性を取得します。

属性名は、255文字以内で指定してください。

未定義時の処理を省略した場合またはエラーを指定した場合は、存在しない属性名を指定した場合にエラーとなります。

未定義時の処理に空文字返却を指定した場合は、存在しない属性名を指定した場合に空文字が返却されます。

属性名に以下の名前を指定した場合は、概要タブの各項目を取得できます。

名前

内容

Author

作成者

CreationDate

作成日

Creator

作成アプリケーション

Keywords

キーワード

ModDate

更新日

Producer

PDF作成者

Subject

サブタイトル

Title

タイトル

Trappedは予約語のため使用できません。

例1 「文書名」という属性名で文書属性から値を取得する。

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

{%WRITE_LOG({%PDF_GET_DOCUMENT_ATTRIBUTE(文書名,空文字返却)})}

#クローズ
{%PDF_CLOSE()}

例2 概要のタイトルから値を取得する。

{%WRITE_LOG({%PDF_GET_DOCUMENT_ATTRIBUTE(Title)})}
PDF文書属性設定

FORMAT1 {%PDF_SET_DOCUMENT_ATTRIBUTE(属性名,属性値)}

FORMAT2 {%PDF_SET_DOCUMENT_ATTRIBUTE(#Key,識別キー,属性名,属性値)}

PDF文書オープン処理名で指定されたPDF文書に、文書属性を設定します。

属性名は、255文字以内で指定してください。 属性値は、文字列を指定します。

作成日時(CreationDate)・更新日時(ModDate)には、日時として読める値(yyyy/MM/dd HH:mm:ss など)を指定してください。日時として読めない値を指定するとエラーになります。(Version 2.7.0から。以前は文字のまま書き込んでいました)

属性値に Shift_JIS に無い文字(é・® など)があっても、近い文字に置き換えずにそのまま書き込みます。(Version 2.7.0から)

所有者パスワードで変更が禁止されたPDFでは、エラーになります。(Version 2.7.0から)

属性名に以下の名前を指定した場合は、概要タブの各項目を設定できます。

名前

内容

Author

作成者

CreationDate

作成日

Creator

作成アプリケーション

Keywords

キーワード

ModDate

更新日

Producer

PDF作成者

Subject

サブタイトル

Title

タイトル

Trappedは予約語のため使用できません。

例1 1番目に取得したQRコードの内容を「文書名」という属性名で文書属性に設定する。

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

{%PDF_SET_DOCUMENT_ATTRIBUTE(文書名,{%GET_U(QRコード読み取り1,1,Data)})}

#クローズ
{%PDF_CLOSE()}

例2 システム日付を「処理日」という属性名で文書属性に設定する。

{%PDF_SET_DOCUMENT_ATTRIBUTE(処理日,{%DATE(yyyy/MM/dd)})}

例3 概要のタイトルに「サンプル」を設定する。

{%PDF_SET_DOCUMENT_ATTRIBUTE(Title,サンプル)}
PDF文書属性存在チェック

FORMAT1 {%PDF_EXISTS_DOCUMENT_ATTRIBUTE(属性名)}

FORMAT2 {%PDF_EXISTS_DOCUMENT_ATTRIBUTE(#Key,識別キー,属性名)}

属性名で指定された文書属性の存在チェックを行います。

指定した属性が存在する場合は、Trueを、存在しない場合はFalseを返却します。

例 文書属性「処理日」が存在する場合は、ログに「属性あり」を出力する。

{%PDF_SET_DOCUMENT_ATTRIBUTE(処理日,{%DATE(yyyy/MM/dd)})}
{%IF({%PDF_EXISTS_DOCUMENT_ATTRIBUTE(処理日)}=True,
  {%WRITE_LOG(属性あり)}
,
  {%WRITE_LOG(属性なし)}
)}
結果
属性あり
PDF文書属性削除

FORMAT1 {%PDF_DELETE_DOCUMENT_ATTRIBUTE(属性名)}

FORMAT2 {%PDF_DELETE_DOCUMENT_ATTRIBUTE(#Key,識別キー,属性名)}

属性名で指定された文書属性を削除します。

所有者パスワードで変更が禁止されたPDFでは、エラーになります。(Version 2.7.0から)

例 文書属性「FAX番号」を削除する。

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

{%PDF_DELETE_DOCUMENT_ATTRIBUTE(FAX番号)}

#クローズ
{%PDF_CLOSE()}
PDFページ削除

FORMAT1 {%PDF_DELETE_PAGE(ページ)}

FORMAT2 {%PDF_DELETE_PAGE(#Key,識別キー,ページ)}

オープン中のPDFからページを削除します。

ページには、2|3|4のように|で区切って複数のページを指定できます。

2-と指定すると2ページ目以降が削除されます。

2-5と指定すると2~5ページが削除されます。

-5と指定すると1~5ページが削除されます。

1|3-と指定すると1ページと5ページ目以降が削除されます。

1-|-5のように重複した表現があってもエラーにならず、すべての指定されたページの削除を行います。

すべてのページが削除されるような指定をした場合はエラーになります(「PDFファイルの全てのページを削除することはできません。 ページ: … PDFファイルのページ数: …」)。(Version 2.7.0から。以前は0ページのPDFになりました)

所有者パスワードでページの組み替えが禁止されたPDFでは、エラーになります。(Version 2.7.0から)

例 Sample.pdfから2ページ目以降を削除する

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

#2ページ目以降を削除 
{%PDF_DELETE_PAGE(2-)}

#クローズ
{%PDF_CLOSE()}
PDFページ分割

FORMAT1 {%PDF_SPLIT_PAGE(ページ,出力ファイルパス)}

FORMAT2 {%PDF_SPLIT_PAGE(#Key,識別キー,ページ,出力ファイルパス)}

オープン中のPDFを出力ファイルパスにページ分割したファイルを出力します。

ページには、1|2|3のように|で区切って複数のページを指定できます。

ページにAllを指定すると全ページを1ページ毎に分割します。

ページに2xを指定すると2ページ毎に分割します。3xは3ページ毎に分割します。

分割後のPDFは出力ファイルパスで指定された場所にファイル名 + _ + ページ番号(ゼロ埋め4桁)で出力を行います。

分割後のPDFのバージョンは、元のPDFのバージョンになります。(Version 2.7.0から。以前は常に1.3)

所有者パスワードで内容のコピーが禁止されたPDFでは、エラーになります。(Version 2.7.0から)

例 処理中のPDFを1ページ毎に分割して、分割後フォルダに出力する。

#PDFファイルをオープン
{%PDF_OPEN({%GET(FullPathFileName)})}

#1ページ毎に分割
{%PDF_SPLIT_PAGE(All,{%GET(FolderPath)}\分割済み\{%GET(FileName)})}

#クローズ
{%PDF_CLOSE()}
PDFファイルマージ

FORMAT1 {%PDF_MERGE_FILES(対象ファイルリスト,出力ファイルパス,マージタイプ(先頭|末尾|新規))}

対象ファイルリストで指定されたファイルをマージして出力ファイルパスに出力します。

対象ファイルリストはユーザーデータ名を指定してください。ユーザーデータにはマージしたいフルパスファイル名を追加します。

対象ファイルリストに出力ファイルが含まれる場合はエラーになります。

マージタイプが先頭、または末尾の場合に、出力ファイルが存在しない場合は新規作成されます。

マージタイプが新規の場合に、出力ファイルが存在する場合はエラーになります。

マージタイプが新規の場合、作成したPDFのバージョンは束ねたPDFのバージョンになります。(Version 2.7.0から。以前は常に1.3)

所有者パスワードで内容のコピーが禁止されたPDFを束ねると、エラーになります。(Version 2.7.0から)

例1 処理中ファイルをmarge.pdfの先頭に束ねる。

{%ADD_USER_DATA(ファイルリスト,{%GET(FullPathFileName)})}

{%PDF_MERGE_FILES(ファイルリスト,{%GET(FolderPath)}\マージ済み\marge.pdf,先頭)}

例2 sample1.pdf、sample2.pdfをmarge.pdfの末尾に束ねる。

{%ADD_USER_DATA(ファイルリスト,D:¥Temp\sample1.pdf)}
{%ADD_USER_DATA(ファイルリスト,D:¥Temp\sample2.pdf)}

{%PDF_MERGE_FILES(ファイルリスト,{%GET(FolderPath)}\マージ済み\marge.pdf,末尾)}

以下のような順のmarge.pdfとなります。
marge.pdf
sample1.pdf
sample2.pdf

例3 sample1.pdf、sample2.pdfを束ねてmarge.pdfを新規作成する。

{%ADD_USER_DATA(ファイルリスト,D:¥Temp\sample1.pdf)}
{%ADD_USER_DATA(ファイルリスト,D:¥Temp\sample2.pdf)}

{%PDF_MERGE_FILES(ファイルリスト,{%GET(FolderPath)}\マージ済み\marge.pdf,新規)}

以下のようなmarge.pdfが新規作成されます。
sample1.pdf
sample2.pdf
PDFテキスト抽出支援ユーティリティ作成

FORMAT1 {%PDF_CREATE_TOOL(PDFファイル名,対象ページ,[出力ファイル名],[方式])}

PDFファイル名に指定されたPDFを読み込み、テキスト抽出支援ユーティリティのHTMLファイルをPDFと同じフォルダに出力します。

対象ページにはページ番号を指定します。Allを指定するとすべてのページが対象になります。

出力ファイル名を指定した場合は、指定した場所に出力します。

方式には、テキストのまとまり(単語)の作り方を、PDF_EXTRACT_TEXT と同じく 1(今までと同じ)か 2(改善版)で指定します。省略したときは 1 です。方式 2 で作成したツールが出力するマクロは、PDF_EXTRACT_TEXT の最後に 2 が付きます。出力ファイル名を省いて方式だけを指定するときは、出力ファイル名を空にします。(Version 2.7.0から)

DocuWorks文書(XDW)から作成する場合は、DW_CREATE_TOOL を使います。(Version 2.7.0から)

所有者パスワードで内容のコピーが禁止されたPDFでは、エラーになります。(Version 2.7.0から)

例 処理中PDFから1ページ目のテキスト抽出を行いSample.htmlを出力する。

{%PDF_CREATE_TOOL({%GET(FullPathFileName)},1)}
PDF OCRテキスト抽出支援ツール作成

FORMAT1 {%PDF_CREATE_OCR_TOOL(PDFファイル名,対象ページ,[出力ファイル名],[OCRオプション用ユーザーデータ名])}

PDFファイル名に指定したPDFファイルのページを OCR で読み取り、テキスト抽出支援ツールのHTMLファイルを、ページごとにPDFファイルと同じフォルダに出力します。(Version 2.7.0から)

テキスト抽出支援ツールには、ページのイメージの上に、PDF OCRテキスト抽出(PDF_OCR_TEXT)と同じテキストのまとまりが赤枠で表示されます。ツールで領域を選ぶと、OCRの設定(解像度・表認識)と PDF_OCR_TEXT のマクロが生成されます。スキャンしたイメージのPDFからも作成できます。使い方はテキスト抽出支援ツールをご覧ください。

対象ページ・出力ファイル名の指定方法は、PDFテキスト抽出支援ユーティリティ作成(PDF_CREATE_TOOL)と同じです。

OCRオプション用ユーザーデータ名を指定すると、解像度(Dpi)・表認識(Tables)・読み取りの上限(Timeout)を変えられます(PDF_OCR_TEXT のOCRオプション)。生成されるマクロのOCRの設定も、同じ解像度・表認識になります。このマクロを使うには、64 ビットの Windows が必要です(深層学習 OCR を使うため)。

戻り値は空文字です。ログには「PDFテキスト抽出支援ツールを作成しました。 PDFファイル名: PDFファイル名 ページ: 対象ページ htmlファイル名: 出力したファイル名」と出力されます。

例 処理中のPDFの1ページ目を OCR で読み取り、テキスト抽出支援ツール(PDFと同じフォルダの「PDFの名前_P0001.html」)を作成する。

{%PDF_CREATE_OCR_TOOL({%GET(FullPathFileName)},1)}