ABC Text Extraction Toolkit (TET) Version 4.0 PDF 文書か ら テ キ ス ト ・ 画像 ・ メ タ デー タ を抽出す る ための ツールキ ッ ト Copyright © 1997-2010 PDFlib GmbH. All rights reserved. Protected by European and U.S. patents. PDFlib GmbH Franziska-Bilek-Weg 9, 80339 München, Germany www.pdflib.com 電話 +49 • 89 • 452 33 84-0 FAX +49 • 89 • 452 33 84-99 疑問がおあ り の際は、 PDFlib メ ー リ ング リ ス ト と 、 tech.groups.yahoo.com/group/pdflib にある アー カ イ ブ を チ ェ ッ ク し て く だ さ い。 ラ イ セ ン スご希望の際の連絡先 : sales@pdflib.com 商用 PDFlib ラ イ セ ン ス保持者向けサポー ト : support@pdflib.com (お使いのラ イ セ ン ス番号を お書き く だ さ い) この出版物および こ こ に含まれた情報はあ り のま まに供給 さ れる ものであ り 、 通知な く 変更 さ れる こ と が あ り 、 また、 PDFlib GmbH によ る誓約 と し て解釈 さ れるべき ものではあ り ません。 PDFlib GmbH はいかな る誤 り や不正確に対 し て も責任や負担を全 く 負わず、 こ の出版物に関するいかな る類の (明示的 ・ 暗示的 または法定に関わ ら ず) 保証を も行わず、 そ し て、 いかな る そ し てすべての売買可能性の保証 と 、 特定の 目的に対する適合性 と 、 サー ド パーテ ィ の権利の侵害 と を明白に否認 し ます。 PDFlib と PDFlib ロ ゴは PDFlib GmbH の登録商標です。 PDFlib ラ イ セ ン ス保持者は PDFlib の名称 と ロ ゴ を彼 らの製品の文書内で用いる権利を与え られます。 ただ し 、 こ れは必須ではあ り ません。 Adobe ・ Acrobat ・ PostScript ・ XMP は Adobe Systems Inc. の商標です。 AIX ・ IBM ・ OS/390 ・ WebSphere ・ iSeries ・ zSeries は International Business Machines Corporation の商標です。 ActiveX ・ Microsoft ・ Windows ・ OpenType ・ Windows は Microsoft Corporation の 商標です。 Apple ・ Macintosh ・ TrueType は Apple Computer, Inc. の 商標です。 Unicode ・ Unicode ロ ゴは Unicode, Inc. の 商標です。 Unix は The Open Group の 商標です。 Java ・ Solaris は Sun Microsystems, Inc. の 商標です。 HKS は the HKS brand association: Hostmann-Steinberg, K+E Printing Inks, Schmincke の登録商標です。 他の企業の製品 と サービ ス名は他の商標やサービ スマー ク で ある場合があ り ます。 TET は以下のサー ド パーテ ィ ソ フ ト ウ ェ アの変更 さ れた部分を含んでいます : Zlib 圧縮ラ イ ブ ラ リ 、 Copyright © 1995-2002 Jean-loup Gailly and Mark Adler TIFFlib 画像ラ イ ブ ラ リ 、 Copyright © 1988-1997 Sam Leffler, Copyright © 1991-1997 Silicon Graphics, Inc. Eric Young の書いた Cryptographic ソ フ ト ウ ェ ア 、 Copyright © 1995-1998 Eric Young (eay@cryptsoft.com) Independent JPEG Group の JPEG ソ フ ト ウ ェ ア、 Copyright © 1991-1998, Thomas G. Lane Cryptographic ソ フ ト ウ ェ ア、 Copyright © 1998-2002 The OpenSSL Project (www.openssl.org)) Expat XML パーサ、 Copyright © 1998, 1999, 2000 Thai Open Source Software Center Ltd ICU International Components for Unicode、 Copyright © 1995-2009 International Business Machines Corporation and others TET は RSA Security, Inc. の MD5 メ ッ セージダ イ ジ ェ ス ト アルゴ リ ズムを含んでいます。 目次 0 TET の第一歩 0.1 7 ソ フ ト ウ ェ ア を イ ン ス ト ール 7 0.2 TET ラ イ セ ン スキーを適用 9 1 は じ めに 13 1.1 TET 機能概要 13 1.2 TET の さ ま ざ ま な使用法 15 1.3 文書 と サン プルへのロー ド マ ッ プ 16 1.4 TET 4.0 の新 し い点 17 2 TET コ マ ン ド ラ イ ン ツール 2.1 19 コ マ ン ド ラ イ ンオプ シ ョ ン 19 2.2 TET コ マ ン ド ラ イ ン を構築 22 2.3 コ マ ン ド ラ イ ンの例 24 2.3.1 テ キ ス ト を抽出 24 2.3.2 画像を抽出 24 2.3.3 TETML を生成 25 2.3.4 高度なオプシ ョ ン 25 3 TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング 27 3.1 例外処理 27 3.2 C バイ ンデ ィ ング 29 3.3 C++ バイ ンデ ィ ング 31 3.4 COM バイ ンデ ィ ン グ 33 3.5 Java バイ ンデ ィ ング 34 3.6 .NET バイ ンデ ィ ン グ 36 3.7 Perl バイ ンデ ィ ング 37 3.8 PHP バイ ンデ ィ ング 38 3.9 Python バイ ンデ ィ ング 40 3.10 REALbasic バイ ンデ ィ ング 41 3.11 RPG バイ ンデ ィ ン グ 42 目次 3 4 TET コ ネ ク タ 45 Adobe Acrobat 用無償 TET Plugin 45 4.1 4.2 Lucene 検索エ ン ジ ン用 TET コ ネ ク タ 47 4.3 Solr 検索サーバ用 TET コ ネ ク タ 50 4.4 Oracle 用 TET コ ネ ク タ 51 4.5 Microsoft 製品用 TET PDF IFilter 54 4.6 MediaWiki 用 TET コ ネ ク タ 57 5 設定 59 5.1 暗号化 PDF か ら内容を抽出 59 5.2 リ ソ ース設定 と フ ァ イル検索 61 5.3 代表的シナ リ オのための推奨方策 65 6 テキス ト 抽出 69 PDF の さ ま ざ ま な文書領域 69 6.1 6.2 ページ と テキス ト の視覚情報 73 6.3 日本語 ・ 中国語 ・ 韓国語テキス ト 79 6.3.1 日中韓エン コ ーデ ィ ン グ ・ CMap 79 6.3.2 縦書 き 79 6.3.3 日中韓分解 : narrow ・ wide ・ vertical 等 80 6.4 双方向ア ラ ビ ア文字 ・ ヘブ ラ イ文字テキス ト 81 6.4.1 双方向の一般的性質 81 6.4.2 ア ラ ビ ア文字テ キ ス ト を後処理 81 6.5 内容分析 83 6.6 レ イ アウ ト 分析 87 7 高度な Unicode 処理 91 7.1 Unicode の さ ま ざ ま な重要概念 91 7.2 Unicode 前処理 ( フ ィ ル タ リ ング) 94 7.2.1 すべての粒度のための フ ィ ル タ 94 7.2.2 粒度 word ない し それ以上のための フ ィ ル タ 94 7.3 Unicode 後処理 96 7.3.1 Unicode 字形統合 96 7.3.2 Unicode 分解 99 7.3.3 Unicode 正規化 103 7.4 追加キ ャ ラ ク タ と サロゲー ト 105 4 目次 7.5 グ リ フ に対する Unicode マ ッ ピ ング 106 8 画像抽出 113 8.1 画像抽出の基本 113 8.2 画像の連結 と フ ィ ル タ リ ング 115 8.3 配置画像 と 画像 リ ソ ース 117 8.4 ページベース と リ ソ ースベースの画像ループ 118 8.5 配置画像の視覚情報 119 8.6 制約 と 注意 121 9 TET マー ク ア ッ プ言語 (TETML) 123 9.1 TETML を生成 123 9.2 TETML の詳細を制御 127 9.3 TETML の さ ま ざ ま な要素 と TETML スキーマ 131 9.4 TETML を XSLT で変換 134 9.5 さ ま ざ ま な XSLT サン プル 137 10 pCOS イ ン タ フ ェ ース 141 11 TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 11.1 143 オプ シ ョ ン リ ス ト 143 11.2 オプ シ ョ ン リ ス ト 文法 143 11.3 基本型 146 11.4 図形型 149 11.5 一般関数 150 11.5.1 オプシ ョ ン処理 150 11.5.2 セ ッ ト ア ッ プ 152 11.5.3 PDFlib 仮想フ ァ イ ルシ ス テ ム (PVF) 152 11.5.4 Unicode 変換関数 154 11.5.5 例外処理 157 11.5.6 ロ グ記録 158 11.6 文書関数 160 11.7 ページ関数 167 11.8 テキス ト ・ メ ト リ ク ス抽出関数 175 11.9 画像抽出関数 179 目次 5 11.10 TET マー ク ア ッ プ言語 (TETML) 関数 183 11.11 pCOS 関数 186 A TET ラ イ ブ ラ リ ク イ ッ ク リ フ ァ レ ン ス B 更新履歴 索引 6 目次 193 191 189 0 TET の第一歩 0.1 ソ フ ト ウ ェ ア を イ ン ス ト ール TET は、 Windows シ ス テ ム群に対 し ては MSI イ ン ス ト ー ラ の形で頒布 さ れ、 それ以外のす べての対応オペレーテ ィ ン グ シ ス テ ムに対 し ては圧縮アーカ イ ブの形で頒布 さ れます。す べての TET パ ッ ケージの中には TET コ マ ン ド ラ イ ン ツール と TET ラ イ ブ ラ リ / コ ン ポー ネ ン ト 、 お よ びサポー ト フ ァ イ ル群 ・ 説明書 ・ 使用例群が含まれます。 TET を イ ン ス ト ー ルま たは解凍 し た後は、 以下の手順を推奨 し ます。 > TET コ マ ン ド ラ イ ン ツールのユーザーはその実行形式を ただちに利用可能です。 指定 可能なオプシ ョ ンは 19 ページの 2.1 「 コ マ ン ド ラ イ ン オプシ ョ ン」 で解説 し ますが、 TET コ マ ン ド ラ イ ン ツールを オプシ ョ ン な し で実行 し た と き に も 表示 さ れます。 > TET ラ イ ブ ラ リ / コ ン ポーネ ン ト のユーザーは27ページの3章「TET ラ イ ブ ラ リ の言語バ イ ンデ ィ ン グ」 の中の、 使いたい開発環境に対応す る 節を読み、 イ ン ス ト ール さ れた 使用例を眺め る と よ いで し ょ う 。 Windows の場合、 TET プ ロ グ ラ ミ ン グ例は ス タ ー ト メ ニ ュ ーか ら 開 く こ と がで き ます。 商用 TET ラ イ セ ン ス を得た場合には、 自分の TET ラ イ セ ン ス キーを 9 ページの 0.2 「TET ラ イ セ ン ス キーを適用」 に従っ て入力す る 必要があ り ます。 日中韓設定 日本語 ・ 中国語 ・ 韓国語 (日中韓) テ キ ス ト を抽出す る ためには TET は、 一般に、 それに対応す る 日中韓エン コ ーデ ィ ン グ を Unicode にマ ッ プする CMap フ ァ イ ル を必要 と し ます。 こ の CMap フ ァ イ ル群はすべての TET パ ッ ケージに含まれてお り 、 TET の イ ン ス ト ールデ ィ レ ク ト リ 内の resource/cmap デ ィ レ ク ト リ に イ ン ス ト ール さ れます。 Windows シ ス テ ム群では、TET イ ン ス ト ール時に フル イ ン ス ト ールのオプシ ョ ン を選ぶだ けで OK です。 こ の CMap フ ァ イ ル群はレ ジ ス ト リ を介 し て自動的に検索 さ れます。 それ以外のシ ス テ ムでは、 こ の CMap フ ァ イ ル群を以下の よ う に手動で設定す る 必要 があ り ます。 > TET コ マ ン ド ラ イ ン ツールに対 し ては、こ の CMap フ ァ イ ル群があ る デ ィ レ ク ト リ の名 前を --searchpath オプシ ョ ンで与え ます。 > TET ラ イ ブ ラ リ / コ ン ポーネ ン ト に対 し ては、実行時に次の よ う に searchpath を設定 し ます。 set_option("searchpath=/CMap/ リソース / への / パス "); ま た別の方法 と し て、 こ の日中韓 CMap フ ァ イ ル群へのア ク セ ス を設定す る には、 適切な searchpath 定義を書いた UPR 設定フ ァ イ ルの場所を TETRESOURCEFILE 環境変数に設定す る と い う 方法 も あ り ます。 IBM i5/iSeries でのグ リ フ リ ス ト 設定 IBM eServer i5/iSeries 上 で は、 デ ィ レ ク ト リ resource/glyphlst 内のグ リ フ リ ス ト が TET か ら 利用可能であ る 必要があ り ます。 こ れ ら の テーブルは、TET が標準デ ィ レ ク ト リ 内に イ ン ス ト ール さ れた場合は自動的に利用可能に 設定 さ れます。 評価版の制約事項 TET の コ マ ン ド ラ イ ン ツール と ラ イ ブ ラ リ は商用 ラ イ セ ン ス がな く て も 完全機能の評価版 と し て使 う こ と がで き ます。非 ラ イ セ ン ス版はいずれ も すべての機 能に対応 し てい ますが、 最大 10 ページ ・ 1 MB 容量ま での PDF 文書だけ を処理で き る よ 0.1 ソ フ ト ウ ェ ア を イ ン ス ト ール 7 う にな っ てい ます。TET の評価版はいずれ も 製品評価の目的にのみ使用が許 さ れてい ます ので、 実用目的には使用 し ないで下 さ い。 TET を実用目的に使用す る には有効な TET ラ イ セ ン ス が必要です。 8 0 章 : TET の第一歩 0.2 TET ラ イ セ ン スキー を適用 TET を実用目的に使用す る には有効な TET ラ イ セ ン ス キーが必要です。 TET ラ イ セ ン ス を購入 さ れた ら 、 その ラ イ セ ン ス キーを適用す る こ と に よ っ て、 任意の大 き さ の文書を処 理で き る よ う にす る 必要があ り ます。 ラ イ セ ン ス キーの適用方法は数通 り あ り ますので、 以下に述べ る 方式のいずれか を選択 し て下 さ い。 注記 TET ラ イ セ ン スキーはプ ラ ッ ト フ ォ ーム依存なので、それぞれ購入対象 と な っ たプ ラ ッ ト フ ォ ーム上でのみ使用する こ と がで き ます。 Windows イ ン ス ト ー ラ Windows イ ン ス ト ー ラ で作業を し てい る 場合は、 製品を イ ン ス ト ールす る 際に ラ イ セ ン ス キーを入力す る こ と がで き ま す。 イ ン ス ト ー ラ は ラ イ セ ン ス キーを レ ジ ス ト リ に追加 し ます (後述)。 ラ イ セ ン ス フ ァ イルでの作業 PDFlib は ラ イ セ ン ス キー群を ラ イ セ ン ス フ ァ イ ルか ら 読 み取 り ます。 ラ イ セ ン ス フ ァ イ ル と は、 後述の書式に従っ たテ キ ス ト フ ァ イ ルです。 すべ ての TET デ ィ ス ト リ ビ ュ ーシ ョ ンに入っ てい る テ ンプ レー ト licensekeys.txt を使 う こ と も で き ます。 「#」 キ ャ ラ ク タ で始ま る 行は コ メ ン ト であ り 無視 さ れます。 2 行目は ラ イ セ ン ス フ ァ イ ル自体のバージ ョ ン情報を内容 と し て持ち ます : # Licensing information for PDFlib GmbH products PDFlib license file 1.0 TET 4.0 ...あなたのライセンスキー ... ラ イ セ ン ス フ ァ イ ルは、 複数の PDFlib GmbH 製品に対す る ラ イ セ ン ス キーを、 別々の行 に内容 と し て持つ こ と が可能です。 ま た、 複数のプ ラ ッ ト フ ォ ーム に対す る ラ イ セ ン ス キーを内容 と し て持つ こ と も で き ますので、一つの ラ イ セ ン ス キーを複数プ ラ ッ ト フ ォー ムで共用す る こ と が可能です。 ラ イ セ ン ス フ ァ イ ルは以下の方法で設定で き ます : > licensekeys.txt と い う フ ァ イ ルが、 すべてのデフ ォ ル ト デ ィ レ ク ト リ 内で検索 さ れます (10 ページの 「Unix シ ス テ ム上の ラ イ セ ン ス ・ リ ソ ース フ ァ イ ルのデフ ォ ル ト デ ィ レ ク ト リ 」 参照)。 > set_option( )API 関数で licensefile オプシ ョ ン を指定する こ と も で き ます : tet.set_option("licensefile", "/path/to/licensekeys.txt"); > TET コ マ ン ド ラ イ ン ツールの --tetopt オプシ ョ ン を与え、licensefile オプシ ョ ンで ラ イ セ ン ス フ ァ イ ルの名前を与え ます : tet --tetopt "licensefile /path/to/your/licensekeys.txt" ... パス名が空白キ ャ ラ ク タ を含む場合には、 パス を中括弧で囲む必要があ り ます : tet --tetopt "licensefile {/path/to/your/license file.txt}" ... > ラ イ セ ン ス フ ァ イ ルを指 し 示す環境(シ ェ ル)変数を設定す る こ と も で き ます。Windows では、 シ ス テ ム コ ン ト ロ ールパネルを使っ て、 「シ ス テム」 → 「詳細設定」 → 「環境変 数」 を選択 し ます。 Unix では下記の よ う な コ マ ン ド を適用 し ます : export PDFLIBLICENSEFILE="/path/to/licensekeys.txt" IBM eServer iSeries では、 ラ イ セ ン ス フ ァ イ ルは下記の よ う に指定で き ます ( こ の コ マ ン ド は、ス タ ー ト ア ッ ププ ロ グ ラ ム QSTRUP 内で指定する こ と がで き 、すべての PDFlib GmbH 製品に対 し て効力を持ち ます) : ADDENVVAR ENVVAR(PDFLIBLICENSEFILE) VALUE(<... パス ...>) LEVEL(*SYS) 0.2 TET ラ イ セ ン スキーを適用 9 レ ジ ス ト リ 内に ラ イ セ ン スキー Windows では、 ラ イ セ ン ス フ ァ イ ルの名前を下記の レ ジ ス ト リ キーに記入す る こ と も で き ます : HKLM\SOFTWARE\PDFlib\PDFLIBLICENSEFILE あ る いは、 ラ イ セ ン ス キーを直接下記の レ ジ ス ト リ キーに記入する こ と も で き ます : HKLM\SOFTWARE\PDFlib\TET4\license HKLM\SOFTWARE\PDFlib\TET4\4.0\license MSI イ ン ス ト ー ラ は、 イ ン ス ト ール時に与え ら れた ラ イ セ ン ス キーを、 こ れ ら の項目の末 尾に書 き 込みます。 注記 64 ビ ッ ト Windows シ ス テム上で手作業で レ ジ ス ト リ を操作する際には注意が必要です。通 常、64 ビ ッ ト PDFlib バイ ナ リ は Windows レ ジ ス ト リ の 64 ビ ッ ト ビ ュ ー と と も に動作する のに対 し て、64 ビ ッ ト シ ス テム上で走る 32 ビ ッ ト PDFlib バイ ナ リ はレ ジス ト リ の 32 ビ ッ ト ビ ュ ー と と も に動作 し ます。 32 ビ ッ ト 製品に対する レ ジ ス ト リ キーを手作業で追加す る必要がある場合には、必ず、regedit ツールの 32 ビ ッ ト バージ ョ ン を使用 し て く だ さ い。 これは 「ス タ ー ト 」 → 「 フ ァ イル名を指定 し て実行 ...」 ダ イ ア ログから下記のよ う に呼び 出す こ と がで き ます : %systemroot%\syswow64\regedit Unix シ ス テム上の ラ イ セ ン ス ・ リ ソ ース フ ァ イルのデ フ ォ ル ト デ ィ レ ク ト リ U n i x ・ Linux・ Mac OS X シ ス テ ム上では、パ スやデ ィ レ ク ト リ 名を一切指定 し ていない場合で も 、 デフ ォ ル ト で ラ イ セ ン ス ・ リ ソ ース フ ァ イ ルがい く つかのデ ィ レ ク ト リ で検索 さ れ ます。 UPR フ ァ イ ルを検索 し て読み取 る 前に、 下記のデ ィ レ ク ト リ が検索 さ れ ます ( こ の順序 で) : <rootpath>/PDFlib/TET/4.0 <rootpath>/PDFlib/TET <rootpath>/PDFlib こ こ で <rootpath> は、 まず /usr/local で置 き 換え ら れ、 ついで HOME デ ィ レ ク ト リ で置 き 換え ら れます。 こ の機能を利用す る と 、 環境変数や ラ ン タ イ ムオプシ ョ ン を一切指定 し な く て も ラ イ セ ン ス フ ァ イ ルを扱 う こ と がで き ます。 TET コ マ ン ド ラ イ ン ツ ールに対す る オ プ シ ョ ン内で ラ イ セ ン スキー を設定 TET コ マ ン ド ラ イ ン ツールを使用す る 場合には、 ラ イ セ ン ス フ ァ イ ルま たは ラ イ セ ン ス キー自体の名 前を内容 と し て持つオプシ ョ ン を与え る こ と も で き ます : tet --tetopt "license ...あなたのライセンスキー ..." ...さらなるオプション群... TET API 呼び出 し で ラ イ セ ン スキー を設定 TET API を使用す る 場合は、 ス ク リ プ ト や プ ロ グ ラ ムに以下の よ う な API 呼び出 し を加え て、実行時に ラ イ セ ン ス キーを設定 さ せ る こ と も で き ます : > COM/VBScript の場合 : oTET.set_option "license=... あなたのライセンスキー ..." > C の場合 : TET_set_option(tet, "license=... あなたのライセンスキー ..."); 10 0 章 : TET の第一歩 > C++ ・ .NET/C# ・ Java の場合 : tet.set_option("license=... あなたのライセンスキー ..."); > Perl ・ PHP 5 の場合 : tet->set_option("license=... あなたのライセンスキー ..."); > RPG の場合 : d licensekey d licenseval c c s s 20 50 eval callp licenseopt='license=... あなたのライセンスキー ...'+x'00' TET_set_option(TET:licenseopt:0) こ の license オプシ ョ ンは、 TET オブジ ェ ク ト を実体化 さ せた直後に設定す る 必要があ り ます。 こ れは具体的には、TET_new( ) を呼び出 し た直後 (C の場合)、 ま たは TET オブジ ェ ク ト を生成 さ せた直後 (C++ ・ COM ・ .NET ・ Java ・ PHP の場合) と い う こ と にな り ます。 i5/iSeries ・ zSeries 上での複数シ ス テム ラ イ セ ン ス フ ァ イル i5/iSeries ・ zSeries に対す る ラ イ セ ン ス キーはシ ス テ ム固有ですので、 複数のシ ス テ ム で共用す る こ と はで き ま せ ん。 リ ソ ース共有を実現 し て、 複数のシ ス テ ム で共用で き る 一つの ラ イ セ ン ス フ ァ イ ルを 扱 う ためには、 下記の ラ イ セ ン ス キー書式を用いて、 複数のシ ス テ ム固有キーを一つの フ ァ イ ル内に保持す る こ と がで き ます : PDFlib license file 2.0 # Licensing information for PDFlib GmbH products TET 4.0 ...あなたのライセンスキー ... TET 4.0 ...あなたのライセンスキー ... ...マシン1に対するシリアル番号... ...マシン2に対するシリアル番号... 1 行目のバージ ョ ン番号が変わ っ てい る こ と と 、 複数の ラ イ セ ン ス キーが存在 し てい る こ と に留意 し て く だ さ い。 ラ イ セ ン ス キーの後にはそれぞれ、16 進 8 桁のシ リ アル番号 (i5/ iSeries の場合) か、 16 進 4 桁の CPU ID (zSeries の場合) が続 き ます。 さ ま ざ ま な ラ イ セ ン シ ン グオ プ シ ョ ン 一つない し 複数のサーバ上で PDFlib を使用 し た り 、 TET を あ なた自身の製品 と と も に再頒布 し た り す る ための、 さ ま ざ ま な ラ イ セ ン シ ン グオプシ ョ ンが利用可能です。 ま た当社では、 サポー ト 契約や ソ ース コ ー ド 契約 も 提供 し てい ます。 ラ イ セ ン シ ン グの詳細や購入注文フ ォームは、 TET デ ィ ス ト リ ビ ュ ーシ ョ ン内 にあ り ます。 商用 PDFlib ラ イ セ ン ス の取得にご興味があ る 場合、 ま たはご質問があ る 場 合は、 ご連絡 く だ さ い : PDFlib GmbH, Licensing Department Franziska-Bilek-Weg 9, 80339 München, Germany www.pdflib.com 電話 +49 • 89 • 452 33 84-0 FAX +49 • 89 • 452 33 84-99 ラ イ セ ン ス に関す る お問い合わせ : sales@pdflib.com PDFlib ラ イ セ ン ス保持者向けサポー ト : support@pdflib.com 0.2 TET ラ イ セ ン スキーを適用 11 12 0 章 : TET の第一歩 1 は じ めに PDFlib Text Extraction Toolkit (TET) は、 PDF 文書か ら テ キ ス ト ・ 画像を抽出す る こ と を 目的 と し てい ますが、 それ以外の情報を PDF か ら 取 り 出すために利用す る こ と も で き ま す。 TET は、 以下の よ う な目的を実現す る ための基盤要素 と し て活用で き ます : > PDF のテ キ ス ト 内容を検索 > PDF 内に含まれ る 全用語の一覧 ( コ ン コ ーダ ン ス) を生成 > 大量 PDF フ ァ イ ルを処理可能な検索エン ジ ン を実装 > PDF か ら テ キ ス ト 抽出 し て保管 ・ 翻訳 ・ その他再利用目的に活用 > PDF のテ キ ス ト 内容を他形式へ変換 > PDF を それぞれ内容に し たがっ て処理ま たは変更 > 複数 PDF 文書のテ キ ス ト 内容を比較 > PDF か ら ラ ス タ 画像を再利用のため抽出 > PDF か ら メ タ デー タ 等の情報を抽出 TET は、 ス タ ン ド ア ロ ン使用のために設計 さ れてお り 、 いかな る サー ド パーテ ィ ソ フ ト ウ ェ ア を も 必要 と し ません。堅牢であ り 、マルチ ス レ ッ ド のサーバ用途に も 適 し てい ます。 1.1 TET 機能概要 対応す る PDF 入力 TET は、 さ ま ざ ま な作成元に よ る 数百万種の PDF テ ス ト フ ァ イ ルに 対 し て動作試験済です。 PDF 1.0 か ら PDF 1.7 拡張レベル 3 (ISO 32000 を含む) を受け入 れ可能です。 こ れは Acrobat 1 ∼ 9 に対応 し ます。 ま た、 暗号化 さ れた文書 も 受け入れ可 能です。 Unicode 対応 TET には、 あ ら ゆ る テ キ ス ト に対 し て信頼性の高い Unicode マ ッ ピ ン グ を 実現す る に足 る 充分な数のアルゴ リ ズ ム と デー タ が内蔵 さ れてい ます。PDF 文書内のテ キ ス ト は Unicode で符号化 さ れてい る と は限 り ませんが、 TET は PDF 文書か ら 抽出 し た テ キ ス ト を Unicode に正規化 し ます : > TET はすべてのテ キ ス ト 内容を Unicode に変換 し ます。C の場合、テ キ ス ト は UTF-8 形 式か UTF-16 形式で返 さ れます。 それ以外の言語の場合はネ イ テ ィ ブ Unicode 文字列 と し て返 さ れます。 > 合字な ど の複数文字グ リ フは、その構成素を並べた Unicode キ ャ ラ ク タ 列へ と 分解 さ れ ます。 > ベン ダ依存 Unicode 値 (Corporate Use Subarea、 CUS) については識別情報が与え ら れ る と と も に、 厳密な定義済みの意味を持つキ ャ ラ ク タ へ可能な限 り マ ッ プ さ れます。 > Unicode マ ッ ピ ン グ情報を欠いた グ リ フ についてはその よ う に識別情報が与え ら れ る と と も に、 ユーザー指定可能な置換キ ャ ラ ク タ へマ ッ プ さ れます。 > 基本多言語面 (BMP) 外のキ ャ ラ ク タ に対す る UTF-16 サ ロ ゲー ト ペアは正 し く 解釈 さ れ保持 さ れます。 サ ロ ゲー ト ペア と UTF-32 値はすべての言語バ イ ンデ ィ ン グにおい て抽出可能です。 PDF 文書のなかには、信頼性の高い Unicode マ ッ ピ ン グの実現に必要な情報を充分に持た ない も のがあ り ます。 その よ う な場合で も テ キ ス ト を正 し く 抽出で き る よ う 、 TET には さ ま ざ ま な設定オプシ ョ ンが用意 さ れてお り 、 それを用い る こ と に よ っ て、 正 し い Unicode マ ッ ピ ン グの実現に必要な補助的情報を与え る こ と がで き ます。必要なマ ッ ピ ン グ テーブ ルの作成支援のため、 PDFlib FontReporter と い う Adobe Acrobat 用無料プ ラ グ イ ン を提供 1.1 TET 機能概要 13 いた し てお り ます。 こ のプ ラ グ イ ン を用いれば、 PDF 内の フ ォ ン ト ・ エン コ ーデ ィ ン グ ・ グ リ フ の解析が可能です。 日中韓対応 TET は、 日本語 ・ 中国語 ・ 韓国語テ キ ス ト の抽出に完全対応 し てい ます : > あ ら ゆ る 定義済み日中韓 CMap (エン コ ーデ ィ ン グ) が認識 さ れ、 日中韓テ キ ス ト は Unicode に変換 さ れます。 日中韓エン コ ーデ ィ ン グ変換のための CMap フ ァ イ ル群が、 TET デ ィ ス ト リ ビ ュ ーシ ョ ンに同梱 さ れてい ます。 > 特殊な キ ャ ラ ク タ 字形 (全角 ・ 半角 ・ 縦中横等) を、 対応す る 通常の字形に変換 (字 形統合) す る こ と も で き ます。 > 横書 き と 縦書 き に対応 し てい ます。 > 日中韓フ ォ ン ト 名は Unicode へ正規化 さ れます。 双方向ヘ ブ ラ イ文字 ・ ア ラ ビ ア文字テキス ト 対応 TET は、 双方向テ キ ス ト を扱 う ため の以下の機能を含んでい ます : > 右書 き ・ 双方向テ キ ス ト を論理順に並べ替え > ページの主要テ キ ス ト 方向を決定 > ア ラ ビ ア文字の表示形を正規化 し 、 合字を分解 > 単語の引 き 伸ば し に使われてい る ア ラ ビ ア文字の タ ト ウ ィ ールキ ャ ラ ク タ を除去 Unicode 後処理 TET の Unicode 後処理機能は以下を含みます : > 字形統合 : 一つない し 複数のキ ャ ラ ク タ に対 し て温存 ・ 置換 ・ 除去のいずれか を行い ます。 対象キ ャ ラ ク タ 群を Unicode 集合 と し て指定す る こ と がで き る ので便利です。 > 分解:Unicode 規格で定義 さ れてい る 正準分解ま たは互換分解を適用す る こ と も 可能で す。 環境に よ っ ては こ れに よ っ て テ キ ス ト が よ り 有用にな る 場合があ り ます。 た と え ば、 ア ク セ ン ト 付 き キ ャ ラ ク タ や分数、 商標記号の よ う な記号を温存 し た り 分割 し た り す る こ と がで き ます。 > 正規化 : 出力を、 Unicode 規格で定義 さ れてい る Unicode 正規形 NFC ・ NFD ・ NFKC ・ NFKD のいずれかへ変換 し ます。 こ れに よ っ て TET は、 デー タ ベースや検索エン ジ ン な ど い く つかの環境が入力 と し て求め る 形式 と 正確に一致 し た形式を生成す る こ と が で き ます。 画像抽出 TET は PDF か ら ラ ス タ 画像を抽出 し ます。 断片化 さ れた画像の隣接部分は再 結合 さ れ、 後処理 と 再利用を可能に し ます (い く つかのアプ リ ケーシ ョ ンに よ っ て生成 さ れたマルチ ス ト リ ッ プ画像等) 。 小 さ い画像は、 微小な画像素片で出力が散 ら か る こ と を 防 ぐ ために、 フ ィ ル タ を かけて取 り 除 く こ と も で き ます。 画像は、広 く 用い ら れてい る TIFF・JPEG・JPEG 2000 のいずれかの形式で抽出 さ れます。 位置情報 TET は、 テ キ ス ト のページ上の位置やグ リ フ幅やテ キ ス ト 方向 と い っ た厳密 な メ ト リ ク ス を出力 し ます。テ キ ス ト 抽出処理に際 し てはページ上の特定領域を外 し た り 含めた り す る こ と に よ り 、 た と えばヘ ッ ダ ・ フ ッ タ や余白を無視 さ せた り す る こ と が可能 です。 画像については、 ピ ク セルサ イ ズ ・ 物理サ イ ズ ・ 色空間が得 ら れ る ほか、 位置や角度 も 得 ら れます。 単語検出 と 内容解析 TET には、 低次元のグ リ フ情報を抽出す る 機能だけでな く 、 高次 元の内容解析を行 う 高度な アルゴ リ ズ ム も 内蔵 さ れてい ます : > 単語区切 り を検出 し て文字群でな く 単語を抽出。 > ハ イ フ ン で区切 ら れた単語の各部を再結合 (デハ イ フ ネーシ ョ ン)。 14 1 章 : は じ めに > 影付 き や擬似太字テ キ ス ト 等に よ る テ キ ス ト のダブ り を除去。 > 段落群を読み順に再連結。 > ページ上に配置 さ れたテ キ ス ト 群の順序認識。 > テ キ ス ト の行を再構成。 > ページ上の表構造を認識。 > 上付 き ・ 下付 き ・ ド ロ ッ プキ ャ ッ プ (段落頭の大 き い先頭キ ャ ラ ク タ 群) を認識。 PDF オ ブ ジ ェ ク ト を容易に指 し 示すための pCOS イ ン タ フ ェ ース TET は、 任意の PDF オブジ ェ ク ト を取得す る ための pCOS (PDFlib Comprehensive Object System) イ ン タ フ ェー ス を含んでい ます。 pCOS を使 う と 、 PDF 文書か ら 、 PDF メ タ デー タ や イ ン タ ラ ク テ ィ ブ 要素 ( し お り テ キ ス ト やフ ォーム フ ィ ール ド の内容な ど) 、 その他あ ら ゆ る 情報を、 簡単 な取得 イ ン タ フ ェース で取得す る こ と がで き ます。 TET Markup Language (TETML) PDF 文書か ら 取得 し た情報は、TET Markup Language す なわち TETML と い う XML 形式で表現す る こ と も で き ます。 こ れは標準的な XML ツール 群で処理が可能です。 TETML は、 テ キ ス ト ・ 画像 ・ メ タ デー タ 情報を内容 と し て持つほ か、 オプシ ョ ン と し て フ ォ ン ト ・ 位置関連情報を内容 と し て持つ こ と も で き ます。 テキス ト と は何か TET は さ ま ざ ま な種類の PDF 文書を扱い ますが、 目に見え る テ キ ス ト はすべて う ま く 抽出で き る と は限 り ません。そのテ キ ス ト は PDF のテ キ ス ト ・ エン コ ー デ ィ ン グ機能を用いて符号化 さ れてい る 必要があ り ます (すなわちそれはフ ォ ン ト に基づ いた も のでなければな り ません) 。 以下の種類のテ キ ス ト はページ上で目に見え てはいて も TET で抽出す る こ と はで き ません : > ページの ス キ ャ ナ画像等、 ラ ス タ ラ イ ズ さ れた (ピ ク セル画像の) テ キ ス ト > フ ォ ン ト な し にベ ク ト ル要素で直接表 さ れたテ キ ス ト なお、 メ タ デー タ と ハ イ パーテ キ ス ト 要素 ( し お り ・ フ ォーム フ ィ ール ド ・ ノ ー ト ・ 注釈 等) 内テ キ ス ト は pCOS イ ン タ フ ェース で抽出で き ます。 逆に TET は、 ページ上で目に 見え ていないテ キ ス ト を抽出す る こ と も あ り ます。 こ れは以下の よ う な場合に起 こ る 可能 性があ り ます : > PDF の不可視属性を用いたテ キ ス ト (ただ し 、 こ の種類のテ キ ス ト を テ キ ス ト 抽出処 理の対象外にす る オプシ ョ ンはあ り ます)。 > テ キ ス ト が、 ページ上の画像等何か他の要素に よ っ て隠 さ れた り 切 り 取 ら れた り し て い る 場合。 > PDF の レ イ ヤーは無視 さ れ、各レ イ ヤーの表示 / 非表示にかかわ ら ず、TET はすべての レ イ ヤーか ら テ キ ス ト を抽出 し ます。 1.2 TET の さ ま ざ ま な使用法 TET は、 さ ま ざ ま な開発環境用のプ ロ グ ラ ミ ン グ ラ イ ブ ラ リ (コ ン ポーネ ン ト ) と し て も 提供 さ れます し 、 バ ッ チ操作のための コ マ ン ド ラ イ ン ツール と し て も 提供 さ れます。 両者 の機能は同様ですが、 それぞれ実用に適す る 場面が異な っ てい ます。 TET ラ イ ブ ラ リ と コ マ ン ド ラ イ ン ツールはど ち ら も 、 TET の XML ベース の出力形式であ る TETML を生成す る こ と がで き ます。 ど ち ら の TET を選べば よ いか、 以下にそのガ イ ド ラ イ ン を掲げます。 > TET プ ロ グ ラ ミ ン グ ラ イ ブ ラ リ はデス ク ト ッ プアプ リ ケーシ ョ ンやサーバアプ リ ケー シ ョ ン に組み込んで使 う こ と がで き ます。 さ ま ざ ま なプ ロ グ ラ ミ ン グ言語に対応 し て 1.2 TET の さ ま ざ ま な使用法 15 い ます。 TET パ ッ ケージには、 TET ラ イ ブ ラ リ のすべての対応言語バ イ ンデ ィ ン グに おけ る 使用例が同梱 さ れてい ます。 > TET コ マ ン ド ラ イ ン ツールはPDF文書のバ ッ チ処理に適 し てい ます。プ ロ グ ラ ミ ン グは 一切不要で、 かわ り に さ ま ざ ま な コ マ ン ド ラ イ ン オプシ ョ ン を そな え てお り 、 それを 用いて複雑な ワー ク フ ロ ーでの活用が可能です。 > TETML 出力は、XMLベース の ワー ク フ ロ ー と 、さ ま ざ ま な XML 処理ツールや XSLT等の XML 処理言語に通 じ た開発者に適 し てい ます。 > TET コ ネ ク タ は、 デー タ ベースや検索エン ジ ン等、 広 く 利用 さ れてい る さ ま ざ ま な ソ フ ト ウ ェ アパ ッ ケージに TET を統合 さ せ る ために適 し てい ます。 > TET Plugin は、TET を対話的に利用で き る よ う にする 、Adobe Acrobat 用の無償拡張です (詳 し く は 45 ページの 4.1 「Adobe Acrobat 用無償 TET Plugin」 を参照)。 1.3 文書 と サ ン プルへの ロ ー ド マ ッ プ TET ラ イ ブ ラ リ 用 ミ ニサン プル TET デ ィ ス ト リ ビ ュ ーシ ョ ンは、 すべての対応言語バ イ ンデ ィ ン グのためのプ ロ グ ラ ミ ン グ作成例を含んでい ます。 こ れ ら の ミ ニサン プルは、 自分のアプ リ ケーシ ョ ンのための出発点 と し て利用 し た り 、自分の TET イ ン ス ト レーシ ョ ン を試験 し た り す る ために利用で き ます。以下のアプ リ ケーシ ョ ンのための ソ ース コ ー ド か ら 成っ てい ます : > extractorサンプルは、PDF文書か ら テ キ ス ト を抽出す る ための基本的なループを演示 し てい ます。 > image_resources サンプルは、 PDF 文書か ら 画像を リ ソ ース志向な方式で抽出す る ため の基本的なループ を演示 し てい ます。 > dumper サンプルは、 PDF 文書に関す る 一般情報を取得す る ための内蔵 pCOS イ ン タ フ ェース の使用を示 し てい ます。 > fontfilter サンプルは、 フ ォ ン ト 名や文字サ イ ズ と いっ た フ ォ ン ト 関連情報の処理方法 を示 し てい ます。 > glyphinfo サンプルは、 グ リ フ に関す る 情報 (フ ォ ン ト ・ サ イ ズ ・ 位置等) や、 dropcap ・ shadow ・ hyphenation と いっ たテ キ ス ト 属性の取得方法を演示 し てい ます。 > tetml サンプルは、PDF文書か ら TETML(PDF の内容を表現する ための TET の XML言語) を生成す る ためのプ ロ ト タ イ プ的 コ ー ド を含んでい ます。 > get_attachments サンプル (すべての言語バ イ ンデ ィ ン グで得 ら れ る わけではあ り ませ ん) は、 PDF フ ァ イ ル添付、 すなわち別の PDF 文書内に埋め込まれてい る PDF 文書 の処理方法を演示 し てい ます。 注記 Windows Vista では、 ミ ニサン プルはデ フ ォル ト で 「Program Files」 デ ィ レ ク ト リ に イ ン ス ト ール さ れます。 Windows Vista の新 し い保護方式に よ っ て、 こ れ ら のサン プルに よ っ て 生成 さ れる PDF 出力 フ ァ イルは、 「互換性 フ ァ イル」 下で し か表示 さ れません。 推奨回避 法 : サン プルをユーザーデ ィ レ ク ト リ へ複製 し ます。 XSLT サン プル TET デ ィ ス ト リ ビ ュ ーシ ョ ンは、 い く つかの XSLT ス タ イ ルシー ト を含 んでい ます。 こ れ ら は、 さ ま ざ ま な目的を実現する ための TETML の処理方法を演示 し て い ます : > concordance.xsl : 文書内の単語を頻度の多い順に並べた リ ス ト を生成 し ます。 > fontfilter.xsl : 文書内の、 指定 し た値 よ り も 大 き なサ イ ズで特定の フ ォ ン ト を用いてい る すべての単語を リ ス ト し ます。 16 1 章 : は じ めに > fontfinder.xsl : 文書内のすべての フ ォ ン ト について、 すべての出現箇所をページ番号 と 位置情報 と と も に リ ス ト し ます。 > fontstat.xsl : フ ォ ン ト と グ リ フ の統計を生成 し ます。 > index.xsl : アルフ ァ ベ ッ ト 順の索引を生成 し ます。 > metadata.xsl : TETML 内に含まれてい る 文書レベル XMP メ タ デー タ か ら 、 選択 し た フ ィ ール ド 群を抽出 し ます。 > solr.xsl : Solr エン タ プ ラ イ ズ検索サーバ用の入力を生成 し ます。 > table.xsl : 表を CSV フ ァ イ ル (カ ン マ区切 り 値) へ抽出 し ます。 > tetml2html.xsl : TETML を シ ンプルな HTML へ変換 し ます。 > textonly.xsl : TETML 入力か ら 生テ キ ス ト を抽出 し ます。 TET ク ッ ク ブ ッ ク TET ク ッ ク ブ ッ ク は、 特定の応用問題を TET ラ イ ブ ラ リ で解決す る ための ソ ース コ ー ド 作成例の集合です。 こ の ク ッ ク ブ ッ ク は Java 言語で書かれてい ます が、他の言語で も 容易に利用で き ます。 なぜな ら TET API はすべての対応言語バ イ ンデ ィ ン グでほぼ等価だか ら です。 い く つかの ク ッ ク ブ ッ ク サンプルは XSLT 言語で書かれてい ます。 TET ク ッ ク ブ ッ ク は以下のグループに ま と め ら れてい ます : > Text : テ キ ス ト 抽出関連のサンプル群 > Font : フ ォ ン ト 属性に焦点を あ てたテ キ ス ト 関連のサンプル群 > Image : 画像抽出関連のサンプル群 > TET & PDFlib+PDI:PDF か ら TET で情報を抽出 し て、新たな PDF を元 PDF と 抽出情報に 基づいて構築す る サンプル群。 こ れ ら のサンプルには、 TET に加え て PDFlib+PDI 製品 が必要です。 > TETML : TETML 処理用の XSLT サンプル群 > Special : その他のサンプル群 TET ク ッ ク ブ ッ ク は下記 URL で利用可能です : www.pdflib.com/tet-cookbook pCOS ク ッ ク ブ ッ ク pCOS ク ッ ク ブ ッ ク は、 TET に内蔵 さ れてい る pCOS イ ン タ フ ェー ス のための コ ー ド の集合です。 下記 URL で利用可能です : www.pdflib.com/pcos-cookbook pCOS イ ン タ フ ェ ース の詳細は、 TET パ ッ ケージに含まれてい る pCOS リ フ ァ レ ン ス に示 さ れてい ます。 1.4 TET 4.0 の新 し い点 TET 4.0 の新機能 と 大幅改善機能を以下に示 し ます : > パフ ォーマ ン ス向上 : さ ま ざ ま な種別の文書で よ り 速 く な り ま し た。 > 数十万ページの超大文書で も よ り 速 く 、 よ り メ モ リ 消費が少な く な り ま し た。 > ア ラ ビ ア文字 ・ ヘブ ラ イ 文字等の右書 き ・ 双方向テ キ ス ト を抽出 (81 ページの 6.4 「双 方向ア ラ ビ ア文字 ・ ヘブ ラ イ 文字テ キ ス ト 」 を参照)。 > 正規化・字形統合・分解に よ る Unicode 後処理(96 ページの 7.3「Unicode 後処理」を参照)。 > 影付 き 除去 ・ 単語境界検出 ・ ハ イ フ ン除去の改善。 > 上付 き ・ 下付 き 検出の改善。 > 非準拠 PDF 文書に対す る 回避策の導入に よ る 堅牢性の向上。 > 破損 PDF か ら う ま く テ キ ス ト を抽出す る ための修復モー ド の改善。 1.4 TET 4.0 の新 し い点 17 > XML 出力 (TETML) 内の情報の増加。 131 ページの 9.3 「TETML の さ ま ざ ま な要素 と TETML ス キーマ」 を参照。 ハ イ フ ン除去 ・ ド ロ ッ プキ ャ ッ プ ・ 影付き ・ 上付 き / 下付 き 。 下向 き 座標系 ・ PDF/A-2 ・ PDF/E ・ フ ォ ン ト サブセ ッ ト 。 > C++ ・ Perl 言語バ イ ンデ ィ ン グの改善。 18 1 章 : は じ めに 2 TET コ マ ン ド ラ イ ン ツール 2.1 コ マ ン ド ラ イ ン オ プ シ ョ ン TET コ マ ン ド ラ イ ン ツールを利用すれば、 プ ロ グ ラ ミ ン グ を一切必要 と せずに、 1 つない し 複数の PDF 文書か ら テ キ ス ト ・ 画像を抽出す る こ と がで き ます。 出力は、 プ レーン テ キ ス ト (Unicode) 形式か、 ま たは TET の XML ベース の出力形式であ る TETML 形式で生 成す る こ と がで き ます。 こ の TET プ ロ グ ラ ムはた く さ んの コ マ ン ド ラ イ ン オプシ ョ ンで 制御で き ま す。 こ のプ ロ グ ラ ム は各単語の後に空白キ ャ ラ ク タ (U+0020) を挿入 し 、 ま た各行の後に U+000A を、 各ページの後に U+000C を挿入 し ます。 こ れを呼び出すには次 の よ う に 1 つない し 複数の PDF フ ァ イ ルを指定 し ます。 tet [<オプション群>] <ファイル名>... こ の TET コ マ ン ド ラ イ ン ツールは TET ラ イ ブ ラ リ の最上位の上に構築 さ れてい ま す。 --docopt ・ --tetopt ・ --imageopt ・ --pageopt オプ シ ョ ン を用いれば、 143 ページの 11 章 「TET ラ イ ブ ラ リ API リ フ ァ レ ン ス」 のオプシ ョ ン一覧表に従っ た さ ま ざ ま なオプシ ョ ン を ラ イ ブ ラ リ に与え る こ と が可能です。表 2.1 にすべての TET コ マ ン ド ラ イ ン オプシ ョ ン を挙げます ( こ の一覧は、 こ の TET プ ロ グ ラ ム を オプシ ョ ン な し で走 ら せた と き に も 表 示 さ れます)。 注記 日中韓テキス ト を抽出するには、 7 ページの 0.1 「ソ フ ト ウ ェ ア を イ ン ス ト ール」 に従っ て TET 同梱の CMap フ ァ イル群の置き場所を設定する必要があ り ます。 表 2.1 TET コ マ ン ド ラ イ ンオプ シ ョ ン一覧 オプ シ ョ ン 引数 機能 -- オプ シ ョ ンの リ ス ト を終了 さ せます。 こ れは、 フ ァ イル名が - キ ャ ラ ク タ で 始ま っ ている と き に有用です。 @filename1 オプ シ ョ ン群を持つレ スポン ス フ ァ イルを指定 し ます。 文法の説明は 22 ページの 「レ スポン ス フ ァ イル」 を参照 し て く だ さ い。 レ スポン ス フ ァ イル は、 -- オプ シ ョ ンの前、 かつ最初の フ ァ イル名の前でのみ認識 さ れます。 レ スポン ス フ ァ イルを用いて他のオプ シ ョ ンの引数を置き換え る こ と はで き ず、 オプ シ ョ ンに引数を補完する ためにのみ用いる こ と がで き ます。 --docopt < オプ シ ョ ン リ スト > open_document( ) に対する追加のオプ シ ョ ン リ ス ト (161 ページの表 11.6 参 照)。 tetml オプ シ ョ ンの filename サブオプ シ ョ ンは こ こ では使え ません。 --firstpage -f <integer> ¦ last テキス ト 抽出を開始するページの番号。 キーワー ド last で末尾ページ を指 定、 last-1 で末尾ページの前のページ、 等々。 デ フ ォ ル ト : 1 --format utf8 | utf16 テキス ト 出力の形式を指定 (デ フ ォル ト : utf8) : utf8 BOM (バイ ト オーダマー ク) 付き UTF-8 utf16 ネ イ テ ィ ブバイ ト 順序の BOM 付き UTF-16 このオプ シ ョ ンは、 つねに UTF-8 で生成 さ れる TETML 出力には効力を持ち ません。 --help, -? (またはオプ シ ョ ンな し) 利用可能なオプ シ ョ ン を ま と めたヘルプ を表示 2.1 コ マ ン ド ラ イ ン オプ シ ョ ン 19 表 2.1 TET コ マ ン ド ラ イ ン オプ シ ョ ン一覧 オプ シ ョ ン --image -i 引数 機能 文書から 画像を抽出 し ます。 抽出 さ れた画像の命名規則は --imageloop オプ シ ョ ンに依存 し ます。 2 --imageloop page ¦ resource --image オプ シ ョ ン によ る画像抽出の数え上げループの種類を指定 し ます (デ フ ォ ル ト : --tetml を指定 し ている な ら resource、 そ う でないな ら page) : page 選択 さ れたページ群にあ るすべての画像を数え上げます。 複数回 配置 さ れている画像は複数回抽出 さ れます。 抽出 さ れた画像は下 記のパ タ ーン で命名 さ れます : < フ ァ イル名 >_p< ページ番号 >_< 画像番号 >.[tif|jpg|jpx] resource 文書内のすべての (結合 し た) 画像 リ ソ ース を数え上げます。 各 画像 リ ソ ースは、 文書内に現れる回数にかかわら ず、 一度だけ抽 出 さ れます。 画像抽出にあた っ ては --firstpage ・ --lastpage オプ シ ョ ンは無視 さ れます。 抽出 さ れた画像は下記のパ タ ーン で命名 さ れます : < フ ァ イル名 >_I< 画像 ID>.[tif|jpg|jpx] 注記 : I< 画像 ID> は TETML 属性 Image/@id で も用い られます。 --imageopt < オプ シ ョ ン リ スト > write_image_file( ) に対する追加のオプ シ ョ ン リ ス ト (181 ページの表 11.15 を参照) --lastpage -l <integer> ¦ last テキス ト 抽出を終了するページの番号。 キーワー ド last で末尾ページ を指 定、 last-1 で末尾ページの前のページ、 等々。 デ フ ォ ル ト : last --outfile -o < フ ァ イル名 > (複数の入力 フ ァ イル名を与えている と きは不可) テキス ト 出力または TETML 出力のフ ァ イル名。 入力フ ァ イルを一個だけ与えている と きのみ、 フ ァ イル名 「-」 を用いて標準出力を指定可能。 デ フ ォル ト : 入力フ ァ イル名の .pdf ・ .PDF を .txt (テキス ト 出力時) か .tetml (TETML 出力時) に置き換え た名前。 --pageopt < オプ シ ョ ン リ スト > テキス ト 出力生成な ら open_page( ) に、 TETML 出力生成な ら process_page( ) に与え ら れる追加のオプ シ ョ ン リ ス ト 。 使え る オプ シ ョ ンについては 168 ページの表 11.8 と 183 ページの表 11.16 を参照。 テキス ト 出力の場合、 オプ シ ョ ン granularity はつねに page に設定 さ れます。 --password, -p < パスワー ド > 暗号化文書に対するユーザパスワー ド かマス タ ーパスワー ド 。 場合に よ っ て は、 シ ュ ラ ッ グ機能を利用する と 、 パス を与えずに暗号化文書を イ ンデ ッ ク スする こ と がで き ます (59 ページの 5.1 「暗号化 PDF から内容を抽出」 を参 照)。 --searchpath1 < パス >... -s フ ァ イル (CMap 等) を検索する 1 つない し 複数のデ ィ レ ク ト リ の名前。 デ フ ォ ル ト : イ ン ス ト ール環境に依存 --targetdir -t < ディ レク ト リ 名> 生成 さ れる テキス ト ・ TETML ・ 画像フ ァ イルの出力デ ィ レ ク ト リ 。 存在 し て いるデ ィ レ ク ト リ であ る必要があ り ます。 デ フ ォ ル ト : . (すなわち カ レ ン ト 作業デ ィ レ ク ト リ ) --tetml -m glyph ¦ word ¦ wordplus ¦ line ¦ page (--text と の組み合わせ不可) テキス ト ・ 画像情報を含む TET 3 スキーマに 従 っ た TETML 出力を生成 し ます。 TETML はつねに UTF-8 で生成 さ れます。 与え る引数で、 い く つかの種類の一つを選びます (127 ページの 9.2 「TETML の詳細を制御」 を参照) : glyph グ リ フ位置情報 と フ ォ ン ト 情報を持 っ たグ リ フ ベースの TETML word 単語枠を持 っ た単語ベースの TETML wordplus 単語枠 と すべてのグ リ フ 情報を持っ た単語ベースの TETML ine 行ベースの TETML (テキス ト のみ) page ページベースの TETML (テキス ト のみ) 20 2 章 : TET コ マ ン ド ラ イ ン ツール 表 2.1 TET コ マ ン ド ラ イ ンオプ シ ョ ン一覧 オプ シ ョ ン 引数 機能 --tetopt < オプ シ ョ ン リ スト > set_option( ) に対する追加のオプ シ ョ ン リ ス ト (150 ページの表 11.2 を参 照)。 オプ シ ョ ン outputformat は無視 さ れます (かわ り に --format を用いて く だ さ い)。 (--tetml と の組み合わせ不可) 文書か ら テキス ト を抽出 し ます (デ フ ォ ル ト で有効) --text2 --verbose -v --version, -V 0¦1¦2¦3 冗長レ ベル (デ フ ォル ト : 1) : 0 一切出力な し 1 エ ラ ーのみ出力 2 エ ラ ー と フ ァ イル名を出力 3 詳細レ ポー ト TET バージ ョ ン番号を印字 し ます。 1. こ のオプ シ ョ ンは複数回与え る こ と も で き ます。 2. オ プ シ ョ ン --image はテキス ト 抽出を無効に し ますが、 それは --text ・ --tetml と 組み合わせる こ と も で き ます。 2.1 コ マ ン ド ラ イ ン オプ シ ョ ン 21 2.2 TET コ マ ン ド ラ イ ン を構築 TET コ マ ン ド ラ イ ンの作成にあ た っ ては、 以下の規則を守 る 必要があ り ます。 > 入力フ ァ イ ルは、 searchpath で指定 し たすべてのデ ィ レ ク ト リ 内で検索 さ れます。 > オプシ ョ ン に よ っ ては短オプシ ョ ン形が利用可能で、 長オプシ ョ ン形 と の混在 も 可能 です。 > 長オプシ ョ ンは先頭の数文字だけで表す こ と も 可能です。 ただ し その省略形が一意で あ る 場合に限 り ます。 > 入力フ ァ イ ルの暗号化状態に よ っ ては、 テ キ ス ト を正 し く 抽出す る ためにユーザーパ ス ワー ド かマ ス タ ーパ ス ワー ド が必要 と な る 場合があ り ます。 こ れは --password オプ シ ョ ン で与え る 必要があ り ます。 TET は こ のパ ス ワー ド でテ キ ス ト 抽出が許 さ れ る か ど う か を調べ、 だめな ら エ ラ ーを生成 し ます。 TET は コ マ ン ド ラ イ ン全体を まず調べてか ら フ ァ イ ルの処理を開始 し ます。コ マ ン ド ラ イ ン上ど こ のオプシ ョ ン内であれエ ラ ーが出たな ら ば、フ ァ イ ルはどれ も 一切処理 さ れない ま ま と な り ます。 フ ァ イル名 空白キ ャ ラ ク タ を含むフ ァ イ ル名は、 TET の よ う な コ マ ン ド ラ イ ン ツール で用い る 際には若干特殊な取 り 扱いを要 し ます。空白キ ャ ラ ク タ を含んだ フ ァ イ ル名を処 理 さ せ る には、 フ ァ イ ル名全体を ダブル ク ォー ト 文字 " で く く ら なければな り ません。 ワ イ ル ド カー ド が標準的用法に従っ て使え ます。 た と えば *.pdf は、 所与のデ ィ レ ク ト リ 内 で フ ァ イ ル名接尾辞 .pdf を持つすべての フ ァ イ ルを表 し ます。 シ ス テ ムに よ っ て、 大文字 小文字を区別す る も の と し ない も のがあ る こ と に注意 し ま し ょ う (*.pdf が *.PDF と 違っ た り 等)。 ま た Windows シ ス テ ム群では ワ イ ル ド カー ド は、 空白キ ャ ラ ク タ を含むフ ァ イ ル 名には効かないので注意 し て下 さ い。 Windows では、 すべての フ ァ イ ル名オプシ ョ ンが Unicode 文字列を受け入れます。 た と えば こ れは、エ ク ス プ ロ ー ラ か ら フ ァ イ ルを コ マ ン ド プ ロ ンプ ト ウ ィ ン ド ウへ ド ラ ッ グ し た際に発生 し ます。 レ スポ ン ス フ ァ イル オ プ シ ョ ン 群 を コ マ ン ド ラ イ ン で直接与 え る 方法以外に、 オ プ シ ョ ン群を レ ス ポ ン ス フ ァ イ ル内で与え る 方法 も あ り ま す。 レ ス ポ ン ス フ ァ イ ルの内容 は、 コ マ ン ド ラ イ ン内で @filename オプシ ョ ンが見つか っ た位置に挿入 さ れます。 レ ス ポ ン ス フ ァ イ ルは、 オプシ ョ ン群 と 引数群を持っ た単純なテ キ ス ト フ ァ イ ルです。 こ れは以下の文法規則に従 う 必要があ り ます : > オプシ ョ ン値群は空白文字、 すなわち スペース ・ ラ イ ン フ ィ ー ド ・ リ タ ーン ・ タ ブの いずれかで区切 る 必要があ り ます。 > 空白文字を含む値は、 ダブル ク ォーテーシ ョ ン マー ク " で囲む必要があ り ます。 > 値の先頭 と 末尾のダブル ク ォーテーシ ョ ン マー ク は無視 さ れます。 > ダブル ク ォ ーテーシ ョ ン マー ク を リ テ ラ ルに用い る ためには、 バ ッ ク ス ラ ッ シ ュ でマ ス ク し て \" と す る 必要があ り ます。 > バ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ は、 も う 一個のバ ッ ク ス ラ ッ シ ュ でマ ス ク し て \\ と す る 必要があ り ます。 レ ス ポ ン ス フ ァ イ ルは入れ子にす る こ と も で き ます。 すなわち、 @filename 文法はそれ自 体を レ ス ポ ン ス フ ァ イ ルで用い る こ と も で き ます。 レ ス ポ ン ス フ ァ イ ルは、 フ ァ イ ル名引数に対 し て Unicode 文字列を持つ こ と も で き ま す。 レ ス ポ ン ス フ ァ イ ルは、 UTF-8 ・ EBCDIC-UTF-8 ・ UTF-16 のいずれかの形式で符号 化す る こ と がで き 、 対応す る BOM で始ま る 必要があ り ます。 BOM が見つか ら ない と き 22 2 章 : TET コ マ ン ド ラ イ ン ツール は、 レ ス ポ ン ス フ ァ イ ルの内容は、 zSeries では EBCDIC で、 それ以外のすべてのシ ス テ ムでは ISO 8859-1 (Latin-1) で解釈 さ れます。 終了 コ ー ド TET コ マ ン ド ラ イ ン ツールは以下に示す終了 コ ー ド を返すので、 こ れを利 用すれば、 要求 し た操作が正 し く 遂行で き たか ど う かを調べ る こ と がで き ます : > 終了 コ ー ド 0 : すべての コ マ ン ド ラ イ ンオプシ ョ ンの処理が成功 し 完結 し た。 > 終了 コ ー ド 1 : フ ァ イ ル処理エ ラ ーが 1 件ない し 複数発生、 し か し 処理は継続 さ れた。 > 終了 コ ー ド 2 : コ マ ン ド ラ イ ンオプシ ョ ンの中に何 ら かのエ ラ ーが発見 さ れた。処理は その不良オプシ ョ ンの位置で停止 し たため、 入力フ ァ イ ルは一切処理 さ れなか っ た。 2.2 TET コ マ ン ド ラ イ ン を構築 23 2.3 コ マ ン ド ラ イ ンの例 以下の例は、TET コ マ ン ド ラ イ ンオプシ ョ ンのい く つかの有用な組み合わせを演示 し てい ます。 作成例は 2 種類示 さ れてい ます。 1 種類目はすべてのオプシ ョ ンの長形式を用いて お り 、 一方 2 種類目はそれ と 同等な短オプシ ョ ン形式を用いてい ます。 2.3.1 テキス ト を抽出 PDF 文書 file.pdf か ら テ キ ス ト を UTF-8 形式で抽出 し 、 それを file.txt に格納 し ます : tet file.pdf テ キ ス ト 抽出か ら 先頭ページ と 末尾ページ を除外 し ます : tet --firstpage 2 --lastpage last-1 file.pdf tet -f 2 -l last-1 file.pdf 日中韓 CMap が置かれてい る デ ィ レ ク ト リ を与え ます (日中韓テ キ ス ト 抽出では必須で す) : tet --searchpath /usr/local/cmaps file.pdf tet -s /usr/local/cmaps file.pdf PDF か ら テ キ ス ト を UTF-16 形式で抽出 し 、 それを フ ァ イ ル file.utf16 に格納 し ます : tet --format utf16 --outfile file.utf16 file.pdf tet --format utf16 -o file.utf16 file.pdf デ ィ レ ク ト リ 内のすべての PDF フ ァ イ ルか ら テ キ ス ト を抽出 し 、 生成 さ れた *.txt フ ァ イ ル群を別のデ ィ レ ク ト リ (すでに存在 し てい る 必要があ り ます) に格納 し ます : tet --targetdir out in/*.pdf tet -t out in/*.pdf テ キ ス ト 抽出をページ上の特定の領域に限 り ます。 こ れは適切なページオプシ ョ ンの リ ス ト を与え る こ と で実現で き ます : tet --pageopt "includebox={{0 0 200 200}}" file.pdf さ ま ざ ま な コ マ ン ド ラ イ ンオプシ ョ ン を内容 と し て持つレ ス ポ ン ス フ ァ イ ルを用いて、カ レ ン ト デ ィ レ ク ト リ 内のすべての PDF 文書を処理 し ます (フ ァ イ ル options に コ マ ン ド ラ イ ンオプシ ョ ン群が入っ てい ます) : tet @options *.pdf 2.3.2 画像 を抽出 file.pdf か ら 画像群をページ志向な方式で抽出 し 、 それ ら をデ ィ レ ク ト リ out 内の file*.tif/ file*.jpg に格納 し ます : tet --targetdir out --image file.pdf tet -t out -i file.pdf file.pdf か ら 画像群を リ ソ ース志向な方式で抽出 し 、それ ら をデ ィ レ ク ト リ out 内の file*.tif/ file*.jpg に格納 し ます : 24 2 章 : TET コ マ ン ド ラ イ ン ツール tet --targetdir out --image --imageloop resource file.pdf tet -t out -i --imageloop resource file.pdf file.pdf か ら 画像群を画像結合な し に抽出 し ます。 こ れは、画像処理に関連 し た適切なペー ジオプシ ョ ンの リ ス ト を与え る こ と で実現で き ます : tet --targetdir out --image --pageopt "imageanalysis={merge={disable}}" file.pdf tet -t out -i --pageopt "imageanalysis={merge={disable}}" file.pdf 2.3.3 TETML を生成 PDF 文書 file.pdf に対す る TETML 出力を単語モー ド で生成 し 、 それを file.tetml に格納 し ます : tet --tetml word file.pdf tet -m word file.pdf TETML 出力を、 Options 要素一切な し で生成 し ます。 こ れは、 適切な文書オプシ ョ ンの リ ス ト を与え る こ と で実現で き ます : tet --docopt "tetml={elements={options=false}}" --tetml word file.pdf TETML 出力を、 すべてのグ リ フ情報を持っ た単語モー ド で生成 し 、 それを file.tetml に格 納 し ます : tet --tetml word --pageopt "tetml={glyphdetails={all}}" file.pdf tet -m word --pageopt "tetml={glyphdetails={all}}" file.pdf 画像群を抽出 し て TETML を生成す る こ と を、 一回の呼び出 し で行い ます : tet --image --tetml word file.pdf tet -i -m word file.pdf TETML 出力を下向 き 座標で生成 し ます : tet --tetml word --pageopt "topdown={output}" file.pdf tet -m word --pageopt "topdown={output}" file.pdf 2.3.4 高度な オ プ シ ョ ン あ る 種の TeX 由来の PDF 文書に対 し て、文書オプシ ョ ン checkglyphlists を与え て Unicode マ ッ ピ ン グ を改善 し ます : tet --docopt checkglyphlists file.pdf Unicode 字形統合を適用 し ます。た と えば空白字形統合:すべての種類の Unicode 空白キ ャ ラ ク タ を U+0020 へマ ッ プ し ます : tet --docopt "fold={{[:blank:] U+0020}}" file.pdf 句読点を単語境界 と し て無効に し ます : tet --pageopt "contentanalysis={punctuationbreaks=false}" file.pdf 2.3 コ マ ン ド ラ イ ンの例 25 26 2 章 : TET コ マ ン ド ラ イ ン ツール 3 TET ラ イ ブラ リ の言語バイ ン ディ ン グ こ の章では、TET ラ イ ブ ラ リ で供給 さ れ る さ ま ざ ま な言語バ イ ンデ ィ ン グの仕様について 解説 し ます。 TET デ ィ ス ト リ ビ ュ ーシ ョ ンには、 対応 し てい る すべての言語バ イ ンデ ィ ン グに よ る い く つかの小 さ な TET アプ リ ケーシ ョ ンのための完全なサンプル コ ー ド が含ま れてい ます。 3.1 例外処理 あ る 種のエ ラ ーは多 く の言語において例外 と 呼ばれてい ます。それには も っ と も な理由が あ り 、 そ う し たエ ラ ーは単な る 例外で、 プ ロ グ ラ ムが始ま っ て終わ る ま での間にそ う 頻繁 には起 こ ら ない と 予想 さ れ る か ら です。 一般的な さ ばき 方 と し ては、 まずい こ と が頻繁に 起 こ り そ う な関数呼び出 し については通常のエ ラ ー報告の し く み (要は特別なエ ラ ー コ ー ド を返す) を採用す る と し て、 めっ たに起 こ ら な さ そ う な も のについて ま でそれをや る と コ ー ド があ ら ゆ る 場合分けに よ っ て条件文だ ら けにな っ て し ま う ので、それを避け る ため にそ う し た も のについては特殊な例外の し く みを採用す る のが普通です。TET で も ま さ に その通 り の こ と を行っ てい ます。 操作に よ っ ては、 割 と 頻繁に まずい こ と が起 き る と 予想 で き る も のがあ り ます。 た と えば : > 正 し いパス ワー ド を知 ら ない PDF 文書を開 こ う と し た (ただ し 、59 ページの 5.1 「暗号 化 PDF か ら 内容を抽出」 で説明す る シ ュ ラ ッ グ機能 も 参照)。 > 誤っ た フ ァ イ ル名で PDF 文書を開 こ う と し た。 > 修復で き ないほ ど破損 し てい る PDF 文書を開 こ う と し た。 TET は こ の よ う なエ ラ ーを、 値 -1 を返す こ と に よ っ て知 ら せます。 API リ フ ァ レ ン ス に 記述 し てい る 通 り です。 一方、 有害 と 考え ら れ る 出来事ではあ っ て も 起 き る 頻度は割 と 低 い も の も あ り ます。 た と えば : > 仮想 メ モ リ が足 り な く な っ た。 > 関数に与えたパ ラ メ タ がおか し い (文書のハン ド ルが無効だっ た等)。 > オプシ ョ ン リ ス ト を与えた ら 形式が間違っ ていた。 > 必要な リ ソ ース なのに (日中韓テ キ ス ト 抽出には CMap フ ァ イ ルが必要等) 見つか ら な い。 TET が こ の よ う な状況を検知 し た場合には、特別なエ ラ ー値が呼び出 し 元に返 る のではな く 、 例外が発生 し ます。 例外にネ イ テ ィ ブに対応 し てい る 言語では、 例外の発生は、 その 言語・環境が与え る 標準手段を用いて行われます。C 言語バ イ ンデ ィ ン グの場合には、TET はカ ス タ ムの例外処理の し く みを提供 し てい る ので、 ク ラ イ ア ン ト はそれを用い る 必要が あ り ます (29 ページの 3.2 「C バ イ ンデ ィ ン グ」 参照)。 重要な留意点 と し ては、 例外が起 き た ら 文書の処理は止めなければな り ません。 例外 の後に呼んで も 安全な メ ソ ッ ド は delete( ) ・ get_apiname( ) ・ get_errnum( ) ・ get_errmsg( ) だけです。 こ れ以外の メ ソ ッ ド を例外の後に呼ぶ と 予測で き ない結果につなが る こ と があ り ます。 こ の例外は以下の情報を持っ てい ます。 > 一意のエ ラ ー番号。 > 例外の原因 と な っ た API 関数の名前。 > 問題点を説明 し た文。 失敗 し た関数呼び出 し の原因 を取得 TET の関数に よ っ ては、た と えば open_document( ) や open_page( ) 等、 呼び出 し て失敗 し て も 例外が発生 し ない も のがあ り ます (そ う し た関 3.1 例外処理 27 数はエ ラ ー時には -1 を返 し ます)。 その よ う な場合には、 失敗 し た関数呼び出 し の直後に 関数 get_errnum( ) ・ get_errmsg( ) ・ get_apiname( ) を呼び出せば、 問題の性質に関す る 詳 し い情報を得 る こ と がで き ます。 28 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング 3.2 C バ イ ン デ ィ ン グ 例外処理 TET の API は、C 言語にはネ イ テ ィ ブな例外処理がないのを補 う ために、 こ の ラ イ ブ ラ リ が発生 さ せた例外に対処す る ための し く みを提供 し てい ます。 TET_TRY( ) マ ク ロ と TET_CATCH( ) マ ク ロ を用い る こ と に よ り 、例外発生時にエ ラ ー処理や ク リ ーン ア ッ プ を実行 さ せ る ための コ ー ド を入れ込んだ ク ラ イ ア ン ト コ ー ド を組み立て る こ と がで き る のです。 こ れ ら のマ ク ロ は コ ー ド 内に 2 つの部分を切 り 分け ます。 1 つは try 節で、 例外 を発生 さ せ る 可能性のあ る コ ー ド を持ち、 も う 1 つは catch 節で、 例外に対処す る コ ー ド を持ち ます。 try ブ ロ ッ ク の中か ら 呼び出 さ れた API 関数のいずれかが例外を発生 さ せた と き 、プ ロ グ ラ ムの実行はただちに catch ブ ロ ッ ク の先頭ス テー ト メ ン ト に移 り ます。TET の ク ラ イ ア ン ト の コ ー ド は以下の規則に従 う 必要があ り ます : > TET_TRY( ) と TET_CATCH( ) は必ず対に し なければな り ません。 > TET_new( ) は決 し て例外を発生 さ せません。try ブ ロ ッ ク は、有効な TET オブジ ェ ク ト ハ ン ド ルを用いなければ開始 さ せ る こ と がで き ないので、 TET_new( ) はすべての try ブ ロ ッ ク の外で呼び出 さ なければな り ません。 > TET_delete( ) は決 し て例外を発生 さ せません。よ っ て、すべての try ブ ロ ッ ク の外で安全 に呼び出す こ と がで き ます。 catch 節の中で呼び出す こ と も で き ます。 > try ブ ロ ッ ク と catch ブ ロ ッ ク の両方の中で用い ら れてい る 変数については特別な注意 を払 う 必要があ り ます。 コ ンパ イ ラ は、 制御がブ ロ ッ ク か ら ブ ロ ッ ク へ移 る こ と は知 ら ないので、 その よ う な場合、 不適切な コ ー ド を生成す る 可能性があ り ます (レ ジ ス タ 変数最適化等)。 幸い、 こ の種の問題を避け る 簡単な規則があ り ます。 try ブ ロ ッ ク と catch ブ ロ ッ ク の 両方で用い ら れ る 変数は volatile と 宣言す る 必要があ る のです。 volatile キーワー ド の 使用は コ ンパ イ ラ に、 危険な最適化を変数に行っ てはな ら ない と い う こ と を知 ら せま す。 > try ブ ロ ッ ク を抜け る 場合には(た と えば return ス テー ト メ ン ト に よ っ て、ひいては対応 する TET_CATCH( ) の実行をバ イ パ ス し て)、return ス テー ト メ ン ト の前に TET_EXIT_TRY( ) マ ク ロ を呼び出 し て、 例外の し く みにその こ と を通知す る 必要があ り ます。 > TET のあ ら ゆ る 言語バ イ ンデ ィ ン グの場合 と 同様、 例外が発生 し た ら 文書処理は止め なければな り ません。 以下の コ ー ド に、 こ れ ら の規則の遵守例を示 し ます。 ク ラ イ ア ン ト の コ ー ド 内で TET の 例外を扱 う 際の典型的な書 き 方 も あわせて示 し てい ます(完全なサンプルは TET パ ッ ケー ジ内にあ り ます) : volatile int pageno; ... if ((tet = TET_new()) == (TET *) 0) { printf("メモリがいっぱいです\n"); return(2); } TET_TRY(tet) { for (pageno = 1; pageno <= n_pages; ++pageno) { /* ページ処理 */ if (/* エラーが起きた */) { TET_EXIT_TRY(tet); 3.2 C バイ ンデ ィ ング 29 return -1; } } /* API関数群を直接・間接に呼び出すステートメント群 */ } TET_CATCH(tet) { printf("エラー %d が %s() 内で %d ページ上で発生しました: %s\n", TET_get_errnum(tet), TET_get_apiname(tet), pageno, TET_get_errmsg(tet)); } TET_delete(tet); 名前文字列に対す る Unicode 処理 C 言語はネ イ テ ィ ブで Unicode に対応 し てい ません。 API 関数に対す る 文字列パ ラ メ タ のなかには名前文字列 と し て宣言 さ れてい る も のがあ り ます。 こ れ ら は length パ ラ メ タ と 、 文字列の先頭の BOM の有無 と に よ っ て処理の さ れ方 が異な り ます。 C の場合、 length パ ラ メ タ が 0 でない と き は文字列は UTF-16 と 解釈 さ れ ます。 length パ ラ メ タ が 0 の と き は、 文字列が UTF-8 BOM で始ま っ ていれば UTF-8 と 解釈 さ れ、 EBCDIC UTF-8 BOM で始ま っ ていれば EBCDIC UTF-8 と 解釈 さ れ、 BOM が なければ host エン コ ーデ ィ ン グ (ただ し EMBDIC ベース の全プ ラ ッ ト フ ォーム上では ebcdic) と 解釈 さ れます。 オ プ シ ョ ン リ ス ト に対す る Unicode 処理 オプシ ョ ン リ ス ト に文字列を含め る と き は特 別な注意が必要です。 なぜな ら 、 それは UTF-16 形式の Unicode 文字列 と し て表す こ と は で き ず、 バ イ ト 列 と し て表す こ と し かで き ないか ら です。 そのため、 Unicode のオプシ ョ ンに対 し ては UTF-8 が用い ら れます。 オプシ ョ ンの先頭の BOM を見て、 TET はそれを ど う 解釈す る かを決め ます。 こ の BOM を用いて文字列の形式が判定 さ れます。 具体的に は、 文字列オプシ ョ ンの解釈動作は以下の通 り です : > オプシ ョ ンが UTF-8 BOM (\xEF\xBB\xBF) で始ま っ ていれば UTF-8 と 解釈 さ れます。 > オプシ ョ ンが EBCDIC UTF-8 BOM (\x57\x8B\xAB) で始ま っ ていれば EBCDIC UTF-8 と 解釈 さ れます。 > BOM がなければ文字列は winansi (ただ し EBCDIC ベース のプ ラ ッ ト フ ォーム上では ebcdic) と し て扱われます。 注記 TET_utf16_to_utf8( ) ユーテ ィ リ テ ィ 関数を用い る と 、 UTF-16 文字列を UTF-8 文字列に変 換する こ と がで き ます。 Unicode 値を持つオプ シ ョ ン リ ス ト を作 り たい と き に便利です。 30 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング 3.3 C++ バ イ ン デ ィ ン グ tetlib.h C ヘ ッ ダ フ ァ イ ルに加え て、 C++ 用のオブジ ェ ク ト 指向 ラ ッ パ も 提供 さ れてお り 、 TET の ク ラ イ ア ン ト か ら 利用す る こ と がで き ます。 こ の ラ ッ パはヘ ッ ダ フ ァ イ ル tetlib.h を必要 と し ます。 こ のヘ ッ ダ フ ァ イ ルは tetlib.h を イ ン ク ルー ド し ます。 tet.hpp はテ ンプ レー ト ベース の実装を内容 と し て持ち ますので、 対応す る tet.cpp モジ ュ ールは必要あ り ません。 C++ オブジ ェ ク ト ラ ッ パを使 う こ と は、 API 関数 と 、 すべての TET 関数名の TET_ 接頭辞 と に よ る 関数的ア プ ロ ーチ を、 よ り オブジ ェ ク ト 志向な ア プ ロ ーチへ置 き 換え ま す。 C++ の文字列処理 TET 4.0 は、 新 し い Unicode 対応の C++ バ イ ンデ ィ ン グ を導入 し ま し た。 新 し いテ ンプ レー ト ベース のアプ ロ ーチで、 文字列処理に関 し て以下の使用パ タ ーン が使え ます : > C++ 標準 ラ イ ブ ラ リ 型 std::wstring の文字列が基本文字列型 と し て用い ら れます。 こ れ は、UTF-16 ま たは UTF-32 で符号化 さ れた Unicode キ ャ ラ ク タ を持つ こ と がで き ます。 こ れは TET 4.0 のデフ ォ ル ト 動作であ り 、 カ ス タ ムデー タ 型 (次項参照) が wstring に 対 し て大 き な利点を持た ないかぎ り 、 新 し いアプ リ ケーシ ョ ン に対す る 推奨アプ ロ ー チです。 > 文字列処理のためのカ ス タ ム (ユーザー定義) デー タ 型を、 そのカ ス タ ムデー タ 型が basic_string ク ラ ス テ ンプ レー ト の イ ン ス タ ン ス化であ り 、 かつユーザーが与え る 変換 メ ソ ッ ド に よ っ て Unicode と の相互変換が可能であ る かぎ り 、 用い る こ と がで き ます。 > プ レーン C++ 文字列を、TET 3.0 ま でのバージ ョ ンに対 し て開発 さ れた既存の C++ アプ リ ケーシ ョ ン と の互換性のために用い る こ と がで き ます。 こ の互換方式は、 既存アプ リ ケーシ ョ ン のためだけに用意 さ れてい ます ( ソ ース コ ー ド 互換性について下記注記 を参照)。 新 し い イ ン タ フ ェ ー ス は、 TET メ ソ ッ ド と や り と り さ れ る すべての文字列がネ イ テ ィ ブ wstring であ る と 見な し ます。 wchar_t デー タ 型のサ イ ズに よ っ て、 wstring は UTF-16 で (2 バ イ ト キ ャ ラ ク タ 群)、ま たは UTF-32 で(4 バ イ ト キ ャ ラ ク タ 群)符号化 さ れた Unicode 文字列を内容 と し て持つ と 見な さ れます。 ソ ース コ ー ド 内の リ テ ラ ル文字列は、 ワ イ ド 文 字であ る こ と を示すために先頭に L をつけ る 必要があ り ます。 リ テ ラ ル内で Unicode キ ャ ラ ク タ は \u ・ \U 文法で作成で き ます。 こ の文法は標準 ISO C++ に含まれてい る のですが、 コ ン パ イ ラ に よ っ て は こ れに対応 し て い な い も のが あ り ま す。 そ の場合には リ テ ラ ル Unicode キ ャ ラ ク タ は 16 進キ ャ ラ ク タ で作成す る 必要があ り ます。 ア プ リ ケーシ ョ ン を新 し い C++ バ イ ン デ ィ ン グに合わせて変更 TET 3.0 ま で の バ ー ジ ョ ンに対 し て開発 さ れた既存の C++ アプ リ ケーシ ョ ンは、以下の よ う に し て TET 4.0 に 合わせて変更す る こ と がで き ます : > TET C++ ク ラ スは pdflib 名前空間内に入 り ま し たので、ク ラ ス名を修飾す る 必要があ り ます。 いちいち pdflib::TET を書 く こ と を避け る ため、 ク ラ イ ア ン ト アプ リ ケーシ ョ ン は TET メ ソ ッ ド を使 う 前に下記を追加す る べ き です : using namespace pdflib; > アプ リ ケーシ ョ ンの文字列処理を wstring へ切 り 替え ます。 こ れは外部情報源か ら の デー タ について も 当ては ま り ます。 し か し 、 ソ ー ス コ ー ド 内の文字列 リ テ ラ ル (オプ シ ョ ン リ ス ト も ) は、 L 接頭辞を頭につけ る 必要があ り ます。 た と えば const wstring pageoptlist = L"granularity=page"; 3.3 C++ バイ ンデ ィ ング 31 > TET のエ ラ ー メ ッ セージ と 例外文字列 (TET・TET::Exception ク ラ ス内の get_errmsg( ) メ ソ ッ ド ) を処理す る には、 適切な wstring 対応 メ ソ ッ ド (wcerr 等) を用い る 必要があ り ます。 > TET C++ バ イ ンデ ィ ン グで tet.cpp モジ ュ ールは必要な く な り ま し た。TET デ ィ ス ト リ ビ ュ ーシ ョ ンは こ のモジ ュ ールのダ ミ ー実装を含んでい ま すが、 こ れは TET アプ リ ケーシ ョ ンのビル ド 処理か ら は除 く べ き です。 レ ガ シ ア プ リ ケーシ ョ ン と の完全 ソ ース コ ー ド 互換性 新 し い C++ バ イ ンデ ィ ン グはア プ リ ケーシ ョ ン レベルの ソ ース コ ー ド 互換性を志向 し て設計 さ れてい ますが、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは再 コ ンパ イ ルす る 必要があ り ます。 レ ガシ アプ リ ケーシ ョ ンに対 し て完全な ソ ース コ ー ド 互換性を実現す る には以下の方法が用意 さ れてい ます : > tet.hpp を イ ン ク ルー ド す る 前に wstring ベース の イ ン タ フ ェース を下記の よ う に無効 化 し ます : #define TETCPP_TET_WSTRING 0 > tet.hpp を イ ン ク ルー ド す る 前に pdflib 名前空間を下記の よ う に無効化 し ます : #define TETCPP_USE_PDFLIB_NAMESPACE 0 C++ のエ ラ ー処理 TET API 関数は、 エ ラ ー発生時には C++ 例外を発生 さ せます。 こ れ ら の例外は ク ラ イ ア ン ト コ ー ド 内で C++ の try/catch 節を用いて キ ャ ッ チす る 必要があ り ます。 さ ら な る エ ラ ー情報を提供す る ために、 TET ク ラ ス はパブ リ ッ ク な TET::Exception ク ラ ス を提供 し てお り 、 こ の ク ラ ス は、 詳細なエ ラ ー メ ッ セージ、 例外番号、 例外を発生 さ せた TET API 関数の名前を取得す る ための メ ソ ッ ド を公開 し てい ます。 TET ルーチンが発生 さ せたネ イ テ ィ ブな C++ 例外は期待どお り に動作 し ます。 以下の コ ー ド は、 TET が発生 さ せた例外を キ ャ ッ チ し ます : try { ...TET命令群... } catch (TET::Exception &ex) { wcerr << L"Error " << ex.get_errnum() << L" in " << ex.get_apiname() << L"(): " << ex.get_errmsg() << endl; } 32 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング 3.4 COM バ イ ン デ ィ ン グ TET の COM エデ ィ シ ョ ン を イ ン ス ト ール TET は COM コ ン ポーネ ン ト に対応 し たすべ ての環境で利用す る こ と がで き ます。 TET の イ ン ス ト ール方法は簡単で単純です。 以下の 点に留意 し て下 さ い : > NTFS パーテ ィ シ ョ ンに イ ン ス ト ールする 場合は、すべての TET ユーザーに、その イ ン ス ト ールデ ィ レ ク ト リ の読み取 り 権限 と 、...\TET 4.0 32-bit\bind\COM\bin\tet_com.dll の 実行権限を持たせ る 必要があ り ます。 > イ ン ス ト ー ラ はシ ス テ ム レ ジ ス ト リ に対 し て書 き 込み権限 を 持た な ければな り ま せ ん。 Administrators グループか Power Users グループの権限であれば通常充分で し ょ う 。 例外処理 TET の COM コ ン ポーネ ン ト に対す る 例外処理は COM の規則に従っ て行われ ます。 すなわち、 TET の例外が起 き る と 、 COM の例外が発生 し 、 そのエ ラ ーの説明テ キ ス ト と と も に伝達 さ れます。 こ の COM の例外は、 その ク ラ イ ア ン ト 環境が対応 し てい る 任意の COM のエ ラ ー処理方式で捕捉 ・ 処理す る こ と がで き ます。 TET の COM エデ ィ シ ョ ン を .NET で使 う TET の .NET エデ ィ シ ョ ン (36 ページの 3.6 「.NET バ イ ンデ ィ ン グ」 参照) のかわ り と し て、 TET の COM エデ ィ シ ョ ンは .NET で使 用す る こ と も 可能です。 まず、 tlbimp.exe ユーテ ィ リ テ ィ を用いて TET の COM エデ ィ シ ョ ンか ら .NET アセ ンブ リ を作成す る 必要があ り ます : tlbimp tet_com.dll /namespace:tet_com /out:Interop.tet_com.dll .NET アプ リ ケーシ ョ ン内では こ のアセ ンブ リ を使 う こ と がで き ます。 Visual Studio .NET 内か ら tet_com.dll への参照を追加すればアセ ン ブ リ は自動作成 さ れ ます。 C# におけ る TET の COM エデ ィ シ ョ ンの使用法を以下の コ ー ド に示 し ます : using TET_com; ... static TET_com.ITET tet; ... tet = New TET(); ... 上記に示 し た以外の コ ー ド はすべて TET の .NET エデ ィ シ ョ ン と 同様に動作 し ます。 3.4 COM バイ ンデ ィ ング 33 3.5 Java バ イ ン デ ィ ン グ TET の Java エデ ィ シ ョ ン を イ ン ス ト ール TET は com.pdflib.TET と い う 名前で Java パ ッ ケージ と し て ま と め ら れてい ます。 こ のパ ッ ケージはネ イ テ ィ ブ JNI ラ イ ブ ラ リ に依存 し ますので、 両者は適切に設定 し てお く 必要があ り ます。 JNI ラ イ ブ ラ リ を可能にす る ために必要な操作は、 以下の よ う にプ ラ ッ ト フ ォ ーム に よ っ て異な り ます : > Unix シ ス テ ム群の場合には、libtet_java.so (Mac OS X では libtet_java.jnilib) ラ イ ブ ラ リ を、 共有 ラ イ ブ ラ リ 用のデフ ォ ル ト の場所、 ない し 適切に設定 し たデ ィ レ ク ト リ に置 く 必要があ り ます。 > Windows の場合には、pdf_tet.dll ラ イ ブ ラ リ を、Windows のシ ス テ ムデ ィ レ ク ト リ 、ない し PATH 環境変数に挙げたデ ィ レ ク ト リ に置 く 必要があ り ます。 こ の TET の Java パ ッ ケージはフ ァ イ ル tet.jar 内に存在 し 、 ただ一つの ク ラ ス tet を持ち ま す。 こ の パ ッ ケ ー ジ を 自分 の ア プ リ ケ ー シ ョ ン で 利用可能 に す る に は、 tet.jar を CLASSPATH 環境変数に追加す る か、 Java コ ンパ イ ラ への呼び出 し の中に -classpath tet.jar オプシ ョ ン を加え る か、 ま たは こ れ と 等価な操作を Java IDE で行 う 必要があ り ます。 JDK で Java VM の設定を行 う こ と に よ っ て、ネ イ テ ィ ブ ラ イ ブ ラ リ が所与のデ ィ レ ク ト リ 内で 検索 さ れ る よ う にす る には、java.library.path にそのデ ィ レ ク ト リ の名前を適切に設定 し ま す。 た と えば java -Djava.library.path=. extractor こ のプ ロ パテ ィ の値は下記の よ う に し て調べ ら れます : System.out.println(System.getProperty("java.library.path")); TET を J2EE ア プ リ ケーシ ョ ンサーバ と サーブ レ ッ ト コ ン テ ナで使 う TET はサーバサ イ ド Java アプ リ ケーシ ョ ンに完全に適合 し てい ます。 TET デ ィ ス ト リ ビ ュ ーシ ョ ンは、 TET を J2EE 環境で使 う ためのサンプル コ ー ド と 設定を含んでい ます。 以下の設定事項に 従 う 必要があ り ます : > サーバがネ イ テ ィ ブ ラ イ ブ ラ リ を 検索す る デ ィ レ ク ト リ はベ ン ダ に よ っ て異な り ま す。 よ く あ る 場所 と し ては、 シ ス テ ムデ ィ レ ク ト リ や、 背後の Java VM に固有のデ ィ レ ク ト リ や、 ロ ーカルサーバデ ィ レ ク ト リ を候補に挙げ る こ と がで き ます。 サーバベ ン ダが提供 し てい る 説明書を調べて下 さ い。 > アプ リ ケーシ ョ ン サーバ と サーブ レ ッ ト コ ン テナは し ば し ば、 特殊な ク ラ ス ロ ーダ を 用いてお り 、 その ク ラ ス ロ ーダは制限 さ れてい る か、 あ る いは専用の ク ラ ス パ ス を用 いてい る 可能性があ り ま す。 サーバに よ っ ては、 特別な ク ラ ス パ ス を定義 し て、 TET パ ッ ケージが必ず見つか る よ う に し てお く こ と が必要です。 TET を個別のサーブ レ ッ ト エ ン ジ ン と アプ リ ケーシ ョ ン サーバで使 う 際の よ り 詳細な注 意点は、 TET デ ィ ス ト リ ビ ュ ーシ ョ ンの J2EE デ ィ レ ク ト リ 内の追加文書に記 し て あ り ま す。 Unicode と レ ガ シ エ ン コ ーデ ィ ン グの変換 TET ユーザーの便宜のため、 有用な文字列 変換 メ ソ ッ ド を こ こ でい く つか挙げます。 下記の コ ン ス ト ラ ク タ は、 プ ラ ッ ト フ ォームの デフ ォ ル ト エン コ ーデ ィ ン グ を用いて、 バ イ ト 列か ら Unicode 文字列を生成 し ます : String(byte[] bytes) 34 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング 下記の コ ン ス ト ラ ク タ は、 enc 引数で与え たエ ン コ ーデ ィ ン グ (SJIS ・ UTF8 ・ UTF-16 等) を用いて、 バ イ ト 列か ら Unicode 文字列を生成 し ます : String(byte[] bytes, String enc) String ク ラ ス の下記の メ ソ ッ ド は、 Unicode 文字列を、 enc 引数で指定 し たエン コ ーデ ィ ン グに従っ た文字列へ変換 し ます : byte[] getBytes(String enc) TET の Javadoc 文書 TET パ ッ ケージは TET の Javadoc 文書を含んでい ます。こ の Javadoc は、 すべての TET API メ ソ ッ ド の短縮 さ れた説明のみを含んでい ま す。 詳 し く は、 143 ページの 11 章 「TET ラ イ ブ ラ リ API リ フ ァ レ ン ス」 を参照 し て く だ さ い。 TET の Javadoc を Eclipse で設定す る には以下の よ う に操作 し ます : > パ ッ ケージエ ク ス プ ロ ー ラ で Java プ ロ ジ ェ ク ト を右 ク リ ッ ク し 、 「Javadoc ロケーシ ョ ン」 を選択 し ます。 > 「ブ ラ ウズ ...」 を ク リ ッ ク し 、 Javadoc が置かれてい る パ ス (TET パ ッ ケージ内) を選択 し ます。 こ れ ら の操作を行な っ た後は、 「Java ブ ラ ウズ」 パースペ ク テ ィ ブや 「ヘルプ」 メ ニ ュ ー な ど か ら TET の Javadoc を閲覧で き ます。 例外処理 TET の Java 言語バ イ ンデ ィ ン グは ク ラ ス TETException のネ イ テ ィ ブな Java 例 外を発生 さ せます。 TET の ク ラ イ ア ン ト コ ー ド は標準的な Java 例外の文法を用い る 必要 があ り ます : TET tet = null; try { ...さまざまなTETメソッド呼び出し... } catch (TETException e) { System.err.print("TETの例外が発生しました:\n"); System.err.print("[" + e.get_errnum() + "] " + e.get_apiname() + ": " + e.get_errmsg() + "\n"); } catch (Exception e) { System.err.println(e.getMessage()); } finally { if (tet != null) { tet.delete(); } } /* TETオブジェクトを削除 */ TET は適切な throws 節を宣言す る ので、 ク ラ イ ア ン ト コ ー ド はすべての可能な例外を捕 捉す る か、 ま たはそれ ら を自身で宣言す る 必要があ り ます。 3.5 Java バイ ンデ ィ ング 35 3.6 .NET バ イ ン デ ィ ン グ TET の .NET エデ ィ シ ョ ンはそれ ら すべての .NET 概念に対応 し てい ます。 専門用語でい えば、 TET.NET エデ ィ シ ョ ンは .NET Framework の制御下で走 る C++ ク ラ ス (非マネージ TET コ ア ラ イ ブ ラ リ のためのマネージ ラ ッ パを備えた) です。 それは ス ト ロ ン グ名を持つ 静的アセ ン ブ リ と し てパ ッ ケージ さ れてい ます。 こ の TET アセ ン ブ リ (TET_dotnet.dll) は、 ラ イ ブ ラ リ 本体 と メ タ 情報を持ち ます。 注記 TET.NET は、 .NET Framework 2.0 以上を必要 と し ます。 TET の .NET エデ ィ シ ョ ン を イ ン ス ト ール TET を、提供 さ れてい る Windows MSI イ ン ス ト ー ラ で イ ン ス ト ール し ます。TET.NET MSI イ ン ス ト ー ラ は、TET アセ ンブ リ と 補足デー タ フ ァ イ ル ・ サ ン プル を対話的にマ シ ン に イ ン ス ト ール し ま す。 こ の イ ン ス ト ー ラ は ま た、 Visual Studio .NET の 「参照の追加」 ダ イ ア ロ グボ ッ ク ス の .NET タ ブで TET を簡単 に参照で き る よ う 登録 も 行い ます。 TET.NET を ASP.NET 用に イ ン ス ト ール TET.NET を自分の ASP.NET ス ク リ プ ト 内で使 う ためには、 TET.NET アセ ンブ リ を ASP で利用可能にす る 必要があ り ます。 こ れは、 自 分の IIS イ ン ス ト レーシ ョ ンの bin サブデ ィ レ ク ト リ (ない と き は自分で手作業で作成す る 必要があ り ます) に、ま たは自分の Web アプ リ ケーシ ョ ンの bin デ ィ レ ク ト リ に TETlib_ dotnet.dll を置 く こ と に よ っ て実現で き ます。 た と えば C:\Inetpub\wwwroot\bin\TET_dotnet.dll C:\Inetpub\wwwroot\WebApplicationX\bin\TET_dotnet.dll または ASP.NET 特有の留意点 外部フ ァ イ ルを使 う 際には、ASP の MapPath 機能を用いて、ロ ー カルデ ィ ス ク 上のパ ス名を、ASP.NET ス ク リ プ ト 内で使え る パ ス名へマ ッ プす る 必要があ り ます。 TET と と も に提供 さ れてい る ASP.NET の作成例群を参照 し て く だ さ い。 MapPath に詳 し く ない場合は ASP.NET の文書 も 参照 し て く だ さ い。 ASP.NET ス ク リ プ ト 内で絶対 パ ス名を使わないで下 さ い。 それは MapPath な し には動作 し ません。 自分の ASP.NET ス ク リ プ ト があ る デ ィ レ ク ト リ は、 実行権限を持つ必要があ り ます。 ま た、 PDF 生成に イ ン コ ア方式を用いてい る のでないかぎ り は、 書 き 込み権限 も 必要です (提供 さ れてい る ASP 作成例群は イ ン コ ア PDF 生成を用いてい ます)。 ASP.NET 2.0 以上の信頼 レ ベル ASP.NET 2.0 は、 Web アプ リ ケーシ ョ ンに対す る さ ま ざ ま な信頼レベルでの許容操作に関す る い く つかの制限を導入 し ま し た。 TET.NET は非マ ネージ コ ー ド を含んでい ますので、 Full 信頼レベルを必要 と し ます。 TET.NET アプ リ ケー シ ョ ンは こ れ以外の High 信頼や Medium 信頼 と いっ た信頼レベルでは ASP.NET 2.0 アプ リ ケーシ ョ ンで展開で き ません。 エ ラ ー処理 TET.NET は .NET の例外に対応 し てお り 、実行時に問題が起 き る と 例外を発 生 さ せ、 詳細なエ ラ ー メ ッ セージ を伝達 し ます。 こ う し た例外を捕捉 し て適切にそれに対 処す る こ と は ク ラ イ ア ン ト 側の領分です。 それを し ない場合には .NET Framework がその 例外を捕捉 し 、 多 く の場合アプ リ ケーシ ョ ン を中断 さ せます。 例外関連情報の伝達のために TET は独自の例外 ク ラ ス TET_dotnet.TETException を定義 し てい ます。 こ の ク ラ ス は メ ンバ get_errnum ・ get_errmsg ・ get_apiname を持ち ます。 36 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング 3.7 Perl バ イ ン デ ィ ン グ Perl 用 TET ラ ッ パは、 1 個の C ラ ッ パ と 2 個の Perl パ ッ ケージモジ ュ ールか ら 成 り ます。 こ のモジ ュ ールの一つは各 TET API 関数 と 同等の も の を Perl で提供す る も ので、 も う 一 つは TET オブジ ェ ク ト のための も のです。 C モジ ュ ールは、 Perl イ ン タ プ リ タ が実行時 に読み込む共有 ラ イ ブ ラ リ を、パ ッ ケージ フ ァ イ ルか ら い く ら かの助け を借 り て ビル ド す る ために用い ら れます。 Perl ス ク リ プ ト は共有 ラ イ ブ ラ リ モジ ュ ールを、 use ス テー ト メ ン ト を通 じ て参照 し ます。 TET の Perl エデ ィ シ ョ ン を イ ン ス ト ール Perl 拡張機構は共有 ラ イ ブ ラ リ を実行時に、 DynaLoader モジ ュ ールを通 じ て読み込みます。 Perl 実行形式が、 共有 ラ イ ブ ラ リ に対応 し た形で コ ンパ イ ル さ れてい る 必要があ り ます(多 く の Perl 設定ではその よ う にな っ てい ま す)。 TET バ イ ンデ ィ ン グが動作す る ためには、 Perl イ ン タ プ リ タ は TET Perl ラ ッ パ と モ ジ ュ ール tetlib_pl.pm ・ PDFlib/TET.pm を利用可能であ る 必要があ り ます。 以下に説明す る プ ラ ッ ト フ ォーム固有の方式のほかに、 Perl の @INC モジ ュ ール検索パ ス に、 -I コ マ ン ド ラ イ ンオプシ ョ ン を用いてデ ィ レ ク ト リ を追加す る こ と も 可能です : perl -I/path/to/tet extractor.pl Unix Perl は、 tetlib_pl.so (Mac OS X では tetlib_pl.bundle) ・ tetlib_pl.pm ・ PDFlib/TET.pm を、 カ レ ン ト デ ィ レ ク ト リ 内で、 あ る いは下記 Perl コ マ ン ド で印字 さ れ る デ ィ レ ク ト リ 内 で検索 し ます : perl -e 'use Config; print $Config{sitearchexp};' Perl はサブデ ィ レ ク ト リ auto/tetlib_pl も 検索 し ます。 上記 コ マ ン ド の典型的出力は下記 の よ う にな り ます : /usr/lib/perl5/site_perl/5.10/i686-linux Windows TET は、 Perl 5 の Windows に対す る ActiveState ポー ト に も 対応 し てい ます。 こ れは ActivePerl と も 呼ばれます。DLL tetlib_pl.dll と モジ ュ ール tetlib_pl.pm・PDFlib/TET.pm が、 カ レ ン ト デ ィ レ ク ト リ 内で、 あ る いは下記 Perl コ マ ン ド で印字 さ れ る デ ィ レ ク ト リ 内 で検索 さ れます : perl -e "use Config; print $Config{sitearchexp};" 上記 コ マ ン ド の典型的出力は下記の よ う にな り ます : C:\Program Files\Perl5.10\site\lib Perl の例外処理 TET 例外が発生 し た際には、 Perl 例外が発生 し ます。 こ れは、 eval シー ケ ン ス を用いて キ ャ ッ チ ・ 対処す る こ と がで き ます : eval { ...TET命令群... }; die "例外をキャッチしました: $@" if $@; 3.7 Perl バイ ンデ ィ ング 37 3.8 PHP バ イ ン デ ィ ン グ TET の PHP エデ ィ シ ョ ン を イ ン ス ト ール TET は、 PHP に動的に結合で き る C ラ イ ブ ラ リ と し て実装 さ れてい ます。 TET は、 PHP のい く つかのバージ ョ ンに対応 し てい ます。 使っ てい る PHP のバージ ョ ンに応 じ て、 適切な TET ラ イ ブ ラ リ を、 ア ンパ ッ ク し た TET アーカ イ ブか ら 選ぶ必要があ り ます。 TET を PHP で利用す る 際の さ ま ざ ま な考慮点やオプシ ョ ンについては、 た と えば PHP 用の ロ ーダブル TET モジ ュ ールを用い る べ き か ど う か と いっ た疑問 も 含めて、PDFlib ウ ェ ブサ イ ト か ら 入手で き る 文書 PDFlib-in-PHP-HowTo を参照 し て く だ さ い。 こ の文書では主 に PDFlib の PHP での利用について論 じ てい ますが、 その内容は、 TET の PHP での利用に ついて も あ ては ま る も のです。 PHP の設定を行っ て、 外部の TET ラ イ ブ ラ リ について PHP に知 ら せ る 必要があ り ま す。 次の 2 通 り の方法があ り ます : > 以下の行の う ちのいずれか を php.ini に追加す る : extension=libtet_php.dll ; Windows の場合 extension=libtet_php.so ; Unix・Mac OS X の場合 extension=libtet_php.sl ; HP-UX の場合 PHP は、 Unix の場合は php.ini 内の変数 extension_dir で指定 さ れたデ ィ レ ク ト リ 内で、 Windows の場合はそれに加え て標準シ ス テ ムデ ィ レ ク ト リ 群の中で も 、 ラ イ ブ ラ リ を 検索 し ます。 下記の一行 PHP ス ク リ プ ト を用いれば、 PHP TET バ イ ンデ ィ ン グの ど の バージ ョ ンが イ ン ス ト ール さ れてい る か を調べ る こ と がで き ます : <?phpinfo()?> こ れを実行す る と 、 現在の PHP の設定に関す る 長い情報ページが表示 さ れます。 こ の ページ上で、 tet と い う タ イ ト ルのセ ク シ ョ ン を見て く だ さ い。 も し こ のセ ク シ ョ ンに PDFlib TET Support enabled と い う フ レーズ (お よ び TET のバージ ョ ン番号) があれば、 PHP 用の TET が正 し く イ ン ス ト ール さ れてい ます。 > あ る いは、 ス ク リ プ ト の冒頭に以下の行の う ちのいずれか を書 く こ と で、 TET を実行 時に読み込む こ と も で き ます : dl("libtet_php.dll"); # Windows の場合 dl("libtet_php.so"); # Unix・Mac OS X の場合 dl("libtet_php.sl"); # HP-UX の場合 PHP の フ ァ イル名処理 非限定の フ ァ イ ル名 (パ ス要素のない も の) と 相対フ ァ イ ル名 は、 PHP の Unix バージ ョ ン と Windows バージ ョ ン と で扱いが異な り ます : > Unix シ ス テ ムの PHP では、パ ス要素のない フ ァ イ ルは、ス ク リ プ ト が読み込まれたデ ィ レ ク ト リ の中で検索 さ れます。 > Windows の PHP では、パ ス要素のない フ ァ イ ルは、PHP DLL が読み込まれデ ィ レ ク ト リ の中でのみ検索 さ れます。 例外処理 PHP 5 は構造化 さ れた例外処理に対応 し てい る ので、 TET の例外は PHP の例 外 と し て発生 し ます。 通常の try/catch 技法を用いて、 TET の例外を扱 う こ と がで き ます : try { 38 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング ...TET命令群... } catch (TETException $e) { print "TET例外発生:\n"; print "[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " $e->get_errmsg() . "\n"; } catch (Exception $e) { print $e; } 3.8 PHP バイ ンデ ィ ング 39 3.9 Python バ イ ン デ ィ ン グ TET の Python エデ ィ シ ョ ン を イ ン ス ト ール Python の拡張機構は、実行時に共有 ラ イ ブ ラ リ を 読み込む こ と に よ っ て 動作 し ま す。 TET バ イ ン デ ィ ン グ が動作す る た め には、 Python イ ン タ プ リ タ が TET Python ラ ッ パを利用可能であ る 必要があ り ます。 こ の ラ ッ パ は、 PYTHONPATH 環境変数内に挙げ ら れて い る デ ィ レ ク ト リ 群の中で検索 さ れ ま す。 Python ラ ッ パの名前はプ ラ ッ ト フ ォームに よ っ て異な り ます : > Unix ・ Mac OS X : tetlib_py.so > Windows : tetlib_py.pyd Python のエ ラ ー処理 Python バ イ ンデ ィ ン グは、TET エ ラ ーを ネ イ テ ィ ブな Python 例外 へ翻訳す る 特殊なエ ラ ーハン ド ラ を イ ン ス ト ール し ます。 こ の Python 例外は、通常の try/ catch 技法で扱え ます : try: ...TET命令群... except TETException: print 'TET例外をキャッチしました!' 40 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング 3.10 REALbasic バ イ ン デ ィ ン グ TET の REALbasic エデ ィ シ ョ ン を イ ン ス ト ール TET は、 Mac と Windows の REALbasic 開発環境 (REALbasic 2006 以上) に対応 し てい ます。 Mac で も Windows で も 、 TET の REALbasic エデ ィ シ ョ ン (TET.rbx) は、 REALbasic ア プ リ ケーシ ョ ンが入っ てい る の と 同 じ フ ォ ルダ内の Plugins と い う フ ォ ルダへ複製す る 必 要があ り ます。 Mac OS X では、 TET.framework を /Library/Frameworks へ イ ン ス ト ール も す る 必要があ り ます。 REALbasic 用 TET は一つのパ ッ ケージで配布 さ れ、 以下の種類を含 んでい ます : > Mac OS X PowerPC > Mac OS X Intel > Windows こ の こ と は、 Mac 版 ・ Windows 版ど ち ら を用いて も 、 Mac 用 ・ Windows 用の両方のアプ リ ケーシ ョ ン を ビル ド で き る こ と を意味 し ます。 ス タ ン ド ア ロ ン なアプ リ ケーシ ョ ンが生成 さ れ る 際には、 REALbasic は TET の適切な部分を選んで、 プ ラ ッ ト フ ォーム固有の部分だ け を生成アプ リ ケーシ ョ ン内へ含め ます。 追加の REALbasic ク ラ ス TET は、 REALbasic のオブジ ェ ク ト 階層構造に 2 個の新 し い ク ラ ス を追加 し ます : > TET ク ラ スはすべての TET API メ ソ ッ ド を含んでい ます。 > TETException ク ラ ス は、RuntimeException か ら 派生 し た も ので、TET が発生 さ せ る 例外 を扱 う ために使 う こ と がで き ます (後述)。 TET は、 GUI アプ リ ケーシ ョ ンの作成に も 、 コ ン ソ ールアプ リ ケーシ ョ ンの作成に も 用い る こ と がで き ます。 TET は コ ン ト ロ ールではあ り ませんので、 こ れは REALbasic の コ ン ト ロ ールパレ ッ ト に新 し いア イ コ ン を イ ン ス ト ールは し ません。 し か し TET が利用可能な と き は、 REALbasic は TET ク ラ ス と その関連 メ ソ ッ ド 群を認識 し ます。 た と えば、 命令補 完や引数チ ェ ッ ク は、 TET API メ ソ ッ ド 群に対 し て完全に動作 し ます。 REALbasic のエ ラ ー処理 例外発生時には、 TET は ク ラ ス TETException のネ イ テ ィ ブな REALbasic 例外を発生 さ せます。TET 例外は、標準的な REALbasic の技法で扱え ます : try/ catch ブ ロ ッ ク を用い る か ( こ れを推奨 し ますが、 REALbasic 5.5 以上が必要)、 あ る いは Exception ブ ロ ッ ク でそれを処理 し ます。 後者を以下の コ ー ド で演示 し ます : Exception err As TETException MsgBox("TET例外がextractorサンプル内で発生しました: [" + _ Str(err.get_errnum()) + "] " + err.get_apiname() + ": " + err.get_errmsg()) こ の例で示 し てい る よ う に、 REALbasic 開発者は、 エ ラ ー番号、 エ ラ ー メ ッ セージ、 例外 を発生 さ せた API 関数の名前を取得する ための TETException メ ソ ッ ド 群を用いて詳細な エ ラ ー情報を得 る こ と がで き ます。 3.10 REALbasic バイ ンデ ィ ング 41 3.11 RPG バ イ ン デ ィ ン グ TET は、 TET 関数群を埋め込んで ILE-RPG プ ロ グ ラ ム群を コ ンパ イ ルす る ために必要な すべてのプ ロ ト タ イ プ と い く つかの有用な定数を定義する /copy モジ ュ ールを提供 し てい ます。 Unicode 文字列処理 TET 関数はすべて可変長の Unicode 文字列を引数 と し て用い ますの で、 %ucs2 ビル ト イ ン関数を用いてシ ン グルバ イ ト 文字列を Unicode 文字列へ変換す る 必 要があ り ます。TET 関数が返す文字列はすべて可変長の Unicode 文字列です。こ の Unicode 文字列を シ ン グルバ イ ト 文字列へ変換す る には %char ビル ト イ ン関数を用い ます。 注記 %CHAR ・ %UCS2 関数は、 カ レ ン ト ジ ョ ブの CCSID を用いて Unicode と の文字列相互変換 を行います。 TET と と も に提供 さ れている作成例は、 CCSID 37 (US EBCDIC) を ベース と し ています。 他の コ ー ド ページで こ れ らの作成例を走らせた場合には、 オプ シ ョ ン リ ス ト 内のい く つかの特殊キ ャ ラ ク タ ({ [ ] } 等) が正 し く 翻訳 さ れない可能性があ り ます。 文字列はすべて可変長文字列 と し て渡 さ れますので、 さ ま ざ ま な関数で明示的な文字列長 を と る length 引数を渡 し てはいけ ません (可変長文字列の長 さ は文字列の先頭 2 バ イ ト に格納 さ れてい ます)。 TET に対す る RPG プ ロ グ ラ ム を コ ンパ イ ル ・ バ イ ン ド RPG で TET の関数を利用す る には、 コ ンパ イ ル さ れた TET サービ ス プ ロ グ ラ ムが必要です。 TET の定義群を コ ンパ イ ル時に イ ン ク ルー ド す る には、 ILE-RPG プ ロ グ ラ ムの D スペ ッ ク 内でその名前を指定す る 必要があ り ます : d/copy QRPGLESRC,TETLIB TET の ソ ース フ ァ イ ル ラ イ ブ ラ リ が ラ イ ブ ラ リ リ ス ト の ト ッ プにない場合は、ラ イ ブ ラ リ も 指定す る 必要があ り ます : d/copy tetsrclib/QRPGLESRC,TETLIB ILE-RPG プ ロ グ ラ ムの コ ンパ イ ルの際には、開始前にバ イ ンデ ィ ン グデ ィ レ ク ト リ を作成 し 、 そ こ に TET 付属の TETLIB サービ ス プ ロ グ ラ ム を入れてお く 必要があ り ます。 た と え ば、 ラ イ ブ ラ リ TETLIB の中に TETLIB と い う バ イ ンデ ィ ン グデ ィ レ ク ト リ を作成 し たい と き は、 次の よ う に指定 し ます : CRTBNDDIR BNDDIR(TETLIB/TETLIB) TEXT('TETlib Binding Directory') バ イ ンデ ィ ン グデ ィ レ ク ト リ を作成 し た ら 、 TETLIB サービ ス プ ロ グ ラ ム をバ イ ンデ ィ ン グデ ィ レ ク ト リ に追加す る 必要があ り ます。 た と えば、 ラ イ ブ ラ リ TETLIB の中のサービ ス プ ロ グ ラ ム TETLIB を、 さ き に作成 し たバ イ ンデ ィ ン グデ ィ レ ク ト リ に追加 し たい と き は、 次の よ う に指定 し ます : ADDBNDDIRE BNDDIR(TETLIB/TETLIB) OBJ((TETLIB/TETLIB *SRVPGM)) そ し て、 CRTBNDRPG コ マ ン ド を用いて (ま たは PDM でオプシ ョ ン 14 を用いて) プ ロ グ ラ ム を コ ンパ イ ルすれば完了です : CRTBNDRPG PGM(TETLIB/EXTRACTOR) SRCFILE(TETLIB/QRPGLESRC) SRCMBR(*PGM) DFTACTGRP(*NO) BNDDIR(TETLIB/TETLIB) 42 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング RPG のエ ラ ー処理 ILE-RPG で書かれ た TET ク ラ イ ア ン ト は、 ILE-RPG が提供す る monitor/on-error/endmon エ ラ ー処理機構を利用す る こ と がで き ます。 例外を見張 る も う 一つの方法は、ILE-RPG 内の *PSSR グ ロ ーバルエ ラ ー処理サブルーチン を用い る こ と です。 例外が発生 し た際には、 ジ ョ ブ ロ グは、 エ ラ ー番号、 失敗 し た関数、 例外の理由を示 し ま す。 TET は、 呼び出 し 側プ ロ グ ラ ムへエ ス ケープ メ ッ セージ を送 り ます。 c * c * c c : : * c * * c c eval p=TET_new monitor callp eval TET_set_option(tet:globaloptlist) doc=TET_open_document(tet:%ucs2(%trim(parm1)):docoptlist) Error Handling on-error Do something with this error don't forget to free the TET object callp TET_delete(tet) endmon 3.11 RPG バイ ンデ ィ ング 43 44 3 章 : TET ラ イ ブ ラ リ の言語バイ ンデ ィ ング 4 TET コ ネ ク タ TET コ ネ ク タ は、TET を他の ソ フ ト ウ ェ ア と イ ン タ フ ェースす る ために必要な グルー コ ー ド を提供 し ます。 TET コ ネ ク タ は、 TET ラ イ ブ ラ リ か TET コ マ ン ド ラ イ ン ツールをベー ス に し てい ます。 4.1 Adobe Acrobat 用無償 TET Plugin こ の節では、Adobe Acrobat での試験 と 、任意の PDF 文書 と の TET の対話的使用のために 利用で き る TET の無償入手可能なパ ッ ケージ ン グであ る TET Plugin を説明 し ます。 TET Plugin は、 Acrobat 7 ∼ 9 Standard ・ Pro ・ Pro Extended で動作 し ます ( し か し 無償の Adobe Reader では動作 し ません)。 こ れは下記の場所か ら 無償でダ ウ ン ロ ー ド で き ます : www.pdflib.com/products/tet-plugin TET Plugin と は TET Plugin は、 TET へのシ ンプルな対話的ア ク セ ス を提供 し ます。 TET Plugin は Acrobat のプ ラ グ イ ン と し て動作 し ますが、 背後の内容抽出機能は Acrobat の機 能を使わず、 完全に TET をベース と し てい ます。 TET Plugin は、 PDFlib TET のパ ワーを 演示す る 無償ツール と し て提供 さ れてい ます。 TET は Acrobat 内蔵のテ キ ス ト ・ 画像抽出 図 4.1 TET Plugin の設定画面 4.1 Adobe Acrobat 用無償 TET Plugin 45 ツール よ り も 強力で、 多 く の便利なユーザー イ ン タ フ ェ ース機能 も 提供 し てい ますので、 Acrobat 内蔵の コ ピー ・ 検索機能のかわ り と し て有用です。 テ キ ス ト を抽出 し よ う と し た と き に、 Acrobat な ら ただのゴ ミ し か返 さ ない よ う な場合で も 、 PDFlib TET な ら 多 く の文 書を う ま く 処理す る こ と がで き ます。 TET Plugin は以下の機能を提供 し てい ます : > PDF 文書内のテ キ ス ト を、 シ ス テ ムの ク リ ッ プボー ド かデ ィ ス ク フ ァ イ ルへプ レーン テ キ ス ト と し て複製。 改良 さ れた ク リ ッ プボー ド 制御に よ り 、 コ ピー / 貼 り 付けの利 用が実現 し てい ます。 > PDF を TETML に変換 し て、 それを ク リ ッ プボー ド かデ ィ ス ク フ ァ イ ルに入れます。 > XMP 文書 メ タ デー タ を ク リ ッ プボー ド かデ ィ ス ク フ ァ イ ルへ複製。 > 文書内の単語を検索。 > ページ上の検索文字列をすべて同時にハ イ ラ イ ト 。 > 文書内の画像を、 TIFF ・ JPEG ・ JPEG 2000 のいずれかの フ ァ イ ル と し て抽出。 > 画像の色空間 ・ 位置情報を表示。 > 必要に応 じ て テ キ ス ト ・ 画像抽出を調整す る ための詳細な設定が利用可能です。 設定 セ ッ ト は保存 し て再読込す る こ と も 可能です。 Acrobat の コ ピ ー機能に ま さ っ てい る点 TET Plugin は、 Acrobat 内蔵の コ ピー機能に対 し てい く つか ま さ っ てい る 点があ り ます : > 出力を、 さ ま ざ ま な アプ リ ケーシ ョ ンの要請に合わせて カ ス タ マ イ ズす る こ と がで き ます。 > Acrobat がゴ ミ だけ を ク リ ッ プボー ド へ複製す る 場合に も 、TET は多 く の場合において テ キ ス ト を正 し く 解釈す る こ と がで き ます。 > 未知のグ リ フ (正 し い Unicode マ ッ ピ ン グが確立で き ない も の) は赤色でハ イ ラ イ ト さ れ、 ユーザーが選んだキ ャ ラ ク タ ( ク エ ス チ ョ ン マー ク 等) で置 き 換え可能です。 > TET は文書を Acrobat よ り ずっ と 速 く 処理 し ます。 > 書 き 出す画像群を対話的に選ぶ こ と も で き ます し 、 ページ内ま たは文書内のすべての 画像を抽出す る こ と も で き ます。 > 微小な画像素片を結合 し て、 利用可能な画像に し ます。 46 4 章 : TET コ ネ ク タ 4.2 Lucene 検索エ ン ジ ン用 TET コ ネ ク タ Lucene はオープン ソ ース の検索エン ジ ンです。 Lucene は元来 Java プ ロ ジ ェ ク ト ですが、 C バージ ョ ン も 利用可能で、 .NET 用バージ ョ ン も 開発中です。 Lucene について詳 し く は lucene.apache.org を参照 し て く だ さ い。 注記 暗号化文書は、 特定の条件下では shrug オプ シ ョ ン で イ ンデ ッ ク スで き ます (詳 し く は、 59 ページの 5.1 「暗号化 PDF か ら内容を抽出」 を参照)。 こ れは Connector フ ァ イル群の 中で用意 さ れますが、 このオプ シ ョ ン を手作業で有効にする必要があ り ます。 要件 と イ ン ス ト ール TET デ ィ ス ト リ ビ ュ ーシ ョ ンは、Lucene Java で PDF イ ンデ ク シ ン グ を可能にす る ために利用で き る TET コ ネ ク タ を含んでい ます。 以下、 こ の Lucene Java 用 コ ネ ク タ について詳 し く 説明 し ます。 以下の要件が満た さ れてい る こ と が前提です : > JDK 1.4 以上。 > Ant ビル ド ツールが動作す る よ う イ ン ス ト ール さ れてい る 。 > Lucene コ ア JAR フ ァ イ ルを持つLuceneデ ィ ス ト リ ビ ュ ーシ ョ ン。TET と と も に配布 さ れ る Ant ビル ド フ ァ イ ルはフ ァ イ ル lucene-core-2.4.0.jar を前提 し てい ます。 こ の フ ァ イ ルは Lucene 2.4.0 デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれてい ます。 > Unix ・ Linux ・ Mac ・ Windows いずれか用の TET 配布パ ッ ケージが イ ン ス ト ール さ れてい る。 Lucene 用 TET コ ネ ク タ を実装す る には、 コ マ ン ド プ ロ ンプ ト で以下の操作を行い ます : > デ ィ レ ク ト リ <TET イ ン ス ト ールデ ィ レ ク ト リ >/connectors/lucene へ cd。 > フ ァ イ ル lucene-core-2.4.0.jar を こ のデ ィ レ ク ト リ へ複製。 > グ ロ ーバルな、あ る いは文書関連・ページ関連の TET オプシ ョ ン を TetReader.java に追 加す る こ と に よ っ て設定を カ ス タ マ イ ズす る こ と も で き ます。 た と えば、 グ ロ ーバル なオプシ ョ ン リ ス ト を用いて、 リ ソ ー スへの正 し い検索パ ス を与え る こ と が可能です (日中韓 CMap がデフ ォ ル ト イ ン ス ト ール と 異な る デ ィ レ ク ト リ に イ ン ス ト ール さ れて い る 場合等に)。 PdfDocument.java モジ ュ ールは、 デ ィ ス ク フ ァ イ ルか メ モ リ バ ッ フ ァ (Web ク ロ ー ラ に よ っ て与え ら れた等)に格納 さ れてい る PDF 文書を処理す る 方法を演示 し てい ます。 > コ マ ン ド ant index を実行。こ れは ソ ース コ ー ド を コ ンパ イ ル し 、<TET イ ン ス ト ールデ ィ レ ク ト リ >/bind/data デ ィ レ ク ト リ 内に含まれ る PDF フ ァ イ ル群に対 し て イ ンデ ク サ を走 ら せます。 > コ マ ン ド ラ イ ン検索を開始す る には、 コ マ ン ド ant search を実行 し ます。 こ こ では、 Lucene ク エ リ 言語で ク エ リ を入力で き ます。 TET と Lucene を コ マ ン ド ラ イ ン検索 ク ラ イ ア ン ト で テ ス ト 以下のサ ン プルセ ッ シ ョ ンは、 TET と Lucene で イ ンデ ク シ ン グ を行い、 生成 さ れた イ ンデ ッ ク ス を Lucene コ マ ン ド ラ イ ン ク エ リ ツールでテ ス ト す る 場合の コ マ ン ド と 出力を演示 し てい ます。 こ の操作は コ マ ン ド ant index を実行す る こ と か ら 始ま り ます : devserver (1)$ ant index Buildfile: build.xml ... index: [java] adding ../data/Whitepaper-XMP-metadata-in-PDFlib-products.pdf [java] adding ../data/Whitepaper-PDFA-with-PDFlib-products.pdf [java] adding ../data/FontReporter.pdf [java] adding ../data/TET-PDF-IFilter-datasheet.pdf 4.2 Lucene 検索エ ン ジ ン用 TET コ ネ ク タ 47 [java] adding ../data/PDFlib-datasheet.pdf [java] 1255 total milliseconds BUILD SUCCESSFUL Total time: 2 seconds devserver (1)$ ant search Buildfile: build.xml compile: search: [java] Enter query: PDFlib [java] Searching for: pdflib [java] 5 total matching documents [java] 1. ../data/PDFlib-datasheet.pdf [java] Title: PDFlib, PDFlib+PDI, Personalization Server Datasheet [java] 2. ../data/Whitepaper-PDFA-with-PDFlib-products.pdf [java] Title: Whitepaper: Creating PDF/A with PDFlib [java] 3. ../data/FontReporter.pdf [java] Title: PDFlib FontReporter 1.3 Manual [java] 4. ../data/TET-PDF-IFilter-datasheet.pdf [java] Title: PDFlib TET PDF IFilter Datasheet [java] 5. ../data/Whitepaper-XMP-metadata-in-PDFlib-products.pdf [java] Title: Whitepaper: XMP Metadata support in PDFlib Products [java] Press (q)uit or enter number to jump to a page. q [java] Enter query: title:FontReporter [java] Searching for: title:fontreporter [java] 1 total matching documents [java] 1. ../data/FontReporter.pdf [java] Title: PDFlib FontReporter 1.3 Manual [java] Press (q)uit or enter number to jump to a page. q [java] Enter query: BUILD SUCCESSFUL Total time: 57 seconds 2 つの ク エ リ が実行 さ れてい ます : 1 つはテ キ ス ト 内の単語 PDFlib に対 し て、 も う 1 つは title フ ィ ール ド 内の単語 FontReporter に対 し てです。結果ページ ン グモー ド を抜けて次の ク エ リ を始め ら れ る よ う にす る 前には q を入力す る 必要があ る 点に留意 し て く だ さ い。 Ant build.xml フ ァ イ ル内のパ ス と フ ァ イ ル名はすべて、 プ ロ パテ ィ を通 じ て定義 さ れ てい ます。 こ れは、 こ の フ ァ イ ルを さ ま ざ ま な環境で使え る よ う にす る ためです。 すなわ ち、 プ ロ パテ ィ 群を コ マ ン ド ラ イ ン で与え る こ と も で き ま す し 、 上書 き さ せたいプ ロ パ テ ィ 群を フ ァ イ ル build.properties 内に、 あ る いはプ ラ ッ ト フ ォーム個別のプ ロ パテ ィ を フ ァ イ ル windows.properties か unix.properties 内に記入す る こ と も で き ます。 た と えば、 Ant を下記の よ う に呼び出せば、 /tmp 下に イ ン ス ト ール さ れてい る Lucene JAR フ ァ イ ル でサンプルを実行す る こ と がで き ます : ant -Dlucene.jar=/tmp/lucene-core-2.4.0.jar index 48 4 章 : TET コ ネ ク タ TET と Lucene を デモ Web ア プ リ ケーシ ョ ン で テ ス ト Lucene デモ Web アプ リ ケーシ ョ ンは、Tomcat や GlassFish をは じ め と す る 任意の Java サーブ レ ッ ト コ ン テナ上に展開す る こ と がで き ます。 必要な操作は、 Lucene に付いて来 る HTML 文書で説明 さ れてい ます。 オン ラ イ ンで lucene.apache.org/java/2_4_0/demo3.html で も 得 ら れます。 そのページの ス テ ッ プ Configuration に留意 し て く だ さ い。 こ こ で イ ンデ ッ ク ス の場所 を Web アプ リ ケーシ ョ ンに知 ら せ る ために、それを フ ァ イ ル configuration.jsp に記入す る 必要があ り ます。 こ こ で追加す る パ ス は、 Ant が Lucene イ ンデ ッ ク ス の場所に関す る プ ロ パテ ィ を上書 き せずに動作 さ せ ら れてい る 場合は <TET イ ン ス ト ールデ ィ レ ク ト リ >/ bind/lucene/index と な る で し ょ う 。 メ タ デー タ フ ィ ール ド を イ ン デ ッ ク ス Lucene 用 TET コ ネ ク タ は以下の メ タ デー タ フ ィ ール ド を イ ンデ ッ ク ス し ます : > path ( ト ー ク ン化フ ィ ール ド ) : 文書のパ ス名 > modified (DateField) : 最終更新日 > contents (Reader フ ィ ール ド ) : 文書の全テ キ ス ト 内容 > Title ・ Subject ・ Author 等、 定義済み ・ カ ス タ ムの PDF 文書情報項目すべて。 文書情報項 目は、 TET に内蔵 さ れてい る pCOS イ ン タ フ ェ ース で取得す る こ と がで き ます (pCOS について詳 し く は pCOS リ フ ァ レ ン ス を参照 し て く だ さ い)。 た と えば String objType = tet.pcos_get_string(tetHandle, "type:/Info/Subject"); if (!objType.equals("null")) { doc.add(new Field("summary", tet.pcos_get_string(tetHandle, "/Info/Subject"), Field.Store.YES, Field.Index.ANALYZED)); } > font : PDF 文書内のすべての フ ォ ン ト の名前 PdfDocument.java 内で、 イ ンデ ッ ク スす る 文書情報項目のセ ッ ト を変更、 あ る いは pCOS に基づいて情報を追加す る こ と に よ っ て、 メ タ デー タ フ ィ ール ド を カ ス タ マ イ ズす る こ と も 可能です。 PDF フ ァ イル添付 Lucene 用 TET コ ネ ク タ は、 文書内のすべての PDF フ ァ イ ル添付を 再帰的に処理 し 、 各添付のテ キ ス ト と メ タ デー タ を イ ンデ ッ ク ス で き る よ う Lucene 検索 エン ジ ンに与え ます。 こ れに よ っ て、 検索テ キ ス ト が メ イ ン文書内にな く 添付内にあ る と き で も 、 検索 ヒ ッ ト が生成 さ れます。 再帰的添付横断は と り わけ、 PDF パ ッ ケージ ・ ポー ト フ ォ リ オに対 し て重要です。 4.2 Lucene 検索エ ン ジ ン用 TET コ ネ ク タ 49 4.3 Solr 検索サーバ用 TET コ ネ ク タ Solr は高パフ ォーマ ン ス なオープン ソ ース のエン タ プ ラ イ ズ検索サーバで、Lucene 検索 ラ イ ブ ラ リ をベース と し てい ます。 XML/HTTP ・ JSON/Python/Ruby API を有 し 、 ヒ ッ ト ハ イ ラ イ ト ・ フ ァ セ ッ ト 検索 ・ キ ャ ッ シ ュ 化 ・ レ プ リ ケーシ ョ ン ・ Web 管理 イ ン タ フ ェース を そなえ てい ます。 Java サーブ レ ッ ト コ ン テナ内で動作 し ます (lucene.apache.org/solr を 参照)。 Solr は Lucene コ アエン ジ ン を取 り 巻 く 追加レ イ ヤ と し てふ る ま い ます。 イ ンデ ッ ク ス さ れたデー タ を シ ンプルな XML 形式で受け付け ます。Solr 入力は TETML をベース に非常 に簡単に生成で き ます。 TETML は TET が生成する 一種の XML です。 Solr 用 TET コ ネ ク タ は、TETML を Solr が受け付け る XML 形式へ変換す る XSLT ス タ イ ルシー ト か ら 成 り ま す。 こ の ス タ イ ルシー ト のための TETML 入力は、TET ラ イ ブ ラ リ か TET コ マ ン ド ラ イ ン ツールで生成で き ます (123 ページの 9.1 「TETML を生成」 を参照)。 注記 暗号化文書は、 特定の条件下では shrug オプ シ ョ ン で イ ンデ ッ ク スで き ます (詳 し く は、 59 ページの 5.1 「暗号化 PDF か ら内容を抽出」 を参照)。 暗号化文書を イ ンデ ッ ク スする には、 Solr のための TETML 入力を生成する際に、 TET ラ イ ブ ラ リ か TET コ マ ン ド ラ イ ン ツールで このオプ シ ョ ン を有効にする必要があ り ます。 メ タ デー タ フ ィ ール ド を イ ン デ ッ ク ス Solr 用 TET コ ネ ク タ は、 すべての標準文書情報 フ ィ ール ド を イ ンデ ッ ク ス し ます。各フ ィ ール ド のキーが フ ィ ール ド 名 と し て用い ら れま す。 PDF フ ァ イル添付 Solr 用 TET コ ネ ク タ は、 文書内のすべての PDF フ ァ イ ル添付を再帰 的に処理 し 、各添付のテ キ ス ト と メ タ デー タ を イ ンデ ッ ク ス で き る よ う 検索エン ジ ンに与 え ます。 こ れに よ っ て、 検索テ キ ス ト が メ イ ン文書内にな く 添付内にあ る と き で も 、 検索 ヒ ッ ト が生成 さ れます。 再帰的添付横断は と り わけ、 PDF パ ッ ケージ ・ ポー ト フ ォ リ オに 対 し て重要です。 TETML を変換す る ための XSLT ス タ イルシー ト solr.xsl ス タ イ ルシー ト は、 glyph 以外 の任意のモー ド の TETML 入力を受け付け ます。 こ れは、 検索サーバに入力デー タ を与え る ために必要な XML を生成 し ます。 文書情報項目群は、 その情報項目の名前 (に文字列 値であ る こ と を示す _s 接尾辞をつけた も の) を保持 し た フ ィ ール ド と し て与え ら れ、 メ イ ン テ キ ス ト は多数のテ キ ス ト フ ィ ール ド で与え ら れます。文書内の PDF 添付 (PDF パ ッ ケージ ・ ポー ト フ ォ リ オを含む) は再帰的に処理 さ れます : <?xml version="1.0" encoding="UTF-8"?> <add> <doc> <field name="id">PDFlib-FontReporter-E.pdf</field> <field name="Author_s">PDFlib GmbH</field> <field name="CreationDate_s">2008-07-08T15:05:39+00:00</field> <field name="Creator_s">FrameMaker 7.0</field> <field name="ModDate_s">2008-07-08T15:05:39+00:00</field> <field name="Producer_s">Acrobat Distiller 7.0.5 (Windows)</field> <field name="Subject_s">PDFlib FontReporter</field> <field name="Title_s">PDFlib FontReporter 1.3 Manual</field> <field name="text">PDFlib</field> <field name="text">GmbH</field> <field name="text">Munchen</field> ... 50 4 章 : TET コ ネ ク タ 4.4 Oracle 用 TET コ ネ ク タ Oracle 用 TET コ ネ ク タ は、 TET を Oracle デー タ ベース に結合 し て、 PDF 文書を Oracle Text で イ ンデ ッ ク ス し ク エ リ で き る よ う に し ます。 PDF 文書は、 デー タ ベース内のその パ ス名を通 じ て参照す る こ と も で き ます し 、デー タ ベース内に BLOB と し て直接格納す る こ と も で き ます。 注記 暗号化文書は、 特定の条件下では shrug オプ シ ョ ン で イ ンデ ッ ク スで き ます (詳 し く は、 59 ページの 5.1 「暗号化 PDF か ら内容を抽出」 を参照)。 こ れは Connector フ ァ イル群の 中で用意 さ れますが、 このオプ シ ョ ン を手作業で有効にする必要があ り ます。 要件 と イ ン ス ト ール TET コ ネ ク タ は Oracle 10i と Oracle 11g でテ ス ト さ れてい ます。 TET コ ネ ク タ を利用す る ためには、 デー タ ベース を作成す る 際に AL32UTF8 デー タ ベース 文字集合を指定す る 必要があ り ます。 こ れは、 Oracle Express の Universal 版ではつねにそ う な り ます ( し か し Western European 版では異な り ます)。 AL32UTF8 は Oracle が推奨 し てい る デー タ ベース文字集合であ り 、 TET で PDF 文書を イ ンデ ッ ク スす る 場合に も 最良 の動作を し ます。 ただ し 、 以下の方式のいずれかに従えば、 他の文字集合で TET を Oracle Text に接続す る こ と も 可能です : > Oracle Text 11.1.0.7 か ら は、必要な文字集合変換をデー タ ベース が行え ます。下記にあ る Oracle Text 11.1.0.7 文書の 「Using USER_FILTER with Charset and Format Columns」 節を参照 し て く だ さ い : download.oracle.com/docs/cd/B28359_01/text.111/b28304/cdatadic.htm#sthref497 > Oracle Text 11.1.0.6 ま では、TET フ ィ ル タ ス ク リ プ ト が生成す る UTF-8 テ キ ス ト をデー タ ベー ス 文字集合へ変換す る 必要が あ り ま す。 こ れは、 文字集合変換 コ マ ン ド を tetfilter.sh に追加す る こ と に よ っ て実現で き ます : Unix : iconv (オープン ソ ース ソ フ ト ウ ェ ア) か uconv (無償の ICU Unicode ラ イ ブ ラ リ に含まれてい ます) を呼び出 し ます。 Windows : tetfilter.bat 内の適切な コ ー ド ページ コ ンバー タ を呼び出 し ます。 Oracle 用 TET コ ネ ク タ を活用で き る よ う にす る には、 以下の よ う に し て TET フ ィ ル タ ス ク リ プ ト を Oracle か ら 利用可能にす る 必要があ り ます : > TET フ ィ ル タ ス ク リ プ ト を、 Oracle がそれを見つけ る こ と がで き る デ ィ レ ク ト リ へ複 製: Unix : connectors/Oracle/tetfilter.sh を $ORACLE_HOME/ctx/bin へ複製 Windows : connectors/Oracle/tetfilter.bat を %ORACLE_HOME%\bin へ複製 > TET フ ィ ル タ ス ク リ プ ト (それぞれ tetfilter.sh・tetfilter.bat)内の TETDIR 変数が必ず TET イ ン ス ト レーシ ョ ンデ ィ レ ク ト を指 し てい る よ う に し ます。 > 必要に応 じ て、 追加の TET オプシ ョ ン群を、 グ ロ ーバル ・ 文書レベル ・ ページ レベル のいずれかについて TETOPT ・ DOCOPT ・ PAGEOPT 変数内で与え る こ と も で き ます (オプシ ョ ン リ ス ト について詳 し く は、143 ページの 11 章 「TET ラ イ ブ ラ リ API リ フ ァ レ ン ス」 を参照)。 こ れは特に TET ラ イ セ ン ス キーを与え る ために有用です。 例 : TETOPT="license=aaaaaaa-bbbbbb-cccccc-dddddd-eeeeee" TET ラ イ セ ン ス キーを与え る ための他の選択肢については 9 ページの 0.2「TET ラ イ セ ン ス キーを適用」 を参照 し て く だ さ い。 Oracle ユーザーに権限 を付与 以下の例はいずれ も 、 Oracle ユーザーが イ ンデ ッ ク ス を 作成 し ク エ リ す る 適切な権限を持っ てい る こ と を前提 と し てい ま す。 以下の コ マ ン ド 群 4.4 Oracle 用 TET コ ネ ク タ 51 は、 ユーザー HR に適切な権限群を付与 し ます ( こ れ ら の コ マ ン ド は、 system と し て発行 す る 必要があ り 、 かつ適切に調整す る 必要があ り ます) : SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> GRANT GRANT GRANT GRANT GRANT GRANT GRANT GRANT CTXAPP TO HR; EXECUTE ON CTX_CLS TO HR; EXECUTE ON CTX_DDL TO HR; EXECUTE ON CTX_DOC TO HR; EXECUTE ON CTX_OUTPUT TO HR; EXECUTE ON CTX_QUERY TO HR; EXECUTE ON CTX_REPORT TO HR; EXECUTE ON CTX_THES TO HR; 例 A : PDF 文書のパス名 を デー タ ベースに格納 こ の例は、 イ ンデ ッ ク ス さ れた PDF 文 書群への フ ァ イ ル名参照をデー タ ベース内に格納 し ます。 以下の よ う に操作 し ます : > コ マ ン ド プ ロ ンプ ト で下記のデ ィ レ ク ト リ へ移動 : <TET インストレーションディレクトリ >/connectors/Oracle > tetsetup_a.sql ス ク リ プ ト 内の tetpath 変数を、TET が イ ン ス ト ール さ れてい る デ ィ レ ク ト リ を指す よ う に変え ます。 > デー タ ベース を用意:Oracle の sqlplus プ ロ グ ラ ム を使っ て、テーブル pdftable_a を作成 し 、 こ のテーブルに PDF 文書群のパ ス名を記入 し 、 イ ンデ ッ ク ス tetindex_a を作成 し ます (なお、 tetsetup_a.sql ス ク リ プ ト の内容は若干プ ラ ッ ト フ ォーム依存です。 パ ス 文法が異な る ためです) : SQL> @tetsetup_a.sql > デー タ ベース を、 イ ンデ ッ ク ス を用いて ク エ リ : SQL> select * from pdftable_a where CONTAINS(pdffile, 'Whitepaper', 1) > 0; > イ ンデ ッ ク ス を更新 (文書を追加 し た後に必要です) : SQL> execute ctx_ddl.sync_index('tetindex_a') > デー タ ベー ス を ク リ ーン ア ッ プ ( イ ンデ ッ ク ス と テーブルを削除) す る こ と も で き ま す: SQL> @tetcleanup_a.sql 例 B : PDF 文書 を BLOB と し てデー タ ベース に格納 し て メ タ デー タ を追加 こ の 例 は、 PDF 文書本体を BLOB と し てデー タ ベース に格納 し ます。 PDF デー タ に加え て、 い く つ かの メ タ デー タ を pCOS イ ン タ フ ェ ー ス で抽出 し 、 それ用のデー タ ベース列に格納 し ま す。 tet_pdf_loader Java プ ロ グ ラ ムは、 PDF 文書群を BLOB と し てデー タ ベース に格納 し ます。 メ タ デー タ 処理を演示す る ため、 こ のプ ロ グ ラ ムは、 pCOS イ ン タ フ ェース を用い て、 文書 タ イ ト ル (pCOS パ ス /Info/Title を通 じ て) と 文書内のページ数 (pCOS パ ス length:pages を通 じ て) を抽出 し ます。 こ の文書 タ イ ト ル と ページ数はデー タ ベース内の 別 コ ラ ムに格納 さ れます。 こ の例を動作 さ せる には以下の よ う に操作 し ます : > コ マ ン ド プ ロ ンプ ト で下記のデ ィ レ ク ト リ へ移動 : <TET インストレーションディレクトリ >/connectors/Oracle > デー タ ベース を用意:Oracle の sqlplus プ ロ グ ラ ム を使っ て、テーブル pdftable_b と その イ ンデ ッ ク ス tetindex_b を作成 し ます : 52 4 章 : TET コ ネ ク タ SQL> @tetsetup_b.sql > デー タ ベース に内容を入れます: こ のテーブルに、JDBC を通 じ て PDF 文書 と メ タ デー タ を入れます ( こ れは ス ト ア ド プ ロ シージ ャ ではで き ない点に留意)。 TET パ ッ ケージ と と も に供給 さ れ て い る ant ビ ル ド フ ァ イ ル は、 Oracle JDBC ド ラ イ バ に対す る ojdbc14.jar フ ァ イ ルが tet_pdf_loader.java ソ ース コ ー ド と 同 じ デ ィ レ ク ト リ にあ る と 前 提 し てい ます。適切な JDBC 接続文字列を ant コ マ ン ド で指定 し ます。 こ のビル ド フ ァ イ ルは、すべてのプ ロ パテ ィ の記述を含んでお り 、こ れを用いて Ant ビル ド のオプシ ョ ン群を指定す る こ と がで き ます。 こ れ ら のオプシ ョ ン に対す る 値を コ マ ン ド ラ イ ン で 与え る こ と がで き ます。 下記の例では、 ホ ス ト 名 と し て localhost、 ポー ト 番号 1521、 デー タ ベース名 と し て xe、 ユーザー名 ・ パス ワ ー ド と し て HR を用いてい ます (自分 のデー タ ベース設定に合わせて適切に変えて く だ さ い) : ant -Dtet.jdbc.connection=jdbc:oracle:thin:@localhost:1521:xe -Dtet.jdbc.user=HR -Dtet.jdbc.password=HR > イ ンデ ッ ク ス を更新 (最初 と 、 文書を追加 し た後に必要です) : SQL> execute ctx_ddl.sync_index('tetindex_b') > デー タ ベース を、 イ ンデ ッ ク ス を用いて ク エ リ : SQL> select * from pdftable_b where CONTAINS(pdffile, 'Whitepaper', 1) > 0; > デー タ ベース を ク リ ーン ア ッ プ ( イ ンデ ッ ク ス と テーブルを削除) す る こ と も で き ま す: SQL> @tetcleanup_b.sql 4.4 Oracle 用 TET コ ネ ク タ 53 4.5 Microsoft 製品用 TET PDF IFilter こ の節では、 PDFlib TET をベース と し て構築 さ れた別製品であ る TET PDF IFilter を説明 し ます。 TET PDF IFilter の詳 し い情報 と 配布パ ッ ケージは www.pdflib.com/products/tetpdf-ifilter で入手可能です。 TET PDF IFilter は、 非商用デス ク ト ッ プ用途については無償で利用可能です。 デス ク ト ッ プシ ス テ ム上での商用利用 と サーバ上での展開には商用 ラ イ セ ン ス が必要です。 PDFlib TET PDF IFilter と は TET PDF IFilter は、 PDF 文書か ら テ キ ス ト と メ タ デー タ を 抽出 し 、 それを Windows 上の検索 ソ フ ト ウ ェ アで利用可能に し ます。 こ れに よ っ て、 PDF 文書を ロ ーカルデス ク ト ッ プや企業サーバ、 あ る いは Web で検索す る こ と が可能にな り ます。 TET PDF IFilter は、 特許を受けた PDFlib Text Extraction Toolkit (TET) をベース と し てい ます。 TET は、 PDF 文書か ら 確実にテ キ ス ト を抽出す る ための定評あ る 開発者向 け製品です。 TET PDF IFilter は、 Microsoft の IFilter イ ンデ ク シ ン グ イ ン タ フ ェース の堅牢な実装で す。 こ れは SharePoint や SQL Server 等、 IFilter イ ン タ フ ェース に対応 し てい る すべての検 索製品 と と も に動作 し ます。 そ う し た製品は HTML 等、 特定の フ ァ イ ル形式に対す る 形 式個別の フ ィ ル タ プ ロ グ ラ ム を用いてお り 、 こ の フ ィ ル タ プ ロ グ ラ ム を IFilter と 呼びま す。 TET PDF IFilter はその よ う なプ ロ グ ラ ムの一つで、 PDF 文書に特化 し た も のです。 文 書を検索す る ための イ ン タ フ ェース は、Windows Explorer や Web やデー タ ベース の フ ロ ン ト エン ド であ っ て も よ いです し 、 ク エ リ ス ク リ プ ト やカ ス タ ム アプ リ ケーシ ョ ン と す る こ と も で き ます。 対話的検索だけでな く 、 ユーザー イ ン タ フ ェース一切な し で ク エ リ を プ ロ グ ラ ム的に発す る こ と も で き ます。 特長 TET PDF IFilter は以下の利点を提供 し ます : > 欧文テ キ ス ト 、 日本語 ・ 中国語 ・ 韓国語 (日中韓) テ キ ス ト 、 ア ラ ビ ア文字 ・ ヘブ ラ イ 文字等の右書 き 言語に対応 > 暗号化文書を イ ンデ ッ ク ス し 、 ま た、 Acrobat が失敗す る PDF か ら も テ キ ス ト を抽出 > Unicode 字形統合 ・ 分解 ・ 正規化に対応 > 展開 : ス レ ッ ド セーフ、 高速 ・ 堅牢、 32 ・ 64 ビ ッ ト 版 > 自動用字系 ・ 言語検出に よ る 検索向上 エ ン タ プ ラ イ ズ PDF 検索 TET PDF IFilter は、 完全に ス レ ッ ド セーフ なネ イ テ ィ ブ 32 ・ 64 ビ ッ ト 版 と し て利用可能です。 TET PDF IFilter と 以下の製品を用いて、 エン タ プ ラ イ ズ PDF 検索 ソ リ ュ ーシ ョ ン を実装で き ます : > Microsoft SharePoint Server > Microsoft Search Server > Microsoft SQL Server > Microsoft Exchange Server > Microsoft Site Server TET PDF IFilter は、 IFilter イ ン タ フ ェ ース に対応 し てい る 他のすべての Microsoft ・ サー ド パーテ ィ 製品 と と も に利用で き ます。 デス ク ト ッ プ PDF 検索 TET PDF IFilter を利用す る と 、 た と えば以下の よ う な製品 と と も に、 デス ク ト ッ プ PDF 検索を実装す る こ と も 可能です : > Windows Search : Windows Vista/7 に内蔵 さ れてい ます。 Windows XP 用の無償ア ド オン と し て も 利用可能です。 54 4 章 : TET コ ネ ク タ > Windows Indexing Service TET PDF IFilter は、デス ク ト ッ プオペレーテ ィ ン グ シ ス テ ム上での非商用利用については 無償ですので、 気軽にテ ス ト や評価を行 う こ と がで き ます。 受け入れ可能な PDF 入力 TET PDF IFilter は、あ ら ゆ る 種類の PDF 入力に対応 し てい ま す: > Acrobat 9 ま でのすべての PDF バージ ョ ン (ISO 32000-1 も 含め) > 文書を開 く パス ワー ド を必要 と し ない暗号化 PDF > 破損 し た PDF 文書は修復 さ れます。 Unicode 後処理 TET PDF IFilter は さ ま ざ ま な Unicode 後処理に対応 し てお り 、 こ れを利 用 し て検索結果を向上 さ せ る こ と がで き ます : > 字形統合 : キ ャ ラ ク タ に対 し て温存 ・ 除去 ・ 置換のいずれか を行い ま す。 た と えば句 読点や、 無関係な用字系のキ ャ ラ ク タ を除去す る こ と がで き ます。 > 分解 : 一つのキ ャ ラ ク タ を、 等価な他のキ ャ ラ ク タ ない し キ ャ ラ ク タ 列へ置 き 換え ま す。 た と えば漢字を、 それ と 正準等価な Unicode キ ャ ラ ク タ へ置 き 換え る こ と がで き ます。 > テ キ ス ト を、4 種類の Unicode 正規形のいずれへ も 変換で き ます。た と えば、デー タ ベー ス の要請に合 う よ う NFC 形式を出力する こ と がで き ます。 国際化 欧文テ キ ス ト に加えて、 TET PDF IFilter は日本語 ・ 中国語 ・ 韓国語 (日中韓) テ キ ス ト に完全対応 し てい ま す。 すべての日中韓エ ン コ ーデ ィ ン グ が認識 さ れ ま す。 横書 き ・ 縦書 き に対応 し てい ます。 テ キ ス ト の ロ ケール ID (言語 ・ 地域識別子) の自動検出 が、 Microsoft の単語区切 り ・ 語幹処理アルゴ リ ズ ムの結果を向上 さ せ、 こ の こ と は と り わ け東ア ジア テ キ ス ト について重要です。 ヘブ ラ イ 文字 ・ ア ラ ビ ア文字 と い っ た右書 き 言語に も 対応 し てい ます。 位置依存表示 形は正規化 さ れ、 テ キ ス ト は論理順に発出 さ れます。 PDF は単な る ページの寄せ集めではない TET PDF IFilter は PDF 文書を、単な る ページ 群だけの他に も 多 く の情報を含む可能性のあ る コ ン テナ と し て扱い ます。 TET PDF IFilter は PDF 文書内の関連す る 項目をすべて イ ンデ ッ ク ス し ます : > ページ内容 > し お り 内のテ キ ス ト > メ タ デー タ (後述) > 埋め込まれた PDF と PDF パ ッ ケージ / ポー ト フ ォ リ オは、埋め込まれてい る すべての PDF 文書内のテ キ ス ト が検索で き る よ う 、 再帰的に処理 さ れます。 XMP メ タ デー タ と 文書情報 TET PDF IFilter の高度な メ タ デー タ 実装は、 Windows の メ タ デー タ のためのプ ロ パテ ィ シ ス テ ムに対応 し てい ます。 こ れは XMP メ タ デー タ と 、 標 準 ・ カ ス タ ム文書情報項目を イ ンデ ッ ク ス し ます。 メ タ デー タ イ ンデ ク シ ン グはい く つか の レベルで設定で き ます : > 文書情報項目群 と Dublin Core フ ィ ール ド 群、お よ びその他の広 く 用い ら れ る XMP プ ロ パテ ィ 群は、同等の Windows プ ロ パテ ィ へマ ッ プ さ れます。例 : Title ・ Subject ・ Author。 > TET PDF IFilter は、有用な PDF 独自の擬似プ ロ パテ ィ 群を追加 し ます。例:ページサ イ ズ ・ PDF/A 準拠レベル ・ フ ォ ン ト 名。 > すべての定義済み XMP プ ロ パテ ィ 群を検索で き ます。 4.5 Microsoft 製品用 TET PDF IFilter 55 > ユーザー定義 XMP プ ロ パテ ィ 群を検索で き ます。例:企業独自の分類プ ロ パテ ィ 、PDF/ A 拡張ス キーマ。 TET PDF IFilter は、 メ タ デー タ を全文テ キ ス ト イ ンデ ッ ク ス内に統合す る こ と も で き ま す。 結果 と し て、 メ タ デー タ 対応を持たない全文テ キ ス ト 検索エン ジ ン (SQL Server 等) であ っ て も 、 メ タ デー タ の検索が可能にな り ます。 56 4 章 : TET コ ネ ク タ 4.6 MediaWiki 用 TET コ ネ ク タ MediaWiki は無償の ウ ィ キ ソ フ ト ウ ェ アであ り 、 Wikipedia をは じ め と す る 多 く の コ ミ ュ ニ テ ィ Web サ イ ト を動作 さ せ る ために利用 さ れてい ます。 MediaWiki に関す る 詳 し い情報は 下記にあ り ます : www.mediawiki.org/wiki/MediaWiki 注記 暗号化文書は、 特定の条件下では shrug オプ シ ョ ン で イ ンデ ッ ク スで き ます (詳 し く は、 59 ページの 5.1 「暗号化 PDF か ら内容を抽出」 を参照)。 こ れは Connector フ ァ イル群の 中で用意 さ れますが、 このオプ シ ョ ン を手作業で有効にする必要があ り ます。 要件 と イ ン ス ト ール TET デ ィ ス ト リ ビ ュ ーシ ョ ンは、 MediaWiki サ イ ト へア ッ プ ロ ー ド さ れ る PDF 文書を イ ンデ ッ ク スす る ために利用で き る TET コ ネ ク タ を含んでい ま す。 MediaWiki はネ イ テ ィ ブに PDF 文書に対応は し てい ませんが、 PDF を 「画像」 と し てア ッ プ ロ ー ド すれば受け付け ます。 MediaWiki 用 TET コ ネ ク タ は、 すべての PDF 文書を、 そ れがア ッ プ ロ ー ド さ れ る 際に イ ンデ ッ ク ス し ます。MediaWiki内にすでに存在 し てい る PDF 文書は イ ンデ ッ ク ス さ れません。 以下の必要条件を満た し てい る 必要があ り ます : > PHP 5.0 以上 > MediaWiki 1.11.2 以上 ( こ れ以外のバージ ョ ンについては後述) > Unix ・ Linux ・ Mac ・ Windows のいずれか用の TET 配布パ ッ ケージ MediaWiki 用 TET コ ネ ク タ を実装す る には以下の操作を行い ます : > PHP 用 TET バ イ ンデ ィ ン グ を、38 ページの 3.8 「PHP バ イ ンデ ィ ン グ」 の説明の よ う に イ ン ス ト ール。 > <TET イ ン ス ト ールデ ィ レ ク ト リ >/connectors/MediaWiki/PDFIndexer.php を <MediaWiki イ ン ス ト ールデ ィ レ ク ト リ >/extensions/PDFIndexer/PDFIndexer.php へ複製。 > 日中韓テ キ ス ト への対応が必要な場合は、 <TET イ ン ス ト ールデ ィ レ ク ト リ >/resource/ cmap 内の CMap フ ァ イ ル群を <MediaWiki イ ン ス ト ールデ ィ レ ク ト リ >/extensions/ PDFIndexer/resource/cmap へ複製。 > MediaWiki 設定フ ァ イ ル LocalSettings.php に以下の行群を追加 : # アップロードされる PDF をインデックスして検索可能にします include("extensions/PDFIndexer/PDFIndexer.php"); > PDF 文書を ア ッ プ ロ ー ド す る 際に警告が出ない よ う にす る には、 <MediaWiki イ ン ス ト ールデ ィ レ ク ト リ >/includes/DefaultSettings.php に以下の行群を追加 し て .pdf を既 知の フ ァ イ ル種別拡張子にす る こ と を推奨 し ます : /** * これはアップロードするファイルの好ましい拡張子のリストです。このリストにない拡張子 * を持つファイルをアップロードすると警告が発生します。 */ $wgFileExtensions = array( 'png', 'gif', 'jpg', 'jpeg', 'pdf' ); MediaWiki 用 TET コ ネ ク タ はどの よ う に動作す るか MediaWiki 用 TET コ ネ ク タ は、PHP モジ ュ ール PDFIndexer.php か ら 成 り ます。 こ れは MediaWiki の定義済みフ ッ ク の一つを用 いて、 新規 PDF 文書がア ッ プ ロ ー ド さ れ る 際にいつ も 呼び出 さ れ る よ う フ ッ ク ア ッ プ さ れます。 こ れは PDF 文書か ら テ キ ス ト と メ タ デー タ を抽出 し て、 それを、 ア ッ プ ロ ー ド さ れ る 文書にオプシ ョ ナルに付属す る 、 ユーザーが与え る コ メ ン ト の後に追加 し ます。 こ のテ キ ス ト は、 ユーザーが文書 コ メ ン ト を表示す る 際に表示 さ れない よ う 、 HTML コ メ ン 4.6 MediaWiki 用 TET コ ネ ク タ 57 図 4.2 MediaWiki 内で PDF 文書を検索 ト 内に隠 さ れてい ます。 MediaWiki は コ メ ン ト の内容全文を イ ンデ ッ ク ス し ます (隠 さ れ てい る 全文テ キ ス ト も 含めて) ので、 PDF のテ キ ス ト 内容 も イ ンデ ッ ク ス さ れます。 イ ン デ ッ ク ス用テ キ ス ト は以下の よ う に構築 さ れます : > TET コ ネ ク タ は、 すべての文書情報フ ィ ール ド の値を イ ンデ ッ ク スへ与え ます。 > すべてのページのテ キ ス ト 内容が抽出 さ れて結合 さ れます。 > 抽出 さ れた テ キ ス ト のサ イ ズが制限未満であれば、 それは ま る ご と イ ンデ ッ ク スへ与 え ら れます。 こ の方式の利点は、 検索結果が検索語を文脈の中で表示す る 点です。 > 抽出 さ れた テ キ ス ト のサ イ ズが制限を超え てい る 場合は、 テ キ ス ト はユニー ク な単語 群へ減量 さ れ ます (すなわち、 同一の単語が複数回出現 し てい る も のについて、 その 単語を 1 回だけに減量 さ れます)。 > 減量 し たテ キ ス ト のサ イ ズが制限未満であれば、 それは イ ンデ ッ ク スへ与え ら れます。 そ う でない場合には、 それは切 り 落 と さ れ ます。 すなわち、 その文書の終わ り のほ う のテ キ ス ト は イ ンデ ッ ク ス さ れな く な り ます。 定義済みの制限は 512 KB ですが、 こ れは PDFIndexer.php 内で変更す る こ と も で き ます。 上記のサ イ ズテ ス ト の一つが制限に触れた場合には、 MediaWiki の ロ グ記録が有効に さ れ てい る な ら ば、 警告 メ ッ セージが MediaWiki の DebugLogFile へ書き 込まれます。 PDF 文書 を検索 PDF 文書は MediaWiki に よ っ て画像 と し て扱われますので、Image 名前 空間内を検索す る 必要があ り ます。 こ れは、 Advanced search ダ イ ア ロ グ (図 4.2 参照) の 名前空間の一覧にあ る Image チ ェ ッ ク ボ ッ ク ス を オンにす る こ と で実現で き ます。 ただ し 、 こ の設定は LocalSettings.php 設定フ ァ イ ル内で以下の よ う に有効にす る こ と も 可能で す: $wgNamespacesToBeSearchedDefault = array( NS_MAIN => true, NS_IMAGE => true, } 検索結果は、 検索語を含む文書の一覧を表示 し ます。 テ キ ス ト 全文が イ ンデ ッ ク ス さ れて い る 場合 (文書が長 く て単語 リ ス ト へ減量 さ れた場合ではな く ) には、 検索語の前後にい く つかの語が表示 さ れて文脈を示 し ます。 PDF テ キ ス ト 内容は MediaWiki イ ンデ ッ ク ス に HTML 形式で与え ら れますので、 テ キ ス ト の頭に行番号が表示 さ れます。 こ れ ら の行番号 は PDF 文書については意味があ り ませんので、 無視 し て差 し 支え あ り ません。 メ タ デー タ フ ィ ール ド を イ ン デ ッ ク ス MediaWiki 用 TET コ ネ ク タ は、 すべての標準文 書情報フ ィ ール ド を イ ンデ ッ ク ス し ます。 各フ ィ ール ド の値が、 検索で利用で き る よ う 、 イ ンデ ッ ク スへ与え ら れます。 MediaWiki は メ タ デー タ ベース の検索に対応 し てい ません ので、 文書情報項目を直接検索す る こ と はで き ず、 全文テ キ ス ト の一部 と し てのみ情報項 目を検索で き ます。 58 4 章 : TET コ ネ ク タ 5 設定 5.1 暗号化 PDF か ら 内容 を抽出 PDF 文書では、 以下の暗号化手段を用い る こ と がで き ます : > 文書を開 く ためにユーザーパス ワー ド が必要な よ う にす る こ と がで き ます。 > ページ内容を抽出す る こ と な ど、 特定の操作を権限設定で許可 し た り 禁止 し た り す る こ と がで き ます。 > 権限設定やど ち ら かのパ ス ワ ー ド を変更す る ためにマ ス タ ーパ ス ワ ー ド が必要な よ う にする こ と がで き ます。 TET は PDF 権限設定に従い ます。 dumper サンプルで演示 し てい る よ う に、 パ ス ワー ド と 権限設定を、 pCOS パス encrypt/master ・ encrypt/user ・ encrypt/nocopy 等で取得す る こ と がで き ます。 pCOS は pcosmode 擬似オブジ ェ ク ト も 提供 し てお り 、 こ れを用い る と 、 特 定の文書について ど の操作が許 さ れてい る かを知 る こ と がで き ます。 内容抽出状態 デフ ォ ル ト では、 文書を う ま く 開 く こ と がで き た な ら 、 TET に よ る テ キ ス ト と 画像の抽出は可能にな り ます (open_document( ) の requiredmode オプシ ョ ン を与 えた場合には こ の限 り ではあ り ません)。 nocopy 権限設定に よ っ て、 制限 pCOS モー ド で の内容抽出が許 さ れ る か否かが決ま り ます (フル pCOS モー ド では内容抽出はつねに許 さ れます) 。 以下の条件文を用いれば、 内容抽出が許 さ れてい る か ど う か を調べ る こ と がで き ます : if ((int) tet.pcos_get_number(doc, "pcosmode") == 2 || ((int) tet.pcos_get_number(doc, "pcosmode") == 1 && (int) tet.pcos_get_number(doc, "encrypt/nocopy") == 0)) { /* 内容抽出は許されている */ } 暗号化文書 を処理す る必要 PDF 権限設定は、 文書作成者がその内容の作成者 と し ての 権利を強制す る こ と を支援 し 、 PDF 文書の利用者は、 テ キ ス ト ・ 画像内容を抽出す る 際に はその文書作成者の権利を尊重す る 必要があ り ます。 デフ ォ ル ト では、 TET は制限モー ド で動作 し 、 その よ う な暗号化文書か ら いかな る 内容を も 抽出する こ と を拒否 し ます。 し か し 、内容抽出はあ ら ゆ る 場合においてただちに作成者の権利の侵害を構成す る わけではあ り ません。 内容抽出が許容可能な状況 と し て以下の よ う な場合が挙げ ら れます : > 少量の内容を引用目的で抽出す る 場合 (「フ ェ アユース」)。 > 組織に出入 り す る 文書の中に特定のキー ワ ー ド がないか を調べたい (文書ス ク リ ーニ ン グ) か も し れません。 それを超え る 内容の再利用は行い ません。 > 文書作成者自身がマ ス タ ーパス ワー ド を紛失 し たか も し れません。 > 検索エ ン ジ ン が暗号化文書を イ ンデ ッ ク スす る 場合。 その文書内容を ユーザーに直接 利用可能には し ません (元の PDF への リ ン ク を示す こ と に よ っ て間接的にのみ利用可 能 と し ます)。 最後の例が と り わけ重要です : 利用者が暗号化 PDF の内容抽出を許 さ れていない場合で あ っ て も 、 企業内検索や Web ベース検索でその文書を見つけ出す こ と は可能であ る べ き です。 抽出 し たテ キ ス ト を利用者に直接利用可能 と せず、 文書を見つけ出せ る よ う 検索エ ン ジ ンの イ ンデ ッ ク ス に供す る ためにのみ用い る な ら ば、内容を抽出す る こ と は許容 さ れ 5.1 暗号化 PDF から 内容を抽出 59 う る で し ょ う 。 利用者は元の暗号化 PDF をのみ利用可能 と な り ますので (検索エン ジ ン が内容を イ ンデ ッ ク ス し て ヒ ッ ト リ ス ト が PDF への リ ン ク を含んだ後には)、 利用者がそ の PDF を利用す る 際には、 その文書の内部権限設定が通常通 り その文書を保護す る こ と にな り ます。 暗号化文書に対す る 「シ ュ ラ ッ グ」 機能 TET は、 TET ユーザーが文書作成者の権利を 尊重す る こ と について責任を受け入れ る 前提の も と に、暗号化文書か ら テ キ ス ト と 画像を 抽出す る ために利用で き る 機能を提供 し てい ます。 こ の機能はシ ュ ラ ッ グ と 呼ばれ、 次の よ う に動作 し ます : open_document( ) に shrug オプシ ョ ン を与え る こ と に よ っ て、 ユー ザーは、 自身がいかな る 文書作成者の権利を も 侵害す る 意志を持た ない こ と を言明 し ま す。 PDFlib GmbH の取引条件は、 TET のお客様が PDF 権限設定を尊重す る べ き であ る と 定めてい ます。 以下のすべての条件が真であ る と き 、 シ ュ ラ ッ グ機能は有効化 さ れます : > open_document( ) に shrug オプシ ョ ンが与え ら れてい る 。 > 文書がマ ス タ ーパ ス ワー ド を必要 と し てい る が、それがopen_document( )に与え ら れて いない。 > 文書がユーザー (文書を開 く ) パ ス ワー ド を必要 と し てい る 場合には、 それが open_ document( ) に与え ら れてい る 必要があ り ます。 > 文書の権限設定でテ キ ス ト 抽出が許 さ れていない、 すなわち nocopy=true。 シ ュ ラ ッ グ機能は以下の効力を持ち ます : > nocopy=true であ っ て も 文書か ら の内容抽出が許 さ れます。ユーザーは文書作成者の権 利を尊重す る 責任を負い ます。 > pCOS 擬似オブジ ェ ク ト shrug が true/1 に設定 さ れます。 > pCOS が フルモー ド で動作 し ます (制限モー ド ではな く )。すなわち pcosmode 擬似オブ ジ ェ ク ト が 2 に設定 さ れます。 shrug 擬似オブジ ェ ク ト を下記の形に従っ て用いれば、 内容を ユーザーに直接利用可能 と し て よ いか、それ と も イ ンデ ッ ク スす る こ と やその類の間接的用途にのみ利用す る べ き か を決定す る こ と がで き ます : int doc = tet.open_document(filename, "shrug"); ... if ((int) tet.pcos_get_number(doc, "shrug") == 1) { /* インデックスすることのみ許される */ } else { /* 内容をユーザーに渡してもよい */ } 60 5 章 : 設定 5.2 リ ソ ース設定 と フ ァ イ ル検索 UPR フ ァ イル と リ ソ ース カ テ ゴ リ 場合に よ っ ては TET は、 エン コ ーデ ィ ン グ定義やグ リ フ名マ ッ ピ ン グ テーブル と いっ た リ ソ ース の場所を知っ て利用す る 必要があ り ます。 リ ソ ー ス の取 り 扱い を プ ラ ッ ト フ ォ ーム に依存せずかつカ ス タ マ イ ズ可能な も のにす る た めに、設定フ ァ イ ルを与えてそ こ に利用可能な リ ソ ース群 と それぞれのデ ィ ス ク フ ァ イ ル 名を記述す る こ と がで き ます。 静的な設定フ ァ イ ルだけでな く 、 set_option( ) を用いて リ ソ ー ス を追加す る こ と に よ り 動的な設定 も 行 う こ と が可能です。 設定 フ ァ イ ルに関 し て は、 Unix PostScript Resource (UPR) と い う テ キ ス ト 形式が用い ら れ ます。 TET で用い ら れ る 形の UPR フ ァ イ ル形式を以下に説明 し ます。 TET は、 表 5.1 に挙げ る リ ソ ース カ テ ゴ リ に対応 し てい ます。 表 5.1 リ ソ ース カ テ ゴ リ ( フ ァ イル名はすべて UTF-8 で指定する必要がある) カテゴ リ 形式1 説明 cmap キー = 値 CMap の リ ソ ース名 と フ ァ イル名 codelist キー = 値 コ ー ド リ ス ト の リ ソ ース名 と フ ァ イル名 encoding キー = 値 エ ン コ ーデ ィ ン グの リ ソ ース名 と フ ァ イル名 glyphlist キー = 値 グ リ フ リ ス ト の リ ソ ース名 と フ ァ イル名 glyphmapping オプ シ ョ ン リ ス ト 164 ページの表 11.7 に従 っ てグ リ フ マ ッ ピ ング方式を記述 し たオプ シ ョ ン リ ス ト 。 こ の リ ソ ースは open_document( ) 内で評価 さ れ、 そ の結果は、 open_document( ) のオプ シ ョ ン glyphmapping で指定 さ れ たマ ッ ピ ングの後に追加 さ れます。 hostfont キー = 値 埋め込まれていない フ ォ ン ト に対 し て用いるべき ホス ト フ ォ ン ト リ ソ ースの名前 (キーは PDF フ ォ ン ト 名。 値は UTF-8 エ ン コ ーデ ィ ン グによ る ホス ト フ ォ ン ト 名) fontoutline キー = 値 埋め込まれていない フ ォ ン ト に対 し て用いるべき TrueType フ ォ ン ト または OpenType フ ォ ン ト のフ ォ ン ト と フ ァ イル名 searchpath 値 デー タ フ ァ イル群を含むデ ィ レ ク ト リ の相対パス または絶対パス 1. UPR 文法では等号 「=」 を名前 と 値の間に必要 と し ますが、 set_option( ) で リ ソ ース を指定する際は こ のキ ャ ラ ク タ は必要な く 、 かつ入れてはいけません。 UPR フ ァ イル形式 PDF フ ァ イ ルは非常に簡単な構造 を 持 っ た テ キ ス ト フ ァ イ ルで あ り 、 テ キ ス ト エデ ィ タ で書いた り 自動的に生成 さ せた り する こ と が容易にで き ます。 まず はその文法について見てみま し ょ う : > 1 行に書け る のは最長 255 キ ャ ラ ク タ ま でです。 > バ ッ ク ス ラ ッ シ ュ 「\」 は行末キ ャ ラ ク タ をエ ス ケープ し ます。 こ れは行を延長す る の に使え ます。 > ピ リ オ ド 「.」 だけの行はセ ク シ ョ ンの終了を示 し ます。 > 注釈行はパーセ ン ト 「%」 で始め る こ と がで き 、 行末で終了 し ます。 > 空白は無視 さ れます。 ただ し リ ソ ース名 と フ ァ イ ル名の中の空白は無視 さ れません。 UPR フ ァ イ ルは以下の構成要素でで き てい ます : > フ ァ イ ルを識別 さ せ る ための魔法行。 以下の形を と り ます。 PS-Resources-1.0 5.2 リ ソ ース設定 と フ ァ イル検索 61 > フ ァ イ ル内に記述 さ れ る すべての リ ソ ース カ テ ゴ リ を列挙 し たセ ク シ ョ ン。 各行に リ ソ ース カ テ ゴ リ を 1 つずつ記述 し ます。 こ の列挙はピ リ オ ド 1 つの行に よ っ て終了 し ます。 > フ ァ イ ル冒頭で列挙 さ れた各 リ ソ ース カ テ ゴ リ ご と にセ ク シ ョ ン 1 つずつ。各セ ク シ ョ ン の先頭行で リ ソ ー ス カ テ ゴ リ を示 し 、 その後に、 利用可能な リ ソ ー ス を記述 し た行 を何行で も 列挙す る こ と がで き ます。 こ の列挙はピ リ オ ド 1 つの行に よ っ て終了 し ま す。 各 リ ソ ースデー タ 行には リ ソ ー ス の名前を書 き ます (等号は ク オー ト では さ む必 要あ り )。 リ ソ ース がフ ァ イ ル名を必要 と す る 場合は、 その名前を等号の後に加え る 必 要 が あ り ま す。 リ ソ ー ス 項目内 に 列挙 さ れ た フ ァ イ ル を TET が 検索す る 際 に は searchpath (後述) が適用 さ れます。 UPR フ ァ イルの記述例 以下に UPR 設定フ ァ イ ルの記述例を示 し ます : PS-Resources-1.0 searchpath glyphlist codelist encoding . searchpath /usr/local/lib/cmaps /users/kurt/myfonts . glyphlist myglyphlist=/usr/lib/sample.gl . codelist mycodelist=/usr/lib/sample.cl . encoding myencoding=sample.enc . フ ァ イル検索 と searchpath リ ソ ース カ テ ゴ リ 絶対パ スや相対パ ス だけでな く 、 パ ス指 定を一切つけずに フ ァ イ ル名を TET に与え る こ と も で き ます。 searchpath リ ソ ース カ テ ゴ リ を用いれば、必要なデー タ フ ァ イ ル群を含むデ ィ レ ク ト リ のパ ス名を列挙指定す る こ と がで き ます。 フ ァ イ ルを開 く 必要があ る と き 、 TET は まず与え ら れた通 り の フ ァ イ ル名 を用いて フ ァ イ ルを開 こ う と し ます。 それが失敗す る と 、 TET は searchpath リ ソ ース カ テ ゴ リ に指定 さ れたデ ィ レ ク ト リ の中で フ ァ イ ルを開 こ う と 試み、 1 つのデ ィ レ ク ト リ で 失敗すれば次の指定デ ィ レ ク ト リ を試 し 、 成功す る ま で次々 と 試 し てい き ま す。 複数の searchpath 項目は蓄積 さ せ る こ と が可能で、 逆順に検索 さ れます (後で設定 し たパ ス が、 前に設定 し たパ ス よ り も 先に検索 さ れます)。 こ の検索を行わせた く ない と き は、 TET 関 数で フルパ ス を指定 し ます。 Windows の場合、 TET は searchpath リ ソ ース カ テ ゴ リ を、 以下の レ ジ ス ト リ キーか ら 読んだ値で初期化 し ます : HKLM\SOFTWARE\PDFlib\TET4\4.0\SearchPath HKLM\SOFTWARE\PDFlib\TET4\SearchPath HKLM\SOFTWARE\PDFlib\SearchPath こ れ ら の レ ジ ス ト リ 項目は複数のパ ス を セ ミ コ ロ ン 「;」 で区切っ て持つ こ と がで き ます。 Windows イ ン ス ト ー ラ は こ の SearchPath レ ジ ス ト リ 項目を以下のデ ィ レ ク ト リ 名で初期化 62 5 章 : 設定 し ます(TET を カ ス タ ムのデ ィ レ ク ト リ に イ ン ス ト ール し た場合は こ れ と 同様のデ ィ レ ク ト リ 名) : C:\Program Files\PDFlib\TET 4.0 32bit\resource C:\Program Files\PDFlib\TET 4.0 32bit\resource\cmap IBM iSeries の場合、 searchpath リ ソ ース カ テ ゴ リ は以下の値で初期化 さ れます : /PDFlib/TET/4.0/resource/icc /PDFlib/TET/4.0/resource/fonts /PDFlib/TET/4.0/resource/cmap /PDFlib/TET/4.0 /PDFlib/TET /PDFlib MVS では、 こ の searchpath 機能には対応 し てい ません。 UPR リ ソ ース フ ァ イルを検索 リ ソ ー ス フ ァ イ ル を 用い る 必要が あ る 場合に は、 set_ option( ) を呼び出 し てそれを指定す る こ と も で き ます し (後述) 、 ま たは UPR リ ソ ース フ ァ イ ルで指定す る こ と も で き ます。 TET は こ の フ ァ イ ルを、 初めての リ ソ ース が要求 さ れた時点で自動的に読み込みます。 具体的には以下の よ う に処理 さ れます : > TETRESOURCEFILE 環境変数が定義 さ れてい る 場合、TET はその値を、読み込むべき UPR フ ァ イ ルの名前 と し て採用 し ます。 その フ ァ イ ルが読み込めなか っ た と き は例外が発 生 し ます。 > TETRESOURCEFILE 環境変数が定義 さ れていない場合、TET は以下の名前の フ ァ イ ルを開 こ う と し ます : upr (MVS の場合。データセットが期待される ) /tet/4.0/tet.upr (iSeries の場合 ) tet.upr (Windows・Unix、その他すべてのシステムの場合 ) こ の フ ァ イ ルが読み込めなか っ た と き に例外は発生 し ません。 > Windows の場合、 TET は さ ら に以下の レ ジ ス ト リ 項目を も 読 も う と し ます : HKLM\SOFTWARE\PDFlib\TET\4.0\resourcefile そ し て こ のキー (TET の イ ン ス ト ー ラ は こ のキーを作成 し て値 < イ ン ス ト ールデ ィ レ ク ト リ >/tet.upr を与え ますが、 それ以外の手段で作成す る こ と も で き ます) の値を、 読み込むべ き リ ソ ー ス フ ァ イ ルの名前 と し て採用 し ます。 こ の フ ァ イ ルが読み込めな か っ た と き は例外が発生 し ます。 > ク ラ イ ア ン ト 側で実行時に TET に強制 し て リ ソ ース フ ァ イ ルを読み込ませ る には、 次 の よ う に resourcefile オプシ ョ ン を明示的に設定 し ます : set_option("resourcefile=/ パス / です /tet.upr"); こ の呼び出 し は何回で も 繰 り 返す こ と がで き ます。 リ ソ ース項目が蓄積 さ れます。 リ ソ ース を実行時に設定 設定のために UPR フ ァ イ ルを用い る だけでな く 、set_option( ) を用いて個々の リ ソ ース を直接設定す る こ と も 可能です。 こ の関数は、 リ ソ ース カ テ ゴ リ 名 と 、 対応する リ ソ ース名 ・ 値の対 (複数可) と を、 UPR リ ソ ース フ ァ イ ル内のそのカ テ ゴ リ のセ ク シ ョ ンに書 く の と 同 じ 形で受け入れます。 た と えば : set_option("glyphlist={myglyphnames=/usr/local/glyphnames.gl}"); 5.2 リ ソ ース設定 と フ ァ イル検索 63 1つのオプシ ョ ン リ ス ト の中で、1つの リ ソ ース カ テ ゴ リ オプシ ョ ンに対す る 複数の リ ソ ー ス名を設定す る こ と も 可能です (ただ し set_option( ) への 1 度の呼び出 し の中で、 同 じ リ ソ ース カ テ ゴ リ オプシ ョ ン を複数回繰 り 返す こ と はで き ません) 。 あ る いは、 複数回呼び 出 し て リ ソ ース設定を蓄積 さ せ る こ と も で き ます。 テキス ト フ ァ イルでのエ ス ケープ シーケ ン ス エ ス ケープシーケ ン ス は、 UPR フ ァ イ ル と CMap フ ァ イ ル以外のすべてのテ キ ス ト フ ァ イ ル内で使用で き ます。特殊な キ ャ ラ ク タ シーケ ン ス を用い る と 、テ キ ス ト フ ァ イ ル内に印字不能キ ャ ラ ク タ を含め る こ と がで き ま す。 すべてのシーケ ン ス はバ ッ ク ス ラ ッ シ ュ 「\」 キ ャ ラ ク タ で始ま り ます : > \x は 2 桁の 16 進数 (0 ∼ 9、 A ∼ F、 a ∼ f) を開始 し ます。 例 : \x0D > \nnn は 3 桁の 8 進数 (0 ∼ 7) を表 し ます。例:\015。シーケ ン ス \000 は無視 さ れます。 > シーケ ン ス \\ は 1 個のバ ッ ク ス ラ ッ シ ュ を表 し ます。 > 行末のバ ッ ク ス ラ ッ シ ュ は行末キ ャ ラ ク タ を キ ャ ン セル し ます。 64 5 章 : 設定 5.3 代表的シ ナ リ オのための推奨方策 TET には さ ま ざ ま なオプシ ョ ンがあ り 、 それ ら を活用する こ と で、 操作の さ ま ざ ま な面を 制御す る こ と が可能です。 こ の項では、 TET の典型的な応用シナ リ オについて、 い く つか の推奨方策を示 し ます。 以下でふれ る 関数やオプシ ョ ンについて詳 し く は、 143 ページの 11 章 「TET ラ イ ブ ラ リ API リ フ ァ レ ン ス」 を参照 し て下 さ い。 速度 を最適化 場合に よ っ ては、 と く に検索エン ジ ンのために PDF を イ ンデ ッ ク スす る 際には、 テ キ ス ト 抽出の速度が最重要であ り 、 最適出力を得 る こ と よ り も 優先 さ れ ます。 TET のデフ ォ ル ト 設定は、 可能なかぎ り 最良の出力が得 ら れ る よ う に選択 さ れてい ます が、 処理を速め る よ う に調整す る こ と も 可能です。 open_page( ) でオプシ ョ ン を選ぶ こ と に よ り テ キ ス ト 抽出の スループ ッ ト を最大化す る 方法をい く つか挙げます : > docstyle=searchengine 検索エ ン ジ ンのための イ ンデ ッ ク ス処理に影響を及ぼ さ ないや り 方で出力品質を落 と す こ と に よ っ て動作を高速化す る よ う にい く つかの内部パ ラ メ タ が設定 さ れます。 > skipengines={image} 画像抽出が必要ない場合、 動作を高速化す る ために内部の画像処理を ス キ ッ プで き ま す。 > contentanalysis={merge=0} こ れは、 時間のかか る ス ト リ ッ プ と 区域の結合 ス テ ッ プ を無効にす る も ので、 代表的 な フ ァ イ ルに対す る 処理時間をデフ ォ ル ト 設定の 60% 程度に低減 し ます。 ただ し 、 内 容がページ上に任意の順序でば ら ま かれてい る よ う な文書では、 テ キ ス ト が論理順に 抽出 さ れな く な る と こ ろがあ る か も し れません。 > contentanalysis={dehyphenate=false} こ れは、 ハ イ フ ン分割 さ れてい る 単語の再結合を無効に し ます。 ハ イ フ ン除去が必要 でない場合であれば、 こ のオプシ ョ ンで処理時間を若干短縮で き る 場合があ り ます。 > contentanalysis={shadowdetect=false} こ れは、 冗長な影付 き ・ 擬似太字テ キ ス ト の検出を無効に し ます。 こ れに よ っ て も 、 処 理時間を短縮で き る 場合があ り ます。 単語か行 レ イ ア ウ ト か折 り 返 し 可能テキス ト か 以下の よ う に、 応用の種類に よ っ て、 望ま し い出力の種類は異な り ます (ハ イ フ ネーシ ョ ン さ れた単語はつねに こ れ ら の設定で ハ イ フ ン除去 さ れます) : > 個々の単語 (レ イ ア ウ ト 無視) : 検索エン ジ ンでは、 レ イ ア ウ ト が ら みの事柄は関心の 対象 と はな ら ず、 テ キ ス ト の中の単語だけが関心の対象にな り ます。 こ の よ う な場合 には、 open_page( ) で granularity=word を用いて、 get_text( ) を 1 回呼び出すご と に 1 個の単語が抽出 さ れ る よ う に し ます。 > 行レ イ ア ウ ト を温存:get_text( ) を 1回呼び出すご と に1つのページ全体のテ キ ス ト 内容 が抽出 さ れ る よ う にす る には、 open_page( ) で granularity=page を用い ます。 テ キ ス ト の行 と 行の間はそれぞれ、 ラ イ ン フ ィ ー ド キ ャ ラ ク タ で区切 ら れ る ので、 既存の行構 造が保持 さ れます。 > 折 り 返 し 可能テ キ ス ト : 改行を避け、 抽出 さ れた テ キ ス ト の折 り 返 し を実現す る ため には、 open_page( ) で contentanalysis={lineseparator=U+0020} と granularity=page を 用い ます。 get_text( ) を一回呼び出せばページ内容全体が取得で き ます。 区域ど う し は ラ イ ン フ ィ ー ド キ ャ ラ ク タ で区切 ら れ、 区域内の行ど う し の間には空白キ ャ ラ ク タ が 挿入 さ れます。 5.3 代表的シナ リ オのための推奨方策 65 検索エ ン ジ ンや イ ン デ ク サ を書 く イ ンデ ク サは通常、 テ キ ス ト のページ上におけ る 位 置には関心を持っ てい ません (検索 さ れた用語をハ イ ラ イ ト 表示 さ せたい場合を除 き ) 。 多 く の場合、 イ ンデ ク サは Unicode マ ッ ピ ン グにおいて起 こ る エ ラ ーを許容 し 、 得 ら れ る テ キ ス ト 内容すべて を処理 し ます。 推奨方策 : > open_page( ) で granularity=word を用い ます。 > 句読点を処理す る 方法を アプ リ ケーシ ョ ン が知っ てい る 場合には、 ページオプシ ョ ン contentanalysis={punctuationbreaks=false} を設定すれば、句読点を隣接テ キ ス ト と 一緒 に し てお く こ と がで き ます。 位置情報 応用の種類に よ っ ては、 位置情報に関す る 機能が有用で し ょ う : > get_char_info( ) イ ン タ フ ェース が必要にな る のは、 テ キ ス ト のページ上におけ る 位置 や、 それぞれの フ ォ ン ト 名や、 その他詳細情報を必要 と す る 場合だけです。 テ キ ス ト の座標に関心がない場合には、 get_text( ) を呼び出せば充分です。 > ページの レ イ ア ウ ト に関 し て事前情報があ る 場合は、 open_page( ) で includebox オプ シ ョ ンや excludebox オプシ ョ ン を用いて、 ヘ ッ ダ ・ フ ッ タ やその他本文テ キ ス ト には 含まれない部位を除外す る こ と がで き ます。 未知のキ ャ ラ ク タ TET は、 1 つない し 複数のキ ャ ラ ク タ に対す る 正 し い Unicode マ ッ ピ ン グ を決定で き ない と き には、 それを Unicode 置き 換え キ ャ ラ ク タ U+FFFD で表 し ます。 自分のアプ リ ケーシ ョ ン が こ う し た マ ッ プ不能キ ャ ラ ク タ について関心を持た ない場合 は、 こ のキ ャ ラ ク タ が現れて も 単にすべて捨てて し ま えば済む こ と です。 アプ リ ケーシ ョ ンがそれ よ り 精巧な結果を求め る 場合は、 対応す る フ ォ ン ト を考慮に入れ る こ と がで き 、 それを用いてマ ッ プ不能キ ャ ラ ク タ の処理方法を決め る こ と も で き る で し ょ う 。すべての マ ッ プ不能キ ャ ラ ク タ を ク エ ス チ ョ ン マー ク へ置 き 換え る には下記の文書オプシ ョ ン を 用い ます : unknownchar=? すべてのマ ッ プ不能キ ャ ラ ク タ を出力か ら 除 く には下記の文書オプシ ョ ン を用い ます : fold={{[:Private_Use:] remove} {[U+FFFD] remove} default} 複雑な レ イ アウ ト あ る 種の文書は、 非常に凝っ たページ レ イ ア ウ ト を用い る こ と が よ く あ り ます。 た と えば雑誌な ど では、 TET はページ上の段組みど う し の関係を正 し く 決め る こ と がで き ない場合が あ り ま す。 こ の よ う な場合には、 処理時間を かけ る こ と に よ っ て、 抽出 さ れ る テ キ ス ト を向上 さ せ る こ と が可能です。 こ の目的に適 し たオプシ ョ ンは、 87 ページの 6.6 「レ イ ア ウ ト 分析」 に ま と めて あ り ます。 関連す る オプシ ョ ンについて詳 し く は、 171 ページの表 11.10 を参照 し て く だ さ い。 法律文書 法律文書を扱 う 際には通常、Unicode マ ッ ピ ン グの誤 り は一切許容 さ れません。 それに よ っ て文書の内容や解釈が変わっ て し ま う 危険があ る ためです。多 く の場合テ キ ス ト の位置は必要ではな く 、 テ キ ス ト は単語ご と に抽出 さ れ る 必要があ り ます。 推奨方策 : > open_page( ) で granularity=word オプシ ョ ン を用い ます。 > 開 く た め に パ ス ワ ー ド を 必 要 と す る 文 書 を 処 理 す る 必 要 が あ る と き は、 open_ document( ) で password オプシ ョ ン を用いて正 し い文書パ ス ワー ド を指定 し ます。 あ る いは、 内容抽出が権限設定で許可 さ れていない と き は、 その文書か ら テ キ ス ト を抽 出す る 合法的立場に自分があ る な ら ば、 shrug オプシ ョ ン を用い ます (60 ページの 「暗 号化文書に対す る 「シ ュ ラ ッ グ」 機能」 を参照)。 66 5 章 : 設定 > テ キ ス ト の厳密 さ を正確に保つには : get_char_info( ) が返すキ ャ ラ ク タ 情報構造の フ ィ ール ド が 1 であ っ た と き 、ま たは get_text( ) が返す文字列の中に Unicode 置 き 換え キ ャ ラ ク タ が入っ ていた と き には、 ただちに処理を停止 さ せます。 テ キ ス ト モー ド glyph ま たは wordplus に よ る TETML 内では、 こ の状況は Glyph 要素 の下記の属性で特定で き ます : unknown="true" unknownchar オプ シ ョ ン を よ く あ る キ ャ ラ ク タ に設定 し な い よ う に し ま す。 正 し く マ ッ プ さ れた キ ャ ラ ク タ と の区別が、 unknown フ ィ ール ド を調べないかぎ り で き な く な っ て し ま う ためです。 > テ キ ス ト の厳密 さ を保つ も う 一つの方策 と し ては、 ページ上に表示 さ れていないテ キ ス ト についてはテ キ ス ト 抽出を無効化す る と よ いで し ょ う : ignoreinvisibletext=true PDFlib+PDI で文書 を処理 PDFlib+PDI を用いて PDF 文書をページ ご と に処理 し てい る 場 合には、 TET を そ こ に組み合わせて分割や結合の処理を制御する こ と も で き ます。 た と え ば、 PDF 文書をページ上の内容に従っ て分割す る こ と が可能にな り ます。 作成処理に関与 し てい る 場合には、テ キ ス ト 内にそのための適当な処理命令を持っ た区切 り ページ を挿入 す る こ と も で き ます。TET ク ッ ク ブ ッ ク には、TETで文書を分析 し てか ら それを PDFlib+PDI で処理す る 例が含まれてい ます。 Unicode 値 を持た ない レ ガ シ PDF 文書 場合 に よ っ て は、 レ ガ シ ア プ リ ケ ー シ ョ ン に よ っ て生成 さ れた PDF 文書を処理 し なければな ら ない こ と があ り ます。 その よ う な PDF は、 正 し い Unicode マ ッ ピ ン グに必要な充分な情報を持たない こ と があ り え ます。 デフ ォ ル ト 設定を用いた場合には、TET はそのテ キ ス ト 内容の一部ない し 全部抽出で き ないか も し れません。 推奨方策 : > ま ずは テ キ ス ト を デ フ ォ ル ト 設定で抽出 し てみて、 そ の結果 を 解析 し ま す。 正 し い Unicode マ ッ ピ ン グに必要な充分な情報を与え ない フ ォ ン ト を見つけ ます。 > こ の フ ォ ン ト の問題を解決す る ため、 カ ス タ ム のエ ン コ ーデ ィ ン グ テーブル と グ リ フ 名 リ ス ト を書 き ます。 PDFlib FontReporter を利用 し て フ ォ ン ト を解析 し 、 Unicode マ ッ ピ ン グ テーブルを作成 し ます。 > こ のカ ス タ ム のマ ッ ピ ン グ テーブルを設定 し て、 テ キ ス ト を ま た抽出 し てみます。 こ の時は文書の量をは じ め よ り 多 く し てみます。 なお も マ ッ プ不能な グ リ フやフ ォ ン ト が存在す る 場合には、 マ ッ ピ ン グ テーブルを適切に調整 し ます。 > マ ッ プ不能な フ ォ ン ト を持つ文書が大量にあ る 場合は、 必要なマ ッ ピ ン グ テーブルの 作成について PDFlib GmbH が支援で き る 場合 も あ り ます。 PDF 文書を他の形式に変換 PDF 文書のページ内容を、 で き る だけ多 く の情報を保ちな が ら 自分のアプ リ ケーシ ョ ンに取 り 込みたい場合には、正確な キ ャ ラ ク タ メ ト リ ッ ク が必 要にな り ます。 推奨方策 : > get_char_info( ) を用いて、正確な キ ャ ラ ク タ メ ト リ ッ ク と フ ォ ン ト 名を抽出 し ます。uv フ ィ ール ド を用いて各キ ャ ラ ク タ の Unicode 値を抽出 し てい る 場合で も 、 char_info 構 造に内容を取 り 込むために get_text( ) を呼び出す必要があ り ます。 > open_page( )でgranularity=glyphかwordのいずれか を用い ます。自分のアプ リ ケーシ ョ ンに合っ てい る方を選びま し ょ う 。 granularity=glyph で処理をす る と 、 テ キ ス ト の視 覚レ イ ア ウ ト と 、 TET が処理 し て生成す る 論理的テ キ ス ト と の間に齟齬が生 じ る 場合 があ り ます (た と えば、 合字グ リ フ に よ っ て生成 さ れた 2 個のキ ャ ラ ク タ は、 その合 字 と 同 じ 幅には収ま ら ないか も し れません)。 5.3 代表的シナ リ オのための推奨方策 67 カ ス タ ムエ ン コ ーデ ィ ン グの ロ ゴ を持つ企業 フ ォ ン ト 多 く の場合、 カ ス タ ム の ロ ゴ を 含んだ企業フ ォ ン ト は、 その ロ ゴに対す る Unicode マ ッ ピ ン グ情報を持っ ていないか、 あ る いは持っ ていて も 誤っ てい ます。 こ の よ う な フ ォ ン ト が含んだ PDF 文書が大量にあ る 場合には、 正 し い Unicode 値でカ ス タ ムのマ ッ ピ ン グ テーブルを作成す る こ と を推奨 し ま す。 まず、 その フ ォ ン ト を含んだ PDF に対する フ ォ ン ト レ ポー ト を生成 さ せ (107 ページ の 「PDFlib FontReporter Plugin で PDF 文書を分析」 を参照)、 マ ッ プが誤っ てい る グ リ フ を その フ ォ ン ト レ ポー ト 内で見つけ ます。その フ ォ ン ト の種類で利用で き る 設定テーブル を選び、 それを用いて、 足 り ない Unicode マ ッ ピ ン グ を与え る こ と がで き ます。 ロ ゴ タ イ プ フ ォ ン ト に対す る コ ー ド リ ス ト の詳 し い作成例は、 108 ページの 「 コ ー ド リ ス ト リ ソ ー ス はあ ら ゆ る 種類の フ ォ ン ト に利用可能」 を参照。 TeX 文書 TeX 文書に よ っ て生成 さ れた PDF 文書は、 数値グ リ フ名や Type 3 フ ォ ン ト を は じ め と す る 、他の製品がテ キ ス ト を う ま く 抽出で き ない原因 と な る 機能を含んでい る こ と が よ く あ り ます。 TET は、 こ の よ う な文書を扱 う ための多 く の ヒ ュ ー リ ス テ ィ ッ ク と 回 避策を含んでい ます。 し か し あ る 種の TeX 文書は、 処理時間を よ り 多 く 要す る 、 デフ ォ ル ト では無効にな っ てい る 回避策でのみ処理する こ と が可能です。下記の文書オプシ ョ ン を用いれば、 こ う し た文書のための、 CPU 消費の よ り 多い フ ォ ン ト 処理を有効にす る こ と がで き ます : checkglyphlists=true 68 5 章 : 設定 6 テキス ト 抽出 6.1 PDF の さ ま ざ ま な文書領域 PDF 文書は、 ページ内容だけではな く 、 それ以外の多 く の場所にテ キ ス ト を含んでい る 可 能性があ り ます。 たいていのアプ リ ケーシ ョ ンはページ内容のみを扱い ますが、 他の文書 領域が必要な状況 も 多 く あ り ます。 ページ内容は、 最 も 活躍す る 関数 get_text( ) と get_image( ) で取得す る こ と がで き 、 一 方、他の文書領域か ら テ キ ス ト を取得す る には内蔵の pCOS イ ン タ フ ェース が主要な役割 を務め ます。 こ の節では以下、 TET ラ イ ブ ラ リ と TETML での領域検索について情報を提供 し ます。 あわせて、 こ れ ら の文書領域を Acrobat 8/9 で検索する 方法 も ま と め ます。 こ れは Acrobat で検索 ヒ ッ ト を見つけ る ために重要です。 ページ上のテキス ト ページ内容は PDF 内の主要なテ キ ス ト です。 ページ上のテ キ ス ト はフ ォ ン ト で視覚表現 さ れ、PDF 内で利用可能な多様なエン コ ーデ ィ ン グ技法の一つを用 いて符号化 さ れてい ます。 > Acrobat 8/9 での表示方法 : ページ内容はつねに表示 さ れてい ます。 > Acrobat 8/9 で一個の PDF を検索す る 方法:「編集」→「検索」。Acrobat がグ リ フ を Unicode 値へ正 し く マ ッ プで き ない文書内のテ キ ス ト を、TET は処理で き る 可能性があ り ます。 こ の よ う な状況では、 TET をベース に し た TET Plugin を利用す る こ と がで き ます (45 ページの 4.1 「Adobe Acrobat 用無償 TET Plugin」 を参照)。 TET Plugin は、 その自前の 検索ダ イ ア ロ グ を 「Plug-Ins」 → 「PDFlib TET Plugin...」 → 「TET Find」 で提供 し ます。 た だ し こ れは、 完全な検索機能を提供す る よ う には意図 さ れてい ません。 > Acrobat 8/9 で複数の PDF を検索す る 方法 : 「Acrobat の検索パネルを開 く 」 を選択 し た のち、 「検索する場所を指定 し て く だ さ い。 」 の中で 「以下の場所にあるすべての PDF 文書」 を選択 し 、 PDF 文書群が入っ てい る フ ォ ルダへブ ラ ウ ズ。 > TET ラ イ ブ ラ リ 用サンプル コ ー ド : extractor ミ ニサンプル > TETML 要素 : /TET/Document/Pages/Page 定義済み文書情報項目 定義済みの文書情報項目はキー / 値対です。 > Acrobat 8/9 での表示方法 : 「 フ ァ イル」 → 「プ ロパテ ィ ...」 > Acrobat 8/9 で一個の PDF を検索す る 方法 : な し > Acrobat 8/9 で複数の PDF を検索す る 方法 : 「編集」 → 「検索」 → 「高度な検索オプ シ ョ ン を使用」 を ク リ ッ ク 。 「検索する場所 : 」 プルダ ウ ンで PDF 文書群の フ ォ ルダ を選 択 し 、 プルダ ウ ン メ ニ ュ ー 「その他の条件」 で 「作成日」 「更新日」 「作成者」 「 タ イ ト ル」 「サブ タ イ ト ル」 「キーワー ド 」 のいずれか を選択。 > TET ラ イ ブ ラ リ 用サンプル コ ー ド : dumper ミ ニサンプル > TETML 要素 : /TET/Document/DocInfo カ ス タ ム文書情報項目 標準項目に加え て、 カ ス タ ム文書情報項目を定義す る こ と も で き ます。 > Acrobat 8/9 での表示方法 : 「 フ ァ イル」 → 「プ ロパテ ィ ...」 → 「カ ス タ ム」 (無償の Acrobat Reader では利用で き ません) > Acrobat 8/9 での検索方法 : な し 6.1 PDF の さ ま ざ ま な文書領域 69 図 6.1 Acrobat の高度な 検索ダ イ ア ロ グ > TET ラ イ ブ ラ リ 用サンプル コ ー ド : dumper ミ ニサンプル > TETML 要素 : /TET/Document/DocInfo/Custom 文書 レ ベルの XMP メ タ デー タ XMP メ タ デー タ は、拡張 さ れた メ タ デー タ を内容 と し て 持つ XML ス ト リ ームか ら 成 り ます。 > Acrobat 8/9 での表示方法 : 「フ ァ イル」 → 「プ ロパテ ィ ...」 → 「その他の メ タ デー タ ...」 (無償の Acrobat Reader では利用で き ません) > Acrobat 8/9 で一個の PDF を検索す る 方法 : な し > Acrobat 8/9 で複数の PDF を検索す る 方法 : 「編集」 → 「検索」 → 「高度な検索オプ シ ョ ン を使用」 を ク リ ッ ク 。 「検索する場所 : 」 プルダ ウ ンで PDF 文書群の フ ォ ルダ を選 択 し 、 プルダ ウ ン メ ニ ュ ー 「その他の条件」 で 「XMP メ タ デー タ 」 を 選択 (無償の Acrobat Reader では利用で き ません)。 > TET ラ イ ブ ラ リ 用サンプル コ ー ド : dumper ミ ニサンプル > TETML 要素 : /TET/Document/Metadata 70 6 章 : テキス ト 抽出 画像 レ ベルの XMP メ タ デー タ XMP メ タ デー タ は、 画像 ・ ページ ・ フ ォ ン ト と いっ た文 書構成要素に も 付け る こ と が可能です。 し か し 、 XMP が通常見つか る のは画像レベルに おいてのみです (文書レベルに加え て)。 > Acrobat 8/9 での表示方法 : 「ツール」 → 「高度な編集」 → 「TouchUp オブ ジ ェ ク ト ツー ル」 →画像を選択→右 ク リ ッ ク→ 「 メ タ デー タ を表示 ...」 (無償の Acrobat Reader では 利用で き ません) > Acrobat 8/9 での検索方法 : な し > TET ラ イ ブ ラ リ 用サンプル コ ー ド : pCOS ク ッ ク ブ ッ ク の ト ピ ッ ク image_metadata > TETML 要素 : /TET/Document/Pages/Resources/Images/Image/Metadata フ ォ ーム フ ィ ール ド 内のテキス ト フ ォ ーム フ ィ ール ド はページにかぶ さ っ て表示 さ れ ます。 し か し 、 技術的には こ れはページ内容の一部分ではな く 、 別個のデー タ 構造に よ っ て表現 さ れます。 > Acrobat 8 での表示方法 : 「表示」 → 「ナビゲーシ ョ ンパネル」 → 「フ ィ ール ド 」 > Acrobat 9 での表示方法 : 「 フ ォ ーム」 → 「フ ィ ール ド を追加または編集 ...」 > Acrobat 8/9 での検索方法 : な し > TET ラ イ ブ ラ リ 用サンプル コ ー ド : pCOS ク ッ ク ブ ッ ク の ト ピ ッ ク fields > TETML 要素 : な し 注釈内のテキス ト フ ォ ーム フ ィ ール ド と 同様、 注釈 ( ノ ー ト ・ テ キ ス ト 注釈等) は別 個のデー タ 構造に よ っ て表現 さ れます。注釈の興味対象 と な る テ キ ス ト 内容はその種類に よ っ て異な り ます。た と えば、Web リ ン ク の場合はその興味対象 と な る 部分は URL で し ょ う し 、 それ以外の種類の注釈では印字 さ れ る テ キ ス ト 内容が意味を持つで し ょ う 。 > Acrobat 8/9 での表示方法 : 「表示」 → 「ナビゲーシ ョ ンパネル」 → 「注釈」 > Acrobat 8/9 で一個の PDF を検索す る 方法 : 「編集」 → 「検索」 →ボ ッ ク ス 「注釈を含め る」 をチ ェ ッ ク 、 ま たは注釈の リ ス ト ツールバーで 「検索」 ボ タ ン を ク リ ッ ク > Acrobat 8/9 で複数の PDF を検索す る 方法 : 「編集」 → 「検索」 → 「高度な検索オプ シ ョ ン を使用」 を ク リ ッ ク 。 「検索する場所 : 」 プルダ ウ ンで PDF 文書群の フ ォ ルダ を選 択 し 、 プルダ ウ ン メ ニ ュ ー 「その他の条件」 で 「注釈」 を選択。 > TET ラ イ ブ ラ リ 用サンプル コ ー ド : pCOS ク ッ ク ブ ッ ク の ト ピ ッ ク annotations > TETML 要素 : な し し お り 内のテキス ト し お り は直接にはページ と 結びついてい ま せんが、 特定のページ へ飛ぶア ク シ ョ ン を内容 と し て持つ場合があ り ます。 し お り は階層構造を形成す る よ う に 入れ子にす る こ と も 可能です。 > Acrobat 8/9 での表示方法 : 「表示」 → 「ナビゲーシ ョ ンパネル」 → 「 し お り 」 > Acrobat 8/9 で一個の PDF を検索す る 方法 : 「編集」 → 「検索」 →ボ ッ ク ス 「 し お り を含 める」 をチ ェ ッ ク > Acrobat 8/9 で複数の PDF を検索す る 方法 : 「編集」 → 「検索」 → 「高度な検索オプ シ ョ ン を使用」 を ク リ ッ ク 。 「検索する場所 : 」 プルダ ウ ンで PDF 文書群の フ ォ ルダ を選 択 し 、 プルダ ウ ン メ ニ ュ ー 「その他の条件」 で 「 し お り 」 を選択 (無償の Acrobat Reader では利用で き ません) > TET ラ イ ブ ラ リ 用サンプル コ ー ド : pCOS ク ッ ク ブ ッ ク の ト ピ ッ ク bookmarks > TETML 要素 : な し フ ァ イル添付 PDF 文書はフ ァ イ ル添付を含む こ と も で き (文書レベルかページ レベル で)、 その フ ァ イ ル添付自体が PDF 文書であ る こ と も 可能です。 6.1 PDF の さ ま ざ ま な文書領域 71 > Acrobat 8/9 での表示方法 : 「表示」 → 「ナビゲーシ ョ ンパネル」 → 「添付フ ァ イル」 > Acrobat 8/9 での検索方法 : 「編集」 → 「検索」 →ボ ッ ク ス 「添付フ ァ イルを含める」 を チ ェ ッ ク (無償の Acrobat Reader では利用で き ません)。 入れ子にな っ た添付は再帰的 に検索 さ れません。 > TET ラ イ ブ ラ リ 用サンプル コ ー ド : get_attachments ミ ニサンプル > TETML 要素 : /TET/Document/Attachments/Attachment/Document PDF パ ッ ケージ ・ ポー ト フ ォ リ オ Acrobat 8 (PDF 1.7) では、 PDF パ ッ ケージ と い う 概 念が導入 さ れま し た。 こ れはフ ァ イ ル添付に追加のプ ロ パテ ィ を与え た も のです。Acrobat 9 (PDF 1.7 拡張レベル 3) では こ の概念を拡張 し て、 PDF ポー ト フ ォ リ オが導入 さ れてい ます。 > Acrobat 8/9 での表示方法:Acrobat は、PDF パ ッ ケージ専用のユーザー イ ン タ フ ェース で、 パ ッ ケージ / ポー ト フ ォ リ オの表紙 と 中身の PDF 文書群を表現 し ます。 > Acrobat 8/9 で一個の PDF パ ッ ケージ を検索する 方法 : 「編集」 → 「検索」 → 「検索する 場所 : 」 プルダ ウ ン で 「PDF パ ッ ケージ全体」 を選択 > Acrobat 8/9 で複数の PDF パ ッ ケージ を検索する 方法 : な し > TET ラ イ ブ ラ リ 用サンプル コ ー ド : get_attachments ミ ニサンプル > TETML 要素 : /TET/Document/Attachments/Attachment/Document PDF プ ロパテ ィ こ の領域は明示的にテ キ ス ト を含んではお ら ず、 PDF/X ・ PDF/A 状態、 タ グ付 き PDF 状態 と いっ た、 PDF 文書の さ ま ざ ま な固有プ ロ パテ ィ を集めた コ ン テナ と し て用い ら れます。 > Acrobat 8 での表示方法 : Acrobat 8 は規格準拠情報を直接表示 し ませんが、 「フ ァ イル」 → 「プ ロパテ ィ ...」 → 「カ ス タ ム」 ま たは 「フ ァ イ ル」 → 「プ ロパテ ィ ...」 → 「その 他の メ タ デー タ ...」 で関連す る 項目を見つけ る こ と がで き ます (無償の Acrobat Reader では利用で き ません)。 あ る いは、 各種 ISO 規格用の無償の PDFlib カ ス タ ム XMP パネ ルを利用 し て、 PDF/A-1 ・ PDF/X-4 ・ PDF/X-5 ・ PDF/E-1 規格に対す る 準拠情報を明 示的に表示す る こ と も で き ます。 > Acrobat 9 : 「表示」 → 「ナビゲーシ ョ ンパネル」 → 「規格」 (規格準拠 PDF にでのみ現 れます) > Acrobat 8/9 での検索方法 : な し > TET ラ イ ブ ラ リ 用サンプル コ ー ド : dumper ミ ニサンプル > TETML 要素 ・ 属性 : /TET/Document/@pdfa ・ /TET/Document/@pdfe ・ /TET/Document/ @pdfx 72 6 章 : テキス ト 抽出 6.2 ページ と テキス ト の視覚情報 デ フ ォ ル ト 座標系 デフ ォ ル ト では TET は、ページ と テ キ ス ト のすべての視覚情報を PDF の標準座標系で表 し ま す。 た だ し 、 座標系の原点 (ページ の外に あ る 場合 も あ る ) は、 ページの表示可能領域の左下隅に一致 さ せます。 正確には、 CropBox が存在す る と き はそ の左下隅、 そ う でない と き は MediaBox の左下隅が原点にな り ます。 ページが Rotate キー を持つ場合はページ回転が行われます。 こ の座標系は DTP ポ イ ン ト を単位 と し て用い ま す。 1 pt = 1 inch / 72 = 25.4 mm / 72 = 0.3528 mm 第 1 座標は右へ増加 し 、 第 2 座標は上へ増加 し ます。 TET に与え る 座標はすべて こ の座標 系で表 し た も のでなければな り ません し 、TET が返す座標 も すべて こ の座標系で表 さ れた も のにな り ます。PDF 文書内でその座標が実際ど の よ う に表 さ れてい る かは関係あ り ませ ん。 PDF のページサ イ ズ を得 る 方法については pCOS リ フ ァ レ ン ス を参照 し て く だ さ い。 下向 き座標系 PDF の上向 き 座標系 と は異な り 、 グ ラ フ ィ ッ ク 環境に よ っ ては上向 き 座 標系を用いてい る も のがあ り ます。 開発者に よ っ ては こ の方を好む場合があ り ます。 下向 き 座標系の利用を実現す る ため、 TET では代替座標系を使 う こ と がで き ます。 こ の代替座 標系では、 すべての関連す る 座標はページの左下隅ではな く 左上隅に対 し て解釈 さ れ、 y 座標は下向 き に増加 し ます。 こ の下向き機能は、 TET のユーザーが下向 き 座標系を ご く 自 然に扱え る よ う にす る ために設計 さ れてい ます。追加の利点 と し て、下向 き 座標は Acrobat で表示 さ れ る 座標値 と 等 し く な り ます (後述) 。 ページで下向 き 座標を有効にす る には、 topdown ページオプシ ョ ン を用い ます。 Acrobat で座標 を表示 Acrobatでページ座標を表示す る には以下の よ う に操作 し ます(図 6.2 参照) : > カー ソ ル座標を表示す る には、 Acrobat 9 では 「表示」 → 「カ ー ソ ル座標」 を、 Acrobat 7/8 では 「表示」 → 「ナビゲーシ ョ ン タ ブ」 → 「情報」 を用い ます。 > 座標は、Acrobat で現在選択 さ れてい る 単位で表示 さ れます。Acrobat 7/8/9 で表示単位 を ポ イ ン ト に変更す る (TET で用い ら れてい る の と 同様に) には、 次の よ う に操作 し ます : 「編集」 → 「環境設定」 (→ 「一般 ...」) → 「単位 と ガ イ ド 」 → 「単位」 へ行 き 、 「ポ イ ン ト 」 を選択。 こ の表示 さ れてい る 座標はページの左上隅を原点 と し てお り 、 左下隅を原点に持つ PDF ・ TET のデフ ォ ル ト 座標系 と は異な る こ と に留意 し て く だ さ い。 Acrobat の座標系 と 揃 う 下 向 き 座標系を選ぶための方法については前項を参照 し て く だ さ い。 テキス ト 抽出の領域 デフ ォ ル ト では TET は、 目に見え る ページ領域のテ キ ス ト をすべ て抽出 し ます。 open_page( ) の clippingarea オプシ ョ ン (168 ページの表 11.8 を参照) を 用い る と 、 こ れを任意の PDF ページ枠項目 (TrimBox 等) へ変更す る こ と がで き ます。 キーワー ド unlimited を用い る と 、 いかな る ページ枠に も かかわ り な く すべてのテ キ ス ト を抽出す る こ と がで き ます。 デフ ォ ル ト 値 cropbox は、 Acrobat で目に見え る 領域内のテ キ ス ト を抽出す る よ う TET に指示 し ます。 テ キ ス ト 抽出の領域は も っ と 細か く 、任意の数の矩形領域を open_page( )のincludebox・ excludebox オプシ ョ ン で与え る こ と に よ っ て指定す る こ と も で き ます。 こ れは部分的な ページ内容 (選んだ段組等) を抽出 し た り 、 あ る いは必要ない部分 (余白 ・ ヘ ッ ダ ・ フ ッ 6.2 ページ と テキス ト の視覚情報 73 図 6.2 Acrobat の座標表示を設定。 カ ー ソル座標を表示するには 「表示」 → 「カ ー ソ ル座標」 を用います。 タ 等) を除いた り す る ために有用です。 最終的な切 り 抜き 領域は、 includebox オプシ ョ ン で指定 さ れたすべての矩形の和を算出 し 、 そ こ か ら excludebox オプシ ョ ンで指定 さ れた すべての矩形の和を除外す る こ と に よ っ て構築 さ れます。 キ ャ ラ ク タ は、 その参照点が切 り 抜 き 領域の中にあ る と き 、 その切 り 抜 き 領域内に あ る と 判定 さ れ ま す。 こ れはすなわ ち、キ ャ ラ ク タ の一部が切 り 抜 き 領域の外に出ていて も それがその切 り 抜 き 領域内にあ る と 判定 さ れ る 場合があ り 、 ま たその逆の場合 も あ る こ と を意味 し ます。 グリ フ メ ト リ ッ ク get_char_info( ) を用い る と 、任意のグ リ フ に対 し て返 さ れた キ ャ ラ ク タ 群の フ ォ ン ト 情報や メ ト リ ッ ク 情報を取得する こ と がで き ます。出力内の各キ ャ ラ ク タ に対 し て、 それぞれ以下の値が得 ら れます (図 6.3 と 177 ページの表 11.13 を参照) : > uv フ ィ ール ド は、情報取得対象のキ ャ ラ ク タ (カ レ ン ト キ ャ ラ ク タ )の UTF-32 Unicode 値を持ち ます。 こ の フ ィ ール ド はつねに UTF-32 を持ち ます。 ネ イ テ ィ ブな Unicode 文 字列内で UTF-16 文字列 し か扱え ない言語バ イ ンデ ィ ン グにおいて も 同様です。 こ の uv フ ィ ール ド を利用す る と 、BMP 領域外のキ ャ ラ ク タ を アプ リ ケーシ ョ ンで取 り 扱い たい と き に、 サ ロ ゲー ト ペア を解釈す る 必要な し に取 り 扱え る よ う にな り ます。 サ ロ ゲー ト ペアは 2 個の別々のキ ャ ラ ク タ と し て報告 さ れ る ので、 1 つ目の値の uv フ ィ ー ル ド が実際の Unicode 値 (U+FFFF を超え る ) を持ち、 2 つ目の値の uv フ ィ ール ド は 無形キ ャ ラ ク タ と し て扱われて uv 値 0 を持ち ます。 > type フ ィ ール ド は、 そのキ ャ ラ ク タ の種別を表 し ます。 有形キ ャ ラ ク タ と 無形キ ャ ラ ク タ の 2 種類があ り ます。 有形キ ャ ラ ク タ に分類 さ れ る も の と し ては、 通常のキ ャ ラ 74 6 章 : テキス ト 抽出 width (x, y) beta e tsiz fon e elin bas (x, y) fontsize th wid alpha 図 6.3 横書き と 縦書き におけるグ リ フ メ ト リ ッ ク ク タ (1 つのグ リ フ ま る ご と の結果等) と 、 1 つのグ リ フ に対応す る 複数のキ ャ ラ ク タ の列の先頭キ ャ ラ ク タ (合字の 1 文字目等) が挙げ ら れます。 無形キ ャ ラ ク タ に分類 さ れ る も の と し ては、 複数のキ ャ ラ ク タ の列の中の後続キ ャ ラ ク タ (合字の 2 文字目 等) と 、 挿入 さ れた区切 り キ ャ ラ ク タ が挙げ ら れ ます。 無形キ ャ ラ ク タ の場合、 位置 (x, y) は も っ と も 最近の有形キ ャ ラ ク タ の終了点を指 し 、 幅 width は 0 にな り 、 その他 の フ ィ ール ド は uv 以外すべて も っ と も 最近の有形キ ャ ラ ク タ と 同 じ にな り ます。 こ の 終了点は、 方向が alpha (横書 き ) の場合は (x, y) に width を加えた点にな り 、 方向が -90° (縦書 き ) の場合は fontsize を加え た点にな り ます。 > unknown フ ィ ール ド は通常は false(C・C++ では 0)ですが、ただ し 元のグ リ フ が Unicode にマ ッ プする こ と がで き ないために unknownchar オプシ ョ ンに よ る 指定キ ャ ラ ク タ に 置 き 換え ら れた と き は値 true (C ・ C++ では 1) を持ち ます。 こ の フ ィ ール ド を用い る と 、 ク エ ス チ ョ ン マー ク やスペース な ど のあ り がちな キ ャ ラ ク タ を unknownchar と し て指定 し た よ う な場合に、 実際の文書の内容 と 置 き 換え キ ャ ラ ク タ と を区別す る こ と が可能にな り ます。 > attributes フ ィ ール ド は、TET の内容分析アルゴ リ ズ ムで決定 さ れた下付き ・上付 き ・ ド ロ ッ プキ ャ ッ プ ・ 影付 き 状態に関す る 情報を内容 と し て持ち ます。 > (x, y) 両フ ィ ール ド は、 そのグ リ フ の参照点の位置を指 し ます。 こ の参照点は横書 き で はグ リ フ矩形の左下隅にな り 、 縦書 き では上端中央にな り ます (79 ページの 6.3.1 「日 中韓エン コ ーデ ィ ン グ ・ CMap」 参照)。 無形キ ャ ラ ク タ については、 ページ上に対応す る グ リ フ がないので、 点 (x, y) は も っ と も 最近の有形キ ャ ラ ク タ の終了点を指 し ます。 y の値は topdown ページオプシ ョ ンに依存 し ます。 > width フ ィ ール ド は、 そのグ リ フ に対応す る フ ォ ン ト メ ト リ ッ ク と 文字間隔 ・ 水平倍率 等のテ キ ス ト 出力パ ラ メ タ 群 と に従っ た グ リ フ の幅を表 し ます。 こ う し たパ ラ メ タ が 次のグ リ フ の位置を制御す る ので、 隣 り 合 う 2 つのグ リ フ の参照点間の間隔は width と は異な る 場合があ り ます。 ゼ ロ 幅キ ャ ラ ク タ の場合 width はゼ ロ にな る こ と があ り ます。 逆に斜体テ キ ス ト 等、 実際のア ウ ト ラ イ ンの幅がそのグ リ フ の width 値 よ り 広 く な る 場合 も あ り ます。 無形キ ャ ラ ク タ の場合 width は 0 にな り ます。 6.2 ページ と テキス ト の視覚情報 75 ascender capheight font size baseline descender 図 6.4 フ ォ ン ト 固有 メ ト リ ッ ク > 角度 alpha は、 行内のテ キ ス ト の進行方向を与え ます。 こ れは、 標準方向か ら の偏移で 表 さ れます。 こ の標準方向は横書 き では 0° にな り 、 縦書き では -90° にな り ます (縦書 き について詳 し く は後述)。 よ っ て角度 alpha は、 通常の横書 き テ キ ス ト と 通常の縦書 き テ キ ス ト に対 し ては と も に 0° にな り ます。 alpha ・ beta の値は topdown ページオプ シ ョ ンに依存 し ます。 > 角度 beta は、 斜体 (擬似 イ タ リ ッ ク ) テ キ ス ト 等の、 テ キ ス ト にかかっ た傾斜を表 し ます。 こ の角度は alpha に対す る 垂線か ら 測 ら れます。 通常の正立 し た テ キ ス ト に対 し ては 0° にな り ます (横書 き で も 縦書 き で も )。 beta の絶対値が 90° を超え る 場合、 そ のテ キ ス ト はベース ラ イ ン を軸に反転 し て裏返っ てい る こ と にな り ます。 > fontid フ ィ ール ド は、そのグ リ フ に対 し て用い ら れてい る フ ォ ン ト の pCOS ID を持ち ま す。 こ の ID を用い る と 、 フ ォ ン ト 名 ・ 埋め込み状況 ・ 記述方向 (横書 き か縦書 き か) と いっ た詳 し い フ ォ ン ト 情報を取得す る こ と がで き ます。 pCOS リ フ ァ レ ン ス に、 こ う し た フ ォ ン ト 情報取得のためのサンプル コ ー ド があ り ます。 > fontsize フ ィ ール ド は、 テ キ ス ト のサ イ ズ を ポ イ ン ト 単位で表 し ます。 こ れは正規化 さ れ る ので、 つねに正の値にな り ます。 > textrendering フ ィ ール ド は、 描線 ・ 塗 り ・ 不可視等、 グ リ フ の レ ン ダ リ ン グの種類を 表 し ます。 こ れは PDF ページ記述について定義 さ れてい る テ キ ス ト レ ン ダ リ ン グモー ド の数値を反映 し ます (177 ページの表 11.13 を参照)。 不可視のテ キ ス ト はデフ ォ ル ト では抽出 さ れますが、 open_page( ) で ignoreinvisibletext オプシ ョ ン を用いればそ う でな く す る こ と も で き ます。 フ ォ ン ト 固有 メ ト リ ッ ク TET は、 PostScript と PDF が用いてい る グ リ フ ・ フ ォ ン ト メ ト リ ッ ク シ ス テ ム を用いてい ます。 こ こ で簡単に説明 し ま し ょ う 。 文字サ イ ズには通常、 キ ャ ラ ク タ の各部が重な り 合わないために必要な、 隣 り 合 う 行 ど う し の最小限の間隔が選ばれます。 文字サ イ ズは一般に、 フ ォ ン ト 内の個々のキ ャ ラ ク タ よ り も 大 き く な り ます。 なぜな ら 、 文字サ イ ズはアセ ン ダ と デ ィ セ ン ダにわた る う え、 さ ら に行間の追加のア キが加わ る 場合 も あ る か ら です。 キ ャ ッ プハイ ト は、 多 く の欧文フ ォ ン ト の T や H の よ う な大文字の高 さ です。 x ハイ ト は、 多 く の欧文フ ォ ン ト の x の よ う な小文字の高 さ です。 アセ ン ダは、 多 く の欧文フ ォ ン ト の f や d の よ う な小文字の高 さ です。 デ ィ セ ン ダは、 多 く の欧文フ ォ ン ト の j や p の よ う な小文字のベース ラ イ ンか ら 下端ま での間隔です。 デ ィ セ ン ダは通常、 負の値です。 76 6 章 : テキス ト 抽出 x ハイ ト ・ キ ャ ッ プハイ ト ・ アセ ン ダ ・ デ ィ セ ン ダの値は文字サ イ ズの 1000 分の 1 を単 位に測 ら れます。 こ れ ら の値はフ ォ ン ト に よ っ て異な っ てお り 、 pCOS イ ン タ フ ェース で取得で き ます。 た と えば、 以下の コ ー ド はアセ ン ダ と デ ィ セ ン ダの値を取得 し ます : /* アセンダとディセンダの値を取得 */ path = "fonts[" + i + "]/ascender"; System.out.println("アセンダ=" + p.pcos_get_number(doc, path)); path = "fonts[" + i + "]/descender"; System.out.println("ディセンダ=" + p.pcos_get_number(doc, path)); なお、 ア セ ン ダ等の フ ォ ン ト メ ト リ ッ ク 値は、 こ の フ ォ ン ト に よ る グ リ フ に対 し て get_ char_info( ) を呼び出 し た後にのみ取得す る べ き です。 言い換えれば、 get_char_info( ) か ら 返 さ れた フ ォ ン ト ID を用い る こ と は安全ですが、 fonts[] 配列内のすべての フ ォ ン ト を評 価す る こ と は必ず し も 埋め込 ま れた フ ォ ン ト デー タ か ら の メ ト リ ッ ク 値 を与えず、 PDF FontDescriptor 辞書か ら の不正確な値を与え る 可能性があ り ます。 詳 し く は pCOS リ フ ァ レ ン ス を参照 し て く だ さ い。 グ リ フ と 単語の終了点 ハ イ ラ イ ト を正 し く 行 う ためには、 単語内の末尾キ ャ ラ ク タ の 末尾位置が必要にな り ます。 get_char_info( ) が返す開始点座標 x, y と width ・ alpha 値を 用いれば、 横書 き でのグ リ フ の終了点を、 すなわちそのグ リ フ のア ド バン スベ ク ト ルの終 点 (グ リ フ枠の右下隅) を決定す る こ と がで き ます : xend = lrx = x + 幅 * cos(alpha) yend = lry = y + 幅 * sin(alpha) 通常の横書 き テ キ ス ト (すなわち alpha=0) では、 こ れは次の形に省略で き ます : xend = lrx = x + 幅 yend = lry = y よ り 一般的には、 グ リ フ枠のサ イ ズ を、 その右上隅の座標を決定す る こ と に よ っ て算出で き ます ( こ の算式は、 グ リ フ が角度 beta に よ っ て斜形化 さ れてい る 可能性を考慮に入れ てい ません) : urx = x + 幅 * cos(alpha) - 向き * 高さ * sin(alpha) ury = y + 幅 * sin(alpha) + 向き * 高さ * cos(alpha) こ こ で、 topdown=true な ら ば向き =-1、 topdown=false な ら ば向き =1 です (73 ページの 「下向 き 座標系」 参照)。 高 さ の値は文字サ イ ズ と フ ォ ン ト の幾何情報に依存 し ます。 下記 は、 広 く 用い ら れてい る 多 く の フ ォ ン ト について、 使え る 値を与え ます (アセ ン ダ値の取 得については 76 ページの 「フ ォ ン ト 固有 メ ト リ ッ ク 」 を参照) : 高さ = 文字サイズ * アセンダ / 1000 多 く のグ ラ フ ィ ッ ク 開発環境において、 グ リ フ変換は以下の よ う に表す こ と がで き ます : translate(x,y); rotate(alpha); skew(0, -beta); 6.2 ページ と テキス ト の視覚情報 77 if (abs(beta) > 90) scale(1 -1); こ れ ら の変換を行な っ た後は、 グ リ フ枠の右上隅は以下の よ う に表す こ と がで き ます : urx = x + 幅 ury = y + 向き * 高さ 縦書 き でのグ リ フ 計算 う に行われます : 縦書 き の日中韓テ キ ス ト については、 終了点の計算は以下の よ xend = x yend = y - 文字サイズ グ リ フ枠の左上隅 と 右下隅は以下の よ う に算出で き ます : ulx = x - 幅/2 * cos(alpha) uly = y - 幅/2 * sin(alpha) lrx = ulx + 幅 * cos(alpha) + 向き * 文字サイズ * sin(alpha) lry = uly + 幅 * sin(alpha) - 向き * 文字サイズ * cos(alpha) こ こ で、 topdown=true な ら ば向き =-1、 topdown=false な ら ば向き =1 です (73 ページの 「下向 き 座標系」 参照)。 78 6 章 : テキス ト 抽出 6.3 日本語 ・ 中国語 ・ 韓国語テキス ト 6.3.1 日中韓エ ン コ ーデ ィ ン グ ・ CMap TET は日本語 ・ 中国語 ・ 韓国語 (日中韓) のテ キ ス ト に対応 し てお り 、 横書 き ・ 縦書 き の、 任意のエン コ ーデ ィ ン グ (CMap) の日中韓テ キ ス ト を Unicode に変換 し ます。 TET は Adobe のすべての日中韓キ ャ ラ ク タ 集合に対応 し てい ます : > 日本語 : Adobe-Japan1 ∼ 6 > 中国語繁体字 : Adobe-CNS1 ∼ 5 > 中国語簡体字 : Adobe-GB1 ∼ 5 > 韓国語 : Adobe-Korea1 ∼ 2 こ れ ら の PDF CMap は、今日用い ら れてい る すべての日中韓キ ャ ラ ク タ エン コ ーデ ィ ン グ を カバー し てい ます。 た と えば Shift-JIS ・ EUC ・ Big-5 ・ KSC 等、 多数のエン コ ーデ ィ ン グです。 注記 日中韓テキス ト を抽出するには、 TET に同梱の CMap フ ァ イル群の場所を、 7 ページの 0.1 「ソ フ ト ウ ェ ア を イ ン ス ト ール」 に従 っ て設定する必要があ り ます。 日中韓フ ォ ン ト の名前で、 ロ ケール依存のエン コ ーデ ィ ン グで書かれてい る も の も (ShiftJIS エン コ ーデ ィ ン グの日本語フ ォ ン ト 名等)、 Unicode に正規化 さ れます。 単語検出機能 は、 日中韓のすべての表意キ ャ ラ ク タ を独立の単語 と 見な し ますが、 ただ し カ タ カナは単 語境界 と 見な し ません (連続す る カ タ カナは ま と めて 1 個の単語 と し て扱い ます)。 6.3.2 縦書 き TET は横書き に も 縦書 き に も 対応 し てお り 、それぞれについて適切な メ ト リ ッ ク 計算をす べて行い ます。 縦書 き のテ キ ス ト を扱 う 際には以下の こ と に留意 し て下 さ い。 > グ リ フ の参照点は縦書 き の場合にはグ リ フ矩形の上端中央にあ り ます。 テ キ ス ト の位 置は下へ向か っ て進み ます。 その進行幅はフ ォ ン ト サ イ ズ と 文字間隔に よ っ て決定 さ れ、 グ リ フ幅には依存 し ません (図 6.3 参照)。 > 角度 alpha は通常の縦書 き テ キ ス ト については 0° です。いいかえれば、縦書 き の フ ォ ン ト で alpha=0° な ら ば下へ、 すなわち -90° の方向に向かっ て進む と い う こ と です。 > 上述の違いのため、ク ラ イ ア ン ト コ ー ド 側では下記の pCOS コ ー ド を用いて記述方向を 考慮に入れ る 必要があ り ます (テ キ ス ト が縦に並んでい る か ら と い っ て、 それが実際 には縦書 き の フ ォ ン ト を用いてい る と は限 ら ない こ と に留意 し て下 さ い) : count = p.pcos_get_number(doc, "length:fonts"); for (i=0; i < count; i++) { if (p.pcos_get_number(doc, "fonts[" + id + "]/vertical")) { /* フォントは縦書きを用いている */ vertical = true; } } > 縦書 き のテ キ ス ト と 句読点の回転済みグ リ フは、それぞれ対応す る 未回転 Unicode キ ャ ラ ク タ へマ ッ プ さ れ ます。 回転済みキ ャ ラ ク タ を温存す る には下記の文書オプシ ョ ン を用い ます : decompose={vertical=_none} 6.3 日本語 ・ 中国語 ・ 韓国語テキス ト 79 6.3.3 日中韓分解 : narrow ・ wide ・ vertical 等 Unicode と 多 く の レ ガシエン コ ーデ ィ ン グでは、 全角 と 半角のキ ャ ラ ク タ と い う 概念が使 え ます (ダブルバ イ ト ・ シ ン グルバ イ ト キ ャ ラ ク タ と 呼ばれ る 時 も あ り ます) 。 デフ ォ ル ト では TET は、 全角 ・ 半角キ ャ ラ ク タ を それぞれ対応す る 標準幅のキ ャ ラ ク タ へ置 き 換 え る Unicode 分解 wide ・ narrow を行い ます。 元の全角 ・ 半角キ ャ ラ ク タ を温存す る には、 decompose 文書オプシ ョ ン を用いてそれ ぞれの分解を無効化 し ます : decompose={wide=_none narrow=_none} 同様に、 small ・ square ・ vertical 分解 も 日中韓キ ャ ラ ク タ に対 し て効力を持ち ます。 こ れ ら の分解は (wide と narrow も 含めて) デフ ォ ル ト ではすべて有効にな っ てい ますので、 キ ャ ラ ク タ はそれぞれ対応す る 標準的キ ャ ラ ク タ へ変換 さ れます。元のキ ャ ラ ク タ を温存 す る には、 それぞれの分解を無効化 し ます。 下記の文書オプシ ョ ンはすべての分解を無効 化 し ます : decompose={none} 表 6.1 に、 日中韓分解を例 と と も に示 し ます。 分解について詳 し く は、 99 ページの 7.3.2 「Unicode 分解」 を参照 し て く だ さ い。 表 6.1 日中韓互換分解の例 (decompose オプ シ ョ ンのサブオプ シ ョ ン) 分解名 narrow small square 80 説明 対象 Unicode キ ャ ラ ク タ 半角キ ャ ラ ク タ U+FF61 ∼ U+FFDC、 U+FFE8 ∼ U+FFEE CNS 11643 互換の ための小型字体 U+FE50 ∼ U+FE6B 日中韓の組文字 U+3250、 U+32CC ∼ U+32CF、 U+3300 ∼ U+3357、 U+3371 ∼ U+33DF、 U+337B ∼ U+337F、 U+33FF、 U+1F131 ∼ U+1F14E、 U+1F190、 U+1F200、 U+1F210 ∼ U+1F231 6 章 : テキス ト 抽出 分解が有効の と き (デ フ ォ ル ト ) 分解が無効の と き ዏ ᩀ U+30F2 U+FF66 ᤸ U+002C U+FE50 ኊ ዊ ᑐ U+30AD U+30ED U+3314 6.4 双方向ア ラ ビ ア文字 ・ ヘ ブ ラ イ 文字テキス ト TET は、ア ラ ビ ア文字やヘブ ラ イ 文字 と いっ た右書 き 用字系に よ る 文書か ら テ キ ス ト を正 し く 抽出す る ために、 追加の処理を行い ます。 こ う し た用字系では し ば し ば左書 き テ キ ス ト が挿入 さ れますので (数等) 、 その よ う な文書は、 双方向であ る と いい ます。 双方向テ キ ス ト の抽出には、 以下に説明す る 処理ス テ ッ プの一つない し 複数が関与 し ます。 6.4.1 双方向の一般的性質 右書 き ・ 双方向テキス ト を並べ替え 右書 き の並び と 左書 き の並びは、 論理的な テ キ ス ト の正 し い並びを形成す る よ う 並べ替え る 必要があ り ます。 粒度が word 以上の場合、 下 記のページオプシ ョ ン を用い る と 、 TET はテ キ ス ト を論理順に発出 し ます ( こ れがデフ ォ ル ト 設定です) : contentanalysis={bidi=logical} 双方向処理は下記ページオプシ ョ ンで明示的に無効化す る こ と も で き ます : contentanalysis={bidi=visual} ページの優勢テキス ト 向 き を決定 双方向並べ替えは、 単語内のキ ャ ラ ク タ 群 と 行内の 単語群に対 し て効力を持つばか り ではな く 、それ以外のページ レ イ ア ウ ト 認識の諸側面に 対 し て も 効力を持ち ます。 混在双方向行は場合に よ っ ては、 ページ全体が右書 き なのか左 書 き なのか を考慮に入れ る こ と な し には安心 し て並べ替えで き ない こ と も あ り ます。 こ の 決定を自動的に行 う ために、 TET はページの優勢テ キ ス ト 向 き を調べ、 そのページが主に 左書 き と 見なすべ き かそれ と も 主に右書 き と 見なすべ き かにそのアルゴ リ ズ ム を合わせ ます。 こ の決定は bidilevel オプシ ョ ン で上書 き す る こ と も で き ます。た と えば下記のオプシ ョ ン リ ス ト は、 テ キ ス ト の大多数が左書 き のページ上であ っ て も 右書き 処理を強制 し ます : contentanalysis={bidilevel=rtl} グ リ フ 順序 get_char_info( ) と TETML 内の Glyph 要素に よ っ て返 さ れ る グ リ フ情報は、 つねに視覚的順序に従っ て、すなわち普通の水平ベース ラ イ ンについては左書 き と し て並 べ ら れます。 こ の左書 き グ リ フ順序に よ っ て、 ク ラ イ ア ン ト アプ リ ケーシ ョ ンは、 テ キ ス ト の双方向状態を調べ る 必要な し に決め打ちの順序で グ リ フ座標を受け取 る こ と がで き ます。 こ の動作は、 実際のテ キ ス ト 向 き は右書 き であ る と い う 事実に も かかわ ら ず、 ア ラ ビ ア文字やヘブ ラ イ 文字の フ ォ ン ト 内のグ リ フは概 し て、その左辺に参照点があ り 右へ進 行 し てい る と い う 現実を反映 し てい ます。 6.4.2 ア ラ ビ ア文字テキス ト を後処理 ア ラ ビ ア文字の表示形 を正規化 し 合字 を分解 ア ラ ビ ア文字のキ ャ ラ ク タ は、 最高 4 種 類の形で存在 し てい ます。 単独形 ・ 語頭形 ・ 語中形 ・ 語尾形です。 こ れ ら の形は、 意味的 には同一のキ ャ ラ ク タ を表 し てい ますが、別々の Unicode 値を持っ てい る 場合があ り ます。 デフ ォ ル ト では TET は、 すべての表示形を、 それぞれ対応す る 正準形へ変換 し ます。 表 6.2 に示す よ う に、 decompose オプシ ョ ン を用いて表示形を温存す る こ と も で き ます (99 ページの 7.3.2 「Unicode 分解」 を参照)。 PDF 文書では各表示形は、 単独形の Unicode キ ャ ラ ク タ へマ ッ プ さ れてい る こ と も あ れば、 表示形の う ちの一つ (た と えばその文書の ToUnicode CMap 内の) へマ ッ プ さ れて 6.4 双方向ア ラ ビ ア文字 ・ ヘブ ラ イ文字テキス ト 81 い る こ と も あ る ため、 た と え分解が無効化 さ れていて も 、 出力が表示形を含む こ と を TET は保証はで き ません。 表 6.2 ア ラ ビ ア文字の表示形を decompose オプ シ ョ ン で処理 説明 と オプ シ ョ ン リ ス ト 語尾形 ・ 語頭形 ・ 単独形 ・ 語中形を分解 : decompose オプ シ ョ ン な し (デ フ ォル ト ) または decompose=none または decompose= {final=_all medial=_all initial=_all isolated=_all} 分解前 ᦒ ҷ U+FEB2 U+0633 ᦓ ҷ U+FEB3 U+0633 ᡤ U+FD0E 語尾形 ・ 語頭形 ・ 単独形 ・ 語中形を温存 : decompose= {final=_none medial=_none initial=_none isolated=_none} 分解後 (論理順で) ҷ ҵ U+0633 U+0631 ᦔ ҷ U+FEB4 U+0633 ᦒ ᦒ U+FEB2 U+FEB2 ᦓ ᦓ U+FEB3 U+FEB3 ᡤ ᡤ U+FD0E U+FD0E ᦔ ᦔ U+FEB4 U+FEB4 ア ラ ビ ア文字の タ ト ウ ィ ールキ ャ ラ ク タ を除去 タ ト ウ ィ ール キ ャ ラ ク タ U+0640 (カ シーダ と も 呼ばれます) は、 単語を伸ば し て行を埋めつ く す よ う にす る ために頻繁に用い ら れます。 タ ト ウ ィ ールはそれ自体は何のテ キ ス ト 情報 も 持ち ませんので、 通常 こ れは、 抽出 さ れ る テ キ ス ト 内では必要ではあ り ません。 表 6.3 に示す よ う に、 fold オプシ ョ ン を 用いて タ ト ウ ィ ールキ ャ ラ ク タ を温存す る こ と も で き ます (96 ページの 7.3.1 「Unicode 字 形統合」 を参照)。 表 6.3 タ ト ウ ィ ールキ ャ ラ ク タ U+0640 を fold オプ シ ョ ン で処理 説明 と オプ シ ョ ン リ ス ト ア ラ ビ ア文字の タ ト ウ ィ ールキ ャ ラ ク タ を除去 : fold オプ シ ョ ン な し (デ フ ォ ル ト ) または fold={{[U+0640] remove}} または fold={default} ア ラ ビ ア文字の タ ト ウ ィ ールキ ャ ラ ク タ (デ フ ォ ル ト では除 去 さ れる) を温存 : fold={{[U+0640] preserve}} 82 6 章 : テキス ト 抽出 字形統合前 ҿ U+0640 字形統合後 なし ҿ ҿ U+0640 U+0640 6.5 内容分析 PDF 文書は、 テ キ ス ト の個々のキ ャ ラ ク タ のページ上におけ る 位置のみな ら ず、 そのセマ ン テ ィ ッ ク ス (Unicode マ ッ ピ ン グ) を も 提供 し ます。 し か し 一般に PDF 文書では、 単 語 ・ 行 ・ コ ラ ム ・ その他高次のテ キ ス ト ユニ ッ ト に関する 情報は伝えて く れません。 ペー ジ上のテ キ ス ト を構成す る それぞれの断片には、 個々のキ ャ ラ ク タ や音節や行、 ない し そ れ ら の任意の混合が含まれてい る 可能性があ り ますが、明示的に単語や行や コ ラ ムの始ま り や終わ り を示す印はそ こ には一切ついていないのです。 さ ら に悪い こ と には、 ページ上のテ キ ス ト 断片の順序は、 論理的な (読む) 順序 と は 違っ てい る 可能性があ り ます。テ キ ス ト の各部分をページ上に配置す る 際には規則な ど何 も ないのです。 た と えば 2 段組みのページの場合で も 、 その内容の生成順はまず左 コ ラ ム の 1 行目、 次は右 コ ラ ムの 1 行目、 左 コ ラ ムの 2 行目、 右 コ ラ ムの 2 行目、 … と な っ てい る か も し れません。 が、 論理的な順序な ら ば、 まず左 コ ラ ム内のテ キ ス ト をすべて処理 し た後に右 コ ラ ムのテ キ ス ト を処理 し なければな ら ないわけです。 こ の よ う な文書か ら テ キ ス ト を抽出す る 場合には、 ただ PDF ページ上の命令群を再生 し ていただけでは、 一般に は望ま し か ら ぬ結果を も た ら し ます。 テ キ ス ト の論理構造が失われてい る か ら です。 TET の内容解析エン ジ ンは、 テ キ ス ト 断片の内容 ・ 位置 ・ 関係を解析 し て、 以下の目 標を達成 し よ う と し ます : > キ ャ ラ ク タ 群か ら 単語を再構成 し 、単語間に区切 り キ ャ ラ ク タ を (望まれていれば) 挿 入 > 冗長テ キ ス ト を除去 (た と えば影付 き に見せ る ためだけのダブ り 等) > 複数行に ま たがっ てハ イ フ ネーシ ョ ン さ れてい る 単語の各部を再結合 > テ キ ス ト の コ ラ ム (区域) を認識 > 区域内のテ キ ス ト 断片を ソ ー ト 。 ページ内の区域 も ソ ー ト こ れ ら の動作について以下詳 し く 説明 し ます。 こ う し た内容処理を制御す る オプシ ョ ンに ついて も 解説 し ます。 テキス ト の粒度 open_page( ) で granularity オプシ ョ ン を用い る と 、 get_text( ) を 1 回呼 び出すご と に返 さ れ る テ キ ス ト の量を指定す る こ と がで き ます。 > granularity=glyph と 設定す る と 、各断片はそれぞれ 1 つのグ リ フ を マ ッ プ し た結果を持 ち ます。 こ れは複数のキ ャ ラ ク タ にな る こ と も あ り ます (合字の場合等)。 こ のモー ド では内容分析は無効に さ れ、 TET は、 ページ上の元通 り のテ キ ス ト 断片を その元通 り の順序の ま ま 返 し ま す。 こ れは最 も 速いモー ド ではあ り ま すが、 こ れが有用なのは、 TET ク ラ イ ア ン ト 側で精巧な後処理を行お う と す る と き のみです (あ る いはテ キ ス ト の論理構造には関心がな く て位置にのみ興味があ る と き )。 なぜな ら こ のモー ド ではテ キ ス ト がページ全体に散 ら ばっ て し ま っ てい る 可能性があ る か ら です。 > granularity=word と 設定す る と 、単語検出機能アルゴ リ ズ ムがキ ャ ラ ク タ 群を ま と めて 論理的な単語を再構成 し ます。 各断片はそれぞれ 1 つの単語を持ち ます。 孤立 し た句 読点 (カ ン マ ・ コ ロ ン ・ ク エ ス チ ョ ン マー ク ・ ク オー ト 等) はデフ ォ ル ト では独立 し た断片 と し て返 さ れ、 連続す る 句読点キ ャ ラ ク タ は一個の単語 と し て グループ化 さ れ ます (ピ リ オ ド キ ャ ラ ク タ を連続 さ せて点線の よ う に見せかけてい る 場合等)。ただ し 、 句読点処理は変更す る こ と も 可能です (後述の 「単語境界検出」 を参照)。 > granularity=line と 設定す る と 、 単語検出機能に よ っ て認識 さ れた単語群を ま と めて行 を再構成 し ます。 ハ イ フ ン除去が有効の と き (デフ ォ ル ト ) は、 行末でハ イ フ ン で分 割 さ れた単語は再結合 さ れ、 そのハ イ フ ン除去 さ れた完全な単語はその行に繰 り 込ま れます。 6.5 内容分析 83 > granularity=page と 設定す る と 、ページ上に含まれ る すべての単語が 1 つの断片で返 さ れます。 複数の単語 ・ 行 ・ 区域の間には、 選択 さ れた粒度がその単位 よ り 大 き ければ、 それぞれ区 切 り キ ャ ラ ク タ が挿入 さ れます。 た と えば granularity=word の場合、 TET_get_text( ) は呼 び出 さ れ る ご と に単語を き っ か り 1 つずつ返すのですか ら 、区切 り キ ャ ラ ク タ を挿入す る 必要な ど ないわけです。 区切 り キ ャ ラ ク タ を指定す る には、 open_page( ) の wordseparator ・ lineseparator オプ シ ョ ン を用い ます (区切 り キ ャ ラ ク タ を無効にす る には U+0000 を用い ます)。 た と えば : lineseparator==U+000A デフ ォ ル ト では、 granularity=glyph の場合にはすべての内容分析動作が無効に さ れ、 それ 以外の粒度設定では有効に さ れます。 し か し 、 区切 り オプシ ョ ン を用いれば よ り き め細か な制御 も 可能です (後述)。 単語境界検出 単語検出機能は、 glyph を除 く すべての粒度モー ド で有効に さ れ、 ページ 全体にでた ら めな順序で散 ら ばっ てい る か も し れない複数のグ リ フ を ま と めて論理的な 単語を再構成 し ます。 単語境界は 2 つの判定基準に よ っ て認識 さ れます : > 精巧な アルゴ リ ズ ムがグ リ フ ど う し の位置関係を解析 し て、 キ ャ ラ ク タ のグループ を 検出 し 、 単語を再構成 し ます。 こ のアルゴ リ ズ ムは さ ま ざ ま な属性や特例を考慮 し て、 レ イ ア ウ ト が複雑な場合やページ上のテ キ ス ト 順序がば ら ば ら な場合で も 単語を正確 に認識で き る よ う 努め ます。 > スペースや句読点 ( コ ロ ン ・ カ ン マ ・ ピ リ オ ド ・ 括弧等) と い っ た あ る 種のキ ャ ラ ク タ は、 その幅 ・ 位置にかかわ ら ずつねに単語境界 と 認識 さ れ ます。 なお、 日中韓の表 意文字は単語境界 と 認識 さ れ ま す。 カ タ カナは単語境界 と し て扱われ ま せん。 open_ page( ) の punctuationbreaks オプシ ョ ン を false に設定す る と 、 単語検出機能は句読点 キ ャ ラ ク タ を単語境界 と し て扱わな く な り ます : contentanalysis={punctuationbreaks=false} 単語境界検出の際に句読点キ ャ ラ ク タ を無視す る こ と は、 た と えば、 Web URL を扱 う 際 に有用で し ょ う 。 URL では通常、 ピ リ オ ド ・ ス ラ ッ シ ュ キ ャ ラ ク タ は語の一部 と 見な さ れ る か ら です (図 6.5 参照)。 図 6.5 デ フ ォ ル ト 設定 punctuationbreaks=true で は URL は各部に分解 さ れますが (上)、 punctuationbreaks=false では各部はひ と ま と ま り のま ま保持 さ れます (下)。 84 6 章 : テキス ト 抽出 ハ イ フ ン除去 行末でハ イ フ ン 区 切 り さ れ た 単語 と い う も のは通 常、 抽出 し た テ キ ス ト を 論理 レ ベ ルで処理 し た い ア プ リ ケーシ ョ ン に と っ て は好 ま し く あ り ま せん。 そのため TET はハ イ フ ン除去、 す なわちハ イ フ ン区切 り さ れた単語 の各部分の再結合 を 行い ま す。 よ り 正確にい う と 、 行末の単語の末 尾にハ イ フ ン キ ャ ラ ク タ が あ り 、 かつその次の行の最初の単語の先 頭が小文字な ら ば、 ハ イ フ ン は除 去 さ れ、 単語の前半部は次行後半 部 と 結合 さ れ ま す。 ただ し 同 じ 区域内に少な く と も あ と 1 行存在す る 場合に限 り ま す。 ダーシ キ ャ ラ ク タ (ハ イ フ ンではない) は変更 さ れない ま ま温存 さ れます。 ハ イ フ ン区切 り さ れた単語の各部分に変更が加え ら れ る こ と はな く 、ただハ イ フ ンが除去 さ れ る だけで す。ハ イ フ ン除去を無効にす る には、open_page( ) で下記のオプシ ョ ン リ ス ト を用い ます: contentanalysis={dehyphenate=false} 注記 区域の末尾でハイ フ ン区切 り さ れた単語は認識 さ れませんので、ハイ フ ン除去はそれに対 し ては一切行われません (すなわち そのハイ フ ンはテキス ト の中に残 り ます)。 影付 き ・ 擬似太字テキス ト 除去 PDF 文書は と き に、 ページの意味内容には貢献 し ない、 ただあ る 種の視覚効果を生み出すためだけの冗長テ キ ス ト を含んでい ます。影付 き テ キ ス ト 効果を生み出すにはたいてい、テ キ ス ト 本体を少 し ずつ位置をず ら し なが ら 複数複製 し て重ね る と い う 方法が採 ら れます。 こ の各層のテ キ ス ト に不透明な色をつければ、 下層の テ キ ス ト はほ と ん ど隠れ、見え る 部分が影付 き 効果を生み出す よ う に見かけ上見え る ので す。 同様に、 ワ ープ ロ ソ フ ト はと きに 擬似太字テ キ ス ト 生成機能に対応 し て い ま す。 ボール ド フ ォ ン ト が入手不可能な と き に も テ キ ス ト を見かけ上太字に見せかけ る ため、そのテ キ ス ト はページ上に同 じ 色で何度 も 配置 さ れます。その際にほんの少 し 位置をず ら し ていけ ば、 太字テ キ ス ト であ る かの よ う に見せ ら れ る わけです。 擬似影付 き や擬似太字テ キ ス ト 、 ない し 同様の擬似視覚効果は、 テ キ ス ト を抽出 し て 再利用 し よ う と す る 際に困っ た問題をひ き 起 こ し ます。ただ視覚効果のためだけの冗長テ キ ス ト 内容が、ページ内容 と し ては不要であ る に も かかわ ら ず一緒に処理 さ れて し ま う た めです。 単語検出機能が有効に さ れてい る 場合、 デフ ォ ル ト では TET は こ う し た冗長な擬似視 覚効果を認識 し て除去 し ます。 影付 き 除去を無効にする には、 open_page( ) で下記のオプ シ ョ ン リ ス ト を用い ます : contentanalysis={shadowdetect=false} ア ク セ ン ト 付 き キ ャ ラ ク タ 多 く の言語で、 ア ク セ ン ト な ど の分音記号が、 別の キ ャ ラ ク タ のそばに配置 さ れて複合キ ャ ラ ク タ を形成 し ます。TeX をは じ め と す る い く つかの組 版プ ロ グ ラ ムでは、 2 つのキ ャ ラ ク タ (字母キ ャ ラ ク タ と ア ク セ ン ト ) を別々に出力 し て 6.5 内容分析 85 1 個の複合キ ャ ラ ク タ を生成 し ます。 た と えば、 ä キ ャ ラ ク タ を生成す る ために、 まず文 字 a がページ上に配置 さ れ、ついで分音符キ ャ ラ ク タ ¨ がその上に配置 さ れます。TET は こ の状況を検出 し 、 2 個のキ ャ ラ ク タ を再結合 し て正 し い複合キ ャ ラ ク タ を形成 し ます。 86 6 章 : テキス ト 抽出 6.6 レ イ ア ウ ト 分析 TET は、 最 も 可能性の高いテ キ ス ト 抽出順序を決定する ために、 ページ上のテ キ ス ト の レ イ ア ウ ト を分析 し ます。 こ の自動処理は、 い く つかのオプシ ョ ン で支援す る こ と も 可能で す。 処理す る 文書の性質について事前の知識があ る 場合には、 適切なオプシ ョ ン を与え る こ と に よ っ てテ キ ス ト 抽出結果を向上 さ せ る こ と がで き ます。 各種文書ス タ イル さ ま ざ ま な レ イ ア ウ ト や ス タ イ ルの文書を処理す る ために、 い く つ かの内部パ ラ メ タ が利用可能です。 た と えば、 新聞のページは大量のテ キ ス ト が多段組に な っ てい る こ と が多 く 、 事業報告書は余白に注釈が し ば し ば現れ る 、 な ど です。 TET は、 い く つかの種類の文書に対す る 定義済み設定を含んでい ます。 こ れ ら の設定は、 下記の よ う に open_page( ) でオプシ ョ ン リ ス ト を用いて有効にす る こ と がで き ます : docstyle=papers docstyle オプシ ョ ン では以下の種類が利用可能です (表 6.4 にい く つか典型的な文書ス タ イ ルの例を挙げます) : > book : 通常のページに よ る 典型的な書籍レ イ ア ウ ト > business : ビ ジネ ス文書 > fancy : 複雑な、 ま た と き に イ レ ギ ュ ラ ーな レ イ ア ウ ト を持つ、 意匠を凝 ら し たページ > forms : 構造化 さ れた フ ォーム > generic : と く に分類のない最 も 一般的な文書 > magazines : 雑誌の記事。 多 く は 3 段組ない し それ以上で、 画像やグ ラ フ ィ ッ ク がち り ばめ ら れてい る > papers : 多段組 ・ 大紙面 ・ 小活字の新聞 > science : 科学記事。 多 く は 2 段組ない し それ以上で、 画像 ・ 式 ・ 表組な ど がち り ばめ ら れてい る > searchengine : こ の分類は、 入力文書の特定の種類を指す も のではな く 、 TET を検索エ ン ジ ンのための イ ンデ ク サの典型的要請に最適化 し ます。生テ キ ス ト のみを発出 し 、処 理を高速化す る ために、 い く つかの レ イ ア ウ ト 検出機能が無効化 さ れます。 た と えば、 表組 ・ ページ構造認識が無効化 さ れます。 > spacegrid: こ の分類は、 メ イ ン フ レーム シ ス テ ム で よ く 生成 さ れ る リ ス ト 指向の レ ポー ト を対象 と し てい ます。 こ の種の文書の特徴は、 視覚レ イ ア ウ ト が、 テ キ ス ト の明示 的な位置合わせではな く 、 空白キ ャ ラ ク タ に よ っ て作 り 出 さ れてい る こ と です。 こ の 種の文書を処理す る 際には、 い く つかの処理 ス テ ッ プ (影付 き 検出な ど) を ス キ ッ プ し う る ので、 テ キ ス ト 抽出が高速化 さ れえ ます。 最 も 適切な文書ス タ イ ルを選ぶ こ と に よ っ て、 処理を速め、 テ キ ス ト 抽出結果を向上 さ せ ら れ る 可能性があ り ます。 複雑な レ イ ア ウ ト 文書の種類に よ っ ては、 非常に凝っ たページ レ イ ア ウ ト を用い る も のがあ り ます。 た と えば雑誌や定期刊行物では、 TET はページ上の段組間の関係を正 し く 決定す る こ と がで き ない場合があ り ます。 こ の よ う な状況では、 処理時間を長 く かけ る こ と に よ り 、 抽出 さ れ る テ キ ス ト を 改善す る こ と が可能です。 こ れは structureanalysis ・ layoutanalysis ページオプシ ョ ンで制御で き ます。 例 : structureanalysis={list=true bullets={{fontname=ZapfDingbats}}} layoutanalysis = {layoutrowhint={full separation=preservecolumns}} layoutdetect=2 layouteffort=high 6.6 レ イ アウ ト 分析 87 表 6.4 い ろ い ろ な文書ス タ イル docstyle=book docstyle=business docstyle=fancy docstyle=magazines docstyle=papers docstyle=science docstyle=spacegrid 88 6 章 : テキス ト 抽出 表組検出 TET は、 ページ上の表構造を検出 し て、 表組の内容を表行 ・ 列 ・ セルに構造 化 し ます。表組に関 し てページ上で検出 さ れた情報は API に よ っ て直接提供 さ れ る こ と は な く 、 下記の例の よ う に TETML 出力内でのみ利用可能 と な り ます : <Table> <Row> <Cell colSpan="5"> <Para> <Word> <Text>5</Text> <Box llx="317.28" lly="637.14" urx="324.59" ury="650.29"/> </Word> <Word> <Text>.</Text> <Box llx="324.60" lly="637.14" urx="328.25" ury="650.29"/> </Word> <Word> <Text>REFERENCES</Text> <Box llx="335.04" lly="637.14" urx="407.64" ury="647.47"/> </Word> </Para> </Cell> </Row> ... </Table> 6.6 レ イ アウ ト 分析 89 90 6 章 : テキス ト 抽出 7 高度な Unicode 処理 7.1 Unicode の さ ま ざ ま な重要概念 こ の節では、 Unicode に関す る 基本的な情報を提供 し ます。 TET におけ る テ キ ス ト 処理は Unicode 規格に大いに依存 し てい る か ら です。 Unicode Web サ イ ト では さ ら に詳 し い情報 が大量に提供 さ れてい ます : www.unicode.org キ ャ ラ ク タ と グ リ フ テ キ ス ト を扱 う 際には以下の概念をは っ き り 区別す る こ と が重要 にな り ます : > キ ャ ラ ク タ は、 言語の中で情報を伝え る 最小の単位です。 代表例 と し ては ラ テ ン アル フ ァ ベ ッ ト の音素文字や、日本語の音節文字、中国語の表意文字が挙げ ら れます。 キ ャ ラ ク タ は意味を持ち ます。 すなわち意味的な実体であ る と いえ ます。 > グ リ フ は、1 つない し 複数のキ ャ ラ ク タ を表す さ ま ざ ま な図形です。 グ リ フは外観を持 ち ます。 すなわち表象的な実体であ る と いえ ます。 キ ャ ラ ク タ と グ リ フ と の間には一対一の対応は存在 し ません。 た と えば、 合字は 1 つのグ リ フ ですが複数のキ ャ ラ ク タ で表 さ れます。 その一方では、 1 つのグ リ フ を場面に応 じ て 異な る キ ャ ラ ク タ を表すために使い ま わ し た り す る こ と も あ り ます (つま り キ ャ ラ ク タ ど う し の形が同 じ と い う 場合が存在 し ます。 図 7.1 参照)。 TET の Unicode 後処理に よ っ て、 グ リ フ群 と 生成キ ャ ラ ク タ 群 と の関係は さ ら に変わ る こ と も あ り ます。 た と えば、 分解に よ っ て 1 個のキ ャ ラ ク タ が複数のキ ャ ラ ク タ に変換 さ れ る こ と があ り 、 ま た、 字形統合に よ っ て キ ャ ラ ク タ が除去 さ れ る こ と も あ り ます。 こ う し た理由か ら 、キ ャ ラ ク タ と グ リ フ の間にはいかな る 特定の関係を も 前提す る こ と はで き ません。 BMP と PUA Unicode ベース の環境では以下の用語が頻出 し ます : 図 7.1 グ リ フ とキャ ラ ク タ の関係 7.1 Unicode の さ ま ざ ま な重要概念 91 > 基本多言語面 (BMP) は、 Unicode 範囲 U+0000 ∼ U+FFFF 内の コ ー ド 点か ら 成 り ます。 Unicode 規格は、さ ら に多 く の コ ー ド を追加面群に、すなわち範囲 U+10000 ∼ U+10FFFF 内に含んでい ます。 > 私用領域 (PUA) は、 私用のために予約 さ れてい る い く つかの範囲の一つです。 Unicode 規格は こ の範囲内にいかな る キ ャ ラ ク タ も 指定 し てい ませんので、 PUA コ ー ド 点は一 般的なや り と り には使え ません。 基本多言語面は PUA を範囲 U+E000 ∼ U+F8FF 内に 含んでい ます。第十五面 (U+F0000 ∼ U+FFFFD) と 第十六面 (U+100000 ∼ U+10FFFD) は ま る ご と 私用のために予約 さ れてい ます。 さ ま ざ ま な Unicode 符号化形式 (UTF 形式) Unicode 規格 で は、 各 キ ャ ラ ク タ に番号 ( コ ー ド 点) を割 り 当ててい ます。 こ れ ら の番号を コ ン ピ ュ ー タ 処理で利用す る ためには、 こ れ ら を何 ら かの方法で表す必要があ り ます。 Unicode 規格では こ れを符号化形式 と 呼び ます (以前は変換形式 と 呼んでい ま し た) 。 こ の用語はフ ォ ン ト の符号化方式 (エン コ ー デ ィ ン グ) と 混同 し てはいけ ません。 Unicode では以下の符号化形式を定義 し てい ます : > UTF-8: こ れは、コ ー ド 点を 1 ∼ 4 バ イ ト で表す可変長形式です。範囲 U+0000 ∼ U+007F 内の ASCII キ ャ ラ ク タ は範囲 00 ∼ 7F 内のシ ン グルバ イ ト で表 さ れます。範囲 U+00A0 ∼ U+00FF 内の Latin-1 キ ャ ラ ク タ は 2 バ イ ト で表 さ れ、 その第一バ イ ト は必ず 0xC2 か 0xC3 ( こ れ ら の値は Latin-1 では  ・ à を表 し ます) にな り ます。 > UTF-16 : 基本多言語面 (BMP) 内の コ ー ド 点を 16 ビ ッ ト 値 1 個で表 し ます。追加面群内 の コ ー ド 点、 すなわち範囲 U+10000 ∼ U+10FFFF 内の も のは、 16 ビ ッ ト 値の対で表 し ます。 こ の対をサ ロ ゲー ト ペア (代用対) と いい ます。 サ ロ ゲー ト ペア 1 個は、 範囲 D800 ∼ DBFF 内の高位サ ロ ゲー ト 値 1 個 と 、 範囲 DC00 ∼ DFFF 内の低位サ ロ ゲー ト 値 1 個か ら 成 り ます。 高 ・ 低サ ロ ゲー ト 値はサ ロ ゲー ト ペアの一部 と し てのみ現れ る こ と がで き 、 それ以外の場面では現れ る こ と がで き ません。 > UTF-32 : 各コ ー ド 点を 32 ビ ッ ト 値 1 個で表 し ます。 Unicode 符号化スキーム と BOM (Byte Order Mark) コ ン ピ ュ ー タ ア ー キ テ ク チ ャ に よ っ てバ イ ト の順序は異な り ます。 すなわち、 大き な値 (16 ビ ッ ト や 32 ビ ッ ト ) を構成 す る バ イ ト 群を、 最高位バ イ ト を先頭に格納する か (ビ ッ グエンデ ィ ア ン) 、 それ と も 最 低位バ イ ト を最初に格納す る か ( リ ト ルエンデ ィ ア ン) と い う 違いがあ り ます。 ビ ッ グエ ンデ ィ ア ン アーキ テ ク チ ャ の よ く 知 ら れた例は PowerPC であ り 、一方 x86 アーキ テ ク チ ャ は リ ト ルエンデ ィ ア ンです。UTF-8 と UTF-16 はシ ン グルバ イ ト よ り も 大 き な値に基づい てい ますので、 バ イ ト 順序を考慮す る 必要が こ こ で生 じ て き ます。 符号化ス キーム (上述 の符号化形式 と は異な る こ と に留意) は、 符号化形式に加え てバ イ ト 順序を指定 し ます。 た と えば、 UTF-16BE はビ ッ グエンデ ィ ア ンバ イ ト 順序の UTF-16 を意味 し ます。 バ イ ト 順序が事前にわか ら ない場合には、 コ ー ド 点 U+FEFF を用いて指定す る こ と も で き ます。 こ れを BOM (Byte Order Mark) と いい ます。 UTF-8 では BOM は必須ではあ り ませんが、 存在す る こ と も で き 、 その場合はバ イ ト 列を UTF-8 と し て識別す る ために用い る こ と が で き ます。 表 7.1 に、 さ ま ざ ま な符号化形式におけ る BOM の表現を挙げます。 表 7.1 さ ま ざ ま な Unicode 符号化形式における BOM 92 符号化形式 BOM (16 進) UTF-8 EF BB BF WinAnsi での視覚表現1  UTF-16 big-endian FE FF þÿ UTF-16 little-endian FF FE ÿþ UTF-32 big-endian 00 00 FE FF ■■þÿ UTF-32 little-endian FF FE 00 00 ÿþ■■ 7 章 : 高度な Unicode 処理 1. 黒四角■は null バイ ト の意。 組文字 と キ ャ ラ ク タ 列 グ リ フ のなかには、 複数のキ ャ ラ ク タ の列にマ ッ プ さ れ る も の があ り ます。 た と えば合字は、 その構成キ ャ ラ ク タ 群に従っ て複数のキ ャ ラ ク タ にマ ッ プ さ れます。 し か し 組文字は分割 し て よ い場合 と よ く ない場合があ り (図 7.1 の ロ ーマ数字 等)、それはフ ォ ン ト 内 ・ PDF 内の情報に よ っ て決ま る と と も に、decompose 文書オプシ ョ ンに も 依存 し ます (96 ページの 7.3 「Unicode 後処理」 を参照)。 適切な ら ば、 TET は組文字を構成キ ャ ラ ク タ 列に分割 し ま す。 こ のキ ャ ラ ク タ 列は、 get_text( ) が返すテ キ ス ト に組み込まれます。 各キ ャ ラ ク タ ご と に、 その元 と な っ た グ リ フ (群) に関す る 情報は get_char_info( ) で得 る こ と がで き ますが、 その際、 そのキ ャ ラ ク タ がキ ャ ラ ク タ 列内の先頭なのかそれ と も 後続なのか と い う 情報 も 一緒に得 ら れ る よ う にな っ てい ま す。 位置情報はキ ャ ラ ク タ 列内の先頭キ ャ ラ ク タ に対 し てのみ返 さ れ ま す。 キ ャ ラ ク タ 列内の後続キ ャ ラ ク タ は固有の位置情報 ・ 幅情報 と い う も のを一切持た な いので、 先頭キ ャ ラ ク タ と 併せて処理す る 必要があ り ます。 対応グ リ フ を持た ないキ ャ ラ ク タ ページ上のグ リ フは、 そのすべてが 1 つない し 複数 の Unicode キ ャ ラ ク タ にマ ッ プ さ れますが、 逆に TET が出力す る キ ャ ラ ク タ は、 そのす べてが実在のグ リ フ にマ ッ プ さ れてい る と は限 り ません。対応す る グ リ フ を持つキ ャ ラ ク タ を有形キ ャ ラ ク タ (real character) と 呼び、 持た ない も の を無形キ ャ ラ ク タ (artificial character) と 呼びます。 こ の よ う な、 直接対応す る グ リ フ がないのに出力 さ れ る 無形キ ャ ラ ク タ は、 い く つかの種類に分類で き ます。 > 組文字 (上述) は複数の Unicode キ ャ ラ ク タ の列にマ ッ プ さ れますが、 こ の と き 列内の 先頭キ ャ ラ ク タ は実在のグ リ フ に対応 し ますが、 残 り のキ ャ ラ ク タ は対応グ リ フ を持 ち ません。 > lineseparator/wordseparator オプシ ョ ンで挿入 さ れ る 区切 り キ ャ ラ ク タ は、 対応グ リ フ を持たない無形キ ャ ラ ク タ です。 7.1 Unicode の さ ま ざ ま な重要概念 93 7.2 Unicode 前処理 ( フ ィ ル タ リ ン グ) TET は、 有用でな さ そ う なテ キ ス ト を除去す る ためにい く つかの フ ィ ル タ を適用 し ます。 こ れ ら の フ ィ ル タ はテ キ ス ト を、 いかな る Unicode 後処理ス テ ッ プを も 適用す る 前に変更 し ます。 い く つかの フ ィ ル タ はつねに有効であ り 、 それ以外は単語検出機能を必要 と し ま すので、 granularity=word ない し それ以上の場合にのみ有効です。 7.2.1 すべての粒度のための フ ィ ル タ 以下の フ ィ ル タ はつねに有効です。 異常な文字サ イ ズのテキス ト 非常に小 さ な テ キ ス ト や非常に大 き な テ キ ス ト は無視 さ せ る こ と も で き ま す。 た と え ばペー ジ 背景 の 大 き な キ ャ ラ ク タ で す。 上限 ・ 下限 は fontsizerange ページオプシ ョ ンで制御で き ます。 デフ ォ ル ト では、 すべての文字サ イ ズの テ キ ス ト が抽出 さ れます。 下記のページオプシ ョ ンは、 抽出す る テ キ ス ト の文字サ イ ズの範囲を 10 ∼ 50 ポ イ ン ト に制限 し ます。 こ れを外れてい る 文字サ イ ズのテ キ ス ト は無視 さ れます : fontsizerange={10 50} 不可視テキス ト 不可視テ キ ス ト (すなわち textrendering=3 のテ キ ス ト ) はデフ ォ ル ト では抽出 さ れます。 PDF 内のテ キ ス ト は、 textrendering プ ロ パテ ィ 以外に も さ ま ざ ま な理 由で見え な く な っ てい る 可能性があ る こ と に留意 し て く だ さ い。た と えばテ キ ス ト の色が 背景色 と 同一であ る か も し れません し 、テ キ ス ト がページ上の他のオブジ ェ ク ト に隠れて い る か も し れません。 こ こ で記述す る 動作は textrendering=3 のテ キ ス ト にのみ効力を持 ち ます。 こ の PDF 技法は OCR の生成テ キ ス ト に対 し て広 く 用い ら れてい ます。 ス キ ャ ン さ れた ラ ス タ 画像の 「後ろ」 にテ キ ス ト が見え ない形で存在 し てい る のです。 不可視テ キ ス ト は、 get_char_info( ) が返す TET_char_info 構造の textrendering メ ンバ に よ っ て識別す る こ と も で き ます し (177 ページの表 11.13 を参照)、 あ る いは TETML 内 の Glyph/@textrendering 属性に よ っ て識別す る こ と も で き ます。 不可視テ キ ス ト を無視 し たい と き は下記のページオプシ ョ ン を用い ます : ignoreinvisibletext=true 7.2.2 粒度 word ない し それ以上のための フ ィ ル タ 以下の フ ィ ル タ は granularity=word ・ line ・ page に対 し てのみ有効です。 ハ イ フ ン除去 ハ イ フ ン除去は、 ハ イ フ ン を削除 し て、 ハ イ フ ンで分割 さ れていた単語の 各部分を結合 さ せます。 単語 を 複数行に分割す る た め に用い ら れ て い る ハ イ フ ン は、 TET_char_info 構造の attributes メ ンバに よ っ て識別す る こ と も で き ます し (177 ページの表 11.13 を参照)、 あ る いは TETML 内の Glyph/@hyphenation 属性に よ っ て識別す る こ と も で き ます。 ハ イ フ ン除去は下記のページオプシ ョ ンに よ っ て無効化す る こ と がで き ます : contentanalysis={dehyphenate=false} ハ イ フ ン報告 ハ イ フ ン除去が有効にな っ てい る と き 、 生成 さ れ る グ リ フ リ ス ト 内、すな わち get_char_info( ) が返すグ リ フ の リ ス ト 内で、 あ る いは TETML 内の Glyph 要素群で、 ハ イ フ ネーシ ョ ン さ れた単語の各部の間のハ イ フ ン キ ャ ラ ク タ が報告 さ れ る か ど う か を 選ぶ こ と がで き ます。 デフ ォ ル ト ではハ イ フ ンは除去 さ れます。 94 7 章 : 高度な Unicode 処理 し か し 、 応用に よ っ ては、 ページ上のハ イ フ ンの正確な位置を知 る 必要があ る 場合が あ り ます。 た と えば、 TET ク ッ ク ブ ッ ク の highlight_search_terms ・ search_and_replace_text ト ピ ッ ク では、元の単語の上に注釈ま たは置換テ キ ス ト をかぶせ る 際にハ イ フ ン グ リ フ を 考慮に入れてい ます。 こ の よ う な状況の場合には、 下記のページオプシ ョ ン を用いれば、 ハ イ フ ン除去処理に よ っ て検知 さ れたすべてのハ イ フ ン を含め る よ う TET に指示す る こ と がで き ます : contentanalysis={keephyphenglyphs=true} ハ イ フ ンは、get_char_info( ) が返す TET_char_info 構造内の attributes メ ンバの TET_ATTR_ DEHYPHENATION_ARTIFACT フ ラ グ に よ っ て識別す る こ と も で き ま す し (177 ページの表 11.13 を参照)、 あ る いは、 TETML 内で Glyph/@dehyphenation 属性の値 artifact で識別す る こ と も で き ます。 影付 き除去 影付 き や擬似太字 と い っ た視覚効果のためだけの冗長テ キ ス ト は削除 さ れ ます。 影付 き ・ 擬似太字テ キ ス ト は、 TET_char_info 構造の attributes メ ンバに よ っ て識別す る こ と も で き ます し (177 ページの表 11.13 を参照)、あ る いは TETML 内で Glyph/@shadow 属性に よ っ て識別す る こ と も で き ます。 影付 き 除去は下記のページオプシ ョ ンで無効化で き ます : contentanalysis={shadowdetect=false} マ ッ プ な し グ リ フ Unicode へマ ッ プで き ないグ リ フは、 私用領域内のキ ャ ラ ク タ へ置 き 換え ら れます (106 ページの 「マ ッ プ不能グ リ フ」 の項を参照) 。 場合に よ っ ては、 使え る Unicode 値を グ リ フ に割 り 当て る ために必要な充分な情報を PDF 文書が含んでいない (あ る い は情報 が あ っ て も 整合 し て い な い) こ と が あ り ま す。 こ の よ う な 場合 に は、 unknownchar 文書オプシ ョ ンで指定 さ れた キ ャ ラ ク タ が割 り 当て ら れます。 すべての PUA キ ャ ラ ク タ は、 デフ ォ ル ト では Unicode 未知キ ャ ラ ク タ U+FFFD へ置 き 換え ら れ ま す。 こ の動作は、 fold 文書オプシ ョ ン で変え る こ と も で き ま す。 下記のオプ シ ョ ン リ ス ト は、 すべての未知の キ ャ ラ ク タ を、 すな わち PUA キ ャ ラ ク タ と 、 有用な Unicode 値を決定で き なか っ た キ ャ ラ ク タ と を、 除去 し ます : fold={{[:Private_Use:] remove} {[U+FFFD] remove} default} マ ッ プな し グ リ フ (すなわち、 ページ上では見え てい る が、 TET で抽出で き ないキ ャ ラ ク タ ) は、 TET_char_info 構造の unknown メ ンバに よ っ て識別す る こ と も で き ます し 、 あ る いは、 TETML 内で Glyph/@unknown 属性で識別する こ と も で き ます。 7.2 Unicode 前処理 (フ ィ ル タ リ ング) 95 7.3 Unicode 後処理 TET は、抽出 し た テ キ ス ト を構成す る Unicode キ ャ ラ ク タ 群を微調整す る ための さ ま ざ ま な制御手段を提供 し てい ます。 こ の節で述べる 各種の後処理ス テ ッ プは、 Unicode 規格で 定義 さ れてい る も のです。 こ れ ら は TET で利用可能であ り 、 以下の順序で処理 さ れます : > 字形統合は、 fold 文書オプシ ョ ンに よ っ て制御 さ れ、 特定のキ ャ ラ ク タ 群に対 し て温 存 ・ 除去 ・ 置換のいずれか を行い ます。 例 : 単語の分割に用い ら れてい る ハ イ フ ン を 除去。 ア ラ ビ ア文字の タ ト ウ ィ ールキ ャ ラ ク タ を除去。 > 分解は、decompose 文書オプシ ョ ンに よ っ て制御 さ れ、1 個のキ ャ ラ ク タ を 1 個ない し 複 数の等価な キ ャ ラ ク タ へ置 き 換え ます。 例 : 合字を分割。 全角英数 ・ 記号をおのおの 対応す る 非全角キ ャ ラ ク タ へマ ッ プ。 > 正規化は、normalize 文書オプシ ョ ンに よ っ て制御 さ れ、テ キ ス ト を正規化 Unicode 形式 の一つへ変換 し ます。 例 : 字母キ ャ ラ ク タ と 分音キ ャ ラ ク タ を結合 し て通用キ ャ ラ ク タ 化。 オーム記号を ギ リ シ ャ 文字オ メ ガへマ ッ プ。 7.3.1 Unicode 字形統合 字形統合は、 1 個ない し 複数の Unicode キ ャ ラ ク タ を処理 し て、 各キ ャ ラ ク タ に対 し て特 定の操作を適用 し ます。 以下の操作が利用可能です : > キ ャ ラ ク タ を温存。 > キ ャ ラ ク タ を除去。 > 別の (固定の) キ ャ ラ ク タ へ置 き 換え。 字形統合は連鎖 さ れません : 字形統合の出力が、 利用可能な字形統合に よ っ て さ ら に処理 さ れ る こ と はあ り ません。 字形統合は、 Unicode テ キ ス ト 出力に対 し てのみ効力を持ち、 TET_char_info 構造内で、 ま たは TETML の <Glyph> 要素群で報告 さ れ る グ リ フ の集合に対 し ては効力を持ち ません。 た と えば、 あ る Unicode キ ャ ラ ク タ 群が字形統合に よ っ て除去 さ れた場合で も 、その元のキ ャ ラ ク タ 群を生み出 し たそれに対応す る グ リ フ群は報告 さ れ ます。 読みやす く す る ために、以下の表の中の例では、fold オプシ ョ ン リ ス ト のサブオプシ ョ ン を個別に記 し てい ます。 複数の字形統合を適用 し たい と き には、 こ れ ら のサブオプシ ョ ン を連結 し て単一の大 き なfoldオプシ ョ ン リ ス ト にす る 必要があ る こ と に留意 し て く だ さ い。 fold オプシ ョ ン を複数回与え てはいけ ません。 た と えば、 下記は誤 り です : fold={ {[:blank:] U+0020} } fold={ {_dehyphenation remove} } 誤り! 下記のオプシ ョ ン リ ス ト は、 複数の字形統合に対する 正 し い文法を示 し てい ます : fold={ {[:blank:] U+0020 } {_dehyphenation remove} } 字形統合の さ ま ざ ま な例 表 7.2 に、 字形統合の さ ま ざ ま な応用を演示す る さ ま ざ ま な fold オプシ ョ ンの例を挙げます。 こ れ ら のサンプルのオプシ ョ ンは、 open_document( ) に 対す る オプシ ョ ン リ ス ト の中で与え る 必要があ り ます。 TET は、 全 Unicode キ ャ ラ ク タ か 96 7 章 : 高度な Unicode 処理 ら 選択 さ れた部分集合に対 し て字形統合を適用す る こ と も で き ます。 こ れを Unicode 集合 と いい ます。 その文法は、 146 ページの 「Unicode 集合」 で解説 し てい ます。 表 7.2 さ ま ざ ま な fold オプ シ ョ ンの例 説明 と オプ シ ョ ン リ ス ト 字形統合前 字形統合後 1 個の Unicode 集合内のすべてのキ ャ ラ ク タ を除去 ISO 8859-1 (Latin-1) 内のキ ャ ラ ク タ のみを出力内に保持、 すなわち、 基本 欧文ブ ロ ッ ク外のすべてのキ ャ ラ ク タ を除去 : fold={{[^U+0020-U+00FF] remove}} すべての非アル フ ァ ベ ッ ト キ ャ ラ ク タ (句読点 ・ 数字な ど) を除去 : fold={{[:Alphabetic=No:] remove}} 数字以外のすべてのキ ャ ラ ク タ を除去 : fold={{[^[:General_Category=Decimal_Number:]] remove}} Æ U+0104 U+0037 なし なし $ $ U+0041 U+0041 U+0037 U+0037 $ U+0041 すべての未知キ ャ ラ ク タ を、 すなわち、 PUA キ ャ ラ ク タ 群 と 、 有用な Unib code 値が決定で き なかっ たキ ャ ラ ク タ 群 と を除去 (残 り のデ フ ォ ル ト 字形統 U+FFFF 合は再有効化 さ れます) : fold={{[:Private_Use:] remove} {[U+FFFD] remove} default} すべてのダーシ約物キ ャ ラ ク タ を除去 し ます : fold={{[:General_Category=Dash_Punctuation:] remove}} U+002D すべての双方向制御キ ャ ラ ク タ を除去 し ます : fold={{[:Bidi_Control:] remove}} U+200E なし なし なし なし 1 個の Unicode 集合内のすべてのキ ャ ラ ク タ を 1 個の特定のキ ャ ラ ク タ へ置き換え 空白字形統合 : Unicode 空白キ ャ ラ ク タ のすべての種類を U+0020 へマ ッ プ : fold={{[:blank:] U+0020}} b U+00A0 U+0020 ダーシ字形統合 : Unicode ダーシキ ャ ラ ク タ のすべての種類を U+002D へ マ ッ プ : fold={{[:Dash:] U+002D}} ತ U+2011 U+002D すべての未割 り 当てキ ャ ラ ク タ (すなわち、 キ ャ ラ ク タ が割 り 当て ら れてい ない Unicode コ ー ド 点) を U+FFFD へマ ッ プ : fold={{[:Unassigned:] U+FFFD}} b ᪽ U+03A2 U+FFFD 個別のキ ャ ラ ク タ に対 し て特別処理 改行位置のすべてのハイ フ ンキ ャ ラ ク タ を温存 し つつ、 残 り のデ フ ォ ル ト 字 形統合を保持。 こ れら のキ ャ ラ ク タ は TET に よ っ て内部的に識別 さ れていま すので (固定の Unicode プ ロパテ ィ を持つのではな く )、 こ の字形統合の ド メ イ ン を指定するにはキーワー ド _dehyphenation を用います : U+002D U+002D fold={{_dehyphenation preserve}} ア ラ ビ ア文字の タ ト ウ ィ ールキ ャ ラ ク タ (デ フ ォ ル ト では除去 さ れます) を 温存 : fold={{[U+0640] preserve}} さ ま ざ ま な約物キ ャ ラ ク タ をおのおの対応する ASCII キ ャ ラ ク タ へ置き換 え: fold={ {[U+2018] U+0027} {[U+2019] U+0027} {[U+201C] U+0022} {[U+201D] U+0022}} ҿ ҿ U+0640 U+0640 ಯ U+201C U+002D U+0022 7.3 Unicode 後処理 97 デ フ ォ ル ト 字形統合 granularity=glyph の場合を除 き 、TET はデフ ォ ル ト で表 7.3 に挙げ る 字形統合をすべて適用 し ます。カ ス タ ムの字形統合を初期デフ ォ ル ト 字形統合 と 結合す る には、カ ス タ ム字形統合オプシ ョ ン群の後にキーワー ド default を与え る 必要があ り ます。 例: fold={ {_dehyphenation preserve} default } すべてのデフ ォ ル ト 字形統合を明示的に無効化 し たい場合でない限 り 、 fold オプシ ョ ン リ ス ト にはキー ワー ド default を追加す る こ と を推奨 し ます。 表 7.3 fold オプ シ ョ ンのデ フ ォル ト 値一覧 説明 と オプ シ ョ ン リ ス ト 入力例 空白字形統合 : Unicode 空白キ ャ ラ ク タ のすべての種類を U+0020 へマ ッ プ : fold={{[:blank:] U+0020}} b U+00A0 U+0020 私用領域 (PUA) 内のすべてのキ ャ ラ ク タ を未知キ ャ ラ ク タ (デ フ ォル ト で は こ れは U+FFFD ですが、 unknownchar オプ シ ョ ン で変え る こ と も で き ま す) へマ ッ プ : fold={{[:Private_Use:] unknownchar}} ᪽ U+E001 U+FFFD ハイ フ ン除去 さ れた単語の中のすべてのハイ フ ン を除去 : fold={{_dehyphenation remove}} U+002D ア ラ ビ ア モ ジの タ ト ウ ォ ールキ ャ ラ ク タ をすべて除去 : fold={{[U+0640] remove}} U+0640 ҿ すべての制御キ ャ ラ ク タ と 、 Unicode で割 り 当て られていないすべてのキ ャ b ラ ク タ と を除去 (TETML 出力を生成する際には、 こ れら の字形統合は、 他の U+000C U+03A2 すべての字形統合の後つねに行われます) : fold={{[:Control:] remove} {[:Unassigned:] remove}} 98 7 章 : 高度な Unicode 処理 出力 なし なし なし 7.3.2 Unicode 分解 分解は、1 個のキ ャ ラ ク タ を、他の 1 個ない し 複数の等価な キ ャ ラ ク タ 列へ置 き 換え ます。 あ る Unicode キ ャ ラ ク タ が、 他の 1 個ない し 複数のキ ャ ラ ク タ と 実際には同 じ 意味であ り なが ら 、 歴史的理由に よ り Unicode 内で別々の コ ー ド を与え ら れてい る と き (多 く はレ ガ シ符号化形式 と の可逆のか ら みで)、 その Unicode キ ャ ラ ク タ はそのキ ャ ラ ク タ (群) と (互換あ る いは正準) 等価であ る と いい ます。 分解は情報を破壊 し ます。 こ れは、 元のキ ャ ラ ク タ と その等価キ ャ ラ ク タ と の使い分けに関心がない場合には有用です。 し か し 使い分 けに関心があ る 場合には、 その分解は適用す る べ き ではあ り ません。 Unicode 分解に関す る 完全な説明は下記を参照 し て く だ さ い : www.unicode.org/versions/Unicode5.2.0/ch03.pdf#G729 注記 こ こ で用いてい る 「分解」 と い う 用語は、 Unicode 規格で定義 さ れている ものですが、 実 際には多 く の分解は、 1 個のキ ャ ラ ク タ を複数の部分へ分割するのではな く 、 1 個のキ ャ ラ ク タ を別の 1 個のキ ャ ラ ク タ へ変換 し ます。 正準分解 互いに正準等価であ る キ ャ ラ ク タ ま たはキ ャ ラ ク タ 列は、同一の抽象キ ャ ラ ク タ を表現 し てお り 、 し たがっ て必ず同一の体裁 と 動作を持つべき も のです。 よ く あ る 例 と ) と 連結キ ャ ラ ク タ 列 (例 : $ し ては、 合成済みキ ャ ラ ク タ (例 : U+00C4 ɰ ) が挙げ U+0041 U+0308 ら れます : 2 つの表現は互いに正準等価です。 1 つの表現か ら 別の表現へ切 り 替え て も 情 報は失われません。 正準分解は、 1 つの表現を、 正準表現 と 見な さ れ る 別の表現へ置 き 換 え ます。 Unicode コ ー ド チ ャ ー ト 1 では、 正準マ ッ ピ ン グには記号 IDENTICAL TO ิ が付け U+00C4 U+2261 ら れてい ます (キ ャ ラ ク タ テーブルにはな し )。 分解名 <canonical> と 暗黙的に見な さ れま す。 表 7.4 にい く つかの例を挙げます。 表 7.4 正準分解 : decompose オプ シ ョ ンのサブオプ シ ョ ン (正準等価なキ ャ ラ ク タ には、 Unicode コ ー ド チ ャ ー ト で記号 IDENTICAL TO ิ が付け られています) U+00C4 U+2261 分解名 説明 canonical1 正準分解 分解前 U+00C0 分解後 $ ɨ U+0041 U+0300 ᙔ 㨦 U+F9F4 U+6797 വ ˖ U+2126 U+03A9 ቓ വ ቸ വ ቒ ቒ U+3070 U+2126 U+306F U+2126 U+306F U+3099 ᚫ U+FB2F ҂ Ѷ U+05D0 U+05B8 1. デ フ ォ ル ト では こ の分解は、 特定のキ ャ ラ ク タ 群を温存する ために、 すべてのキ ャ ラ ク タ に対 し ては適用 さ れませ ん。 詳 し く は、 98 ページの 「デ フ ォ ル ト 字形統合」 を参照 し て く だ さ い。 1. www.unicode.org/Public/5.2.0/charts/ を参照。 7.3 Unicode 後処理 99 互換分解 互換等価な キ ャ ラ ク タ ど う し は、 同一の抽象キ ャ ラ ク タ を表 し ますが、 その体 裁や動作は互いに異な っ てい る 可能性があ り ます。 例 と し ては、 ア ラ ビ ア文字キ ャ ラ ク タ の単独形 ( ҷ 等) と 位置依存表示形 ( ᦒ ・ ᦔ ・ ᦓ 等) が挙げ ら れます。 互換等 U+0633 U+FEB2 U+FEB4 U+FEB3 価キ ャ ラ ク タ は組版上互いに異な る も のです。 こ の組版情報を除去す る と 、 情報が失われ る 可能性が あ り ま すが、 あ る 種の応用の場合 (検索等) には処理を単純化で き る で し ょ う 。 互換分解は組版情報を除去 し ます。 Unicode コ ー ド チ ャ ー ト では、 互換マ ッ ピ ン グには記号 ALMOST EQUAL TO ป が U+00C4 U+2248 付いてお り 、 その後に、 分解名 (「 タ グ」 と も いい ます) が <noBreak> の よ う に山括弧に く く っ て書かれてい ます。 タ グ名が書かれていない も のについては、 <compat> と 見な さ れます。 こ の タ グ名は、 表 7.5 のオプシ ョ ン名 と 同一です。 い く つかの例に見 ら れ る よ う に、 分解の結果、 1 個のキ ャ ラ ク タ が複数キ ャ ラ ク タ 列へ変換 さ れ る こ と も あ り ます。 注記 表 7.5 の項目はすべて互換分解を記 し ているのに対 し 、 「compat」 タ グは 「他の」 互換分 解のみを、 すなわち特定の名前を持たない も ののみを内容 と し て持ち ます。 注記 PDF 文書によ っ ては、 グ リ フ が、 分解 さ れていない Unicode 値へではな く 、 分解済みキ ャ ラ ク タ 列へすでにマ ッ プ さ れてい る場合 も あ る こ と に留意 し て く だ さ い。 その場合には decompose オプ シ ョ ンは出力に対 し て効力を持ち ません。 分解の さ ま ざ ま な例 TET におけ る 分解は、文書オプシ ョ ン decompose で制御で き ます。 1 種類の分解が、 全 Unicode キ ャ ラ ク タ に対 し てではな く 、 い く つかのキ ャ ラ ク タ に対 し てのみ適用 さ れ る よ う 制限す る こ と も で き ます。 あ る 分解の適用対象 と な る 部分集合を、 その ド メ イ ン と いい ます。 表 7.5 に、 すべての Unicode 分解に対す る サブオプシ ョ ン を例 と と も に挙げます。 以下の decompose オプシ ョ ンの例は、 open_document( ) に対す る オプシ ョ ン リ ス ト の 中で与え る 必要があ り ます。 decompose オプシ ョ ン リ ス ト 内の分解名は表 7.5 か ら 取 ら れ ます。 すべての分解を無効化 : decompose={none} 全角 (ダブルバ イ ト ) ・ 半角キ ャ ラ ク タ を温存 : decompose={wide=_none narrow=_none} すべての正準等価キ ャ ラ ク タ をおのおの対応キ ャ ラ ク タ へマ ッ プ : decompose={canonical=_all} 下記のオプシ ョ ン リ ス ト は circle 分解を有効化 し ますが、 それ以外の分解はすべて無効化 し ます : decompose={none circle=_all} 反対に、 下記のオプシ ョ ン リ ス ト はすべての分解 を有効化 し ま す (なぜな ら 、 他のオプ シ ョ ン を省略す る と デフ ォ ル ト が有効にな る か ら です) : decompose={circle=_all} 100 7 章 : 高度な Unicode 処理 表 7.5 互換分解 : decompose オプ シ ョ ンのサブオプ シ ョ ン一覧 (互換等価なキ ャ ラ ク タ には、 Unicode コ ー ド チ ャ ー ト で記号 ALMOST EQUAL TO ป が付け ら れています) U+00C4 U+2248 分解名 circle compat1 final font fraction1 説明 分解前 分解後 (論理順で) U+3251 U+0032 U+0031 丸囲みキ ャ ラ ク タ その他の互換分解。 例 : 広 く 用い られている合 字 語尾形。 特にア ラ ビ ア文字の フ ォ ン ト バ リ ア ン ト 。 例 : 数学の集合の文字、 ヘブ ラ イ文字の合字 俗用分数字体 ᚏ U+FB01 ᦒ ҷ U+0633 & U+2102 U+0043 ~ isolated 語頭形。 特にア ラ ビ ア文字の 単独形。 特にア ラ ビ ア文字の medial narrow nobreak 語中形。 特にア ラ ビ ア文字の 半角キ ャ ラ ク タ 改行禁止キ ャ ラ ク タ none 明示的に decompose オプ シ ョ ン リ ス ト で指定 さ れていないすべての分解を無効化 small CNS 11643 互換のための小型字体 square sub1 super1 日中韓の組文字 下付き字体 上付き字体 ᦓ ҷ U+0633 ᡤ wide 全角字体 ҷ ᦔ ҷ U+0633 ᩀ ዏ U+FF66 U+30F2 b U+00A0 U+0020 ҵ (すべてのキ ャ ラ ク タ を変更せず温存) ᤸ U+FE50 U+002C ᑐ ኊ ዊ U+3314 U+30AD U+30ED ೢ U+2081 U+0031 l D U+00AA U+0061 റ 縦書き字体 U+0633 U+0631 U+FEB4 U+2122 vertical U+0031 U+2044 U+0034 U+FEB3 U+FD0E L U+0066 U+0069 U+FEB2 U+00BC initial I 7 0 U+0054 U+004D ᤣ ^ U+FE37 U+007B £ £ U+FFE1 U+00A3 1. デ フ ォ ル ト では こ の分解は、 特定のキ ャ ラ ク タ 群を温存する ために、 すべてのキ ャ ラ ク タ に対 し ては適用 さ れませ ん。 詳 し く は、 98 ページの 「デ フ ォ ル ト 字形統合」 を参照 し て く だ さ い。 7.3 Unicode 後処理 101 デ フ ォ ル ト 分解 デフ ォ ル ト では、 fraction 以外のすべての分解が有効にな っ てい ます。 多 く のデフ ォ ル ト 分解は _all ド メ イ ンに対 し て (すなわちすべてのキ ャ ラ ク タ に対 し て) 適用 さ れますが、 い く つかは、 表 7.6 に従っ た、 よ り 小 さ なデフ ォ ル ト ド メ イ ンに対 し て 適用 さ れます。 分解を扱 う 正攻法は正規化に よ る こ と です (103 ページの 7.3.3 「Unicode 正規化」 を参照)。 granularity=glyph の と き は、 Unicode 後処理は完全に無効化 さ れますの で、 その場合には分解はいずれ も 有効にはな り ません。 表 7.6 Unicode 分解 (decompose オプ シ ョ ンのサブオプ シ ョ ン) のデ フ ォ ル ト ド メ イ ン一覧 分解 canonical TET におけるデ フ ォ ル ト canonical={[U+0374 U+037E U+0387 U+1FBE U+1FEF U+1FFD U+2000 U+2001 U+2126 U+212A U+212B U+2329-U+232A]} デ フ ォ ル ト ド メ イ ンは正準重複 (シ ン グル ト ン) を含みますが、 それ以外の正準等価キ ャ ラ ク タ を含みません。 デ フ ォル ト が _all でないのは、 のよ う なキ ャ ラ ク タ を温存する U+00C4 compat ためです。 compat={[U+FB00-U+FB17]} デ フ ォ ル ト ド メ イ ンは欧文 と アル メ ニア文字の合字を含みますが、 それ以外の互換キ ャ ラ ク タ を含みません。 デ フ ォ ル ト が _all で ないのは、 ô のよ う なキ ャ ラ ク タ を温存する た U+0132 fraction めです。 fraction=_none 分数はデ フ ォ ル ト では分解 さ れません。 分解する と 整数部 と 分数部が合わ さ っ て不適切な 数字列にな るおそれがあ るから です。 た と えば、 ク ラ イ ア ン ト ア プ リ ケーシ ョ ンがキ ャ ラ ク タ列 sub super (数値 9.5 を表す) を U+0039 U+00BD と 勘違い し て、 数値 U+0039 U+0031 U+2044 U+0032 (91)/2=45.5 と 解釈 し て し ま う おそれがあ り ます。 sub={[U+208A-U+208E]} super={[U+207A-U+207E]} デ フ ォ ル ト ド メ イ ンは数学記号のみを含みます。 上付き ・ 下付き数字はデ フ ォ ル ト では分 解 さ れません。 こ れは、 上で fraction について述べたの と 同様の数値解釈上の問題を避け る ためです。 商標記号 റ のよ う なキ ャ ラ ク タ はデ フ ォル ト では U+2122 all others 7 0 へ分解 さ U+0054 U+004D れません。 circle=_all final=_all ... vertical=_all wide=_all その他のすべての分解は、 デ フ ォ ル ト ですべてのキ ャ ラ ク タ に対 し て有効にな っ ています。 102 7 章 : 高度な Unicode 処理 7.3.3 Unicode 正規化 Unicode規格では、正準等価 と 互換等価の概念に基づ き ( こ れ ら は99ページの 7.3.2「Unicode 分解」 で説明 し てい ます) 、 4 種類の正規形を定義 し てい ます。 すべての正規形は、 結合 記号を特定の順序に置 き 、 分解 と 合成を異な る 方式で適用 し ます : > 正規形 C (NFC) は、 正準分解の後に正準合成を適用 し ます。 > 正規形 D (NFD) は、 正準分解を適用 し ます。 > 正規形 KC (NFKC) は、 互換分解の後に正準合成を適用 し ます。 > 正規形 KD (NFKD) は、 互換分解を適用 し ます。 正規形 は、 Unicode 規 格 付 録 #15 「Unicode Normalization Forms」 で 定義 さ れ て い ま す (www.unicode.org/versions/Unicode5.2.0/ch03.pdf#G21796 ・ www.unicode.org/reports/tr15/ を参照)。 TET は 4 種類の Unicode 正規形すべてに対応 し てい ます。 Unicode 正規化は normalize 文書オプシ ョ ンで制御で き ます。 例 : normalize=nfc TET はデフ ォ ル ト では正規化を適用 し ません。 decompose オプシ ョ ン と normalize オプ シ ョ ンはかち合 う おそれがあ る こ と か ら 、normalize オプシ ョ ン を none 以外の値に設定す る と デフ ォ ル ト 分解は無効化 さ れます。 正規形の選択はアプ リ ケーシ ョ ン の要請に依存 し ます。 た と えば、 い く つかのデー タ ベース はテ キ ス ト を NFC で受け付け ます。 NFC は、 Web 上の Unicode テ キ ス ト について 推奨 さ れ る 形式で も あ り ます。 表 7.7 に、 さ ま ざ ま な キ ャ ラ ク タ に対す る 正規化の効果を 示 し ます。 表 7.7 Unicode 正規形 : さ ま ざ ま な例 正規化前 NFC U+00C4 U+00C4 $ ɰ U+0041 U+0308 ɰ $ U+0308 U+0041 NFD $ $ $ U+0308 U+0041 ɰ ᚏ ᚏ U+FB01 U+FB01 ೖ ೖ U+0033 U+2075 ഺ U+212B U+00C5 ɰ $ ೖ ɲ റ റ റ U+2122 U+2122 ൘ ൘ ൘ U+2163 U+2163 U+2163 $ L U+0033 U+0035 $ I L U+0066 U+0069 U+0033 U+0035 ɲ U+0041 U+030A 0 U+0054 U+004D , ɰ U+0308 U+0041 $ U+00C5 7 ɰ U+0041 U+0308 U+0308 U+0041 I U+0041 U+030A U+2122 $ U+00C4 ɰ ɰ U+0041 U+0308 U+0066 U+0069 U+0033 U+2075 $ $ U+00C4 U+0308 U+0041 ᚏ NFKD U+0041 U+0308 U+FB01 U+0033 U+2075 ɰ U+0041 U+0308 U+00C4 ɰ NFKC 9 U+0049 U+0056 7 0 U+0054 U+004D , 9 U+0049 U+0056 7.3 Unicode 後処理 103 表 7.7 Unicode 正規形 : さ ま ざ ま な例 正規化前 ᚿ U+FB48 104 NFC Қ NFD ѹ U+05E8 U+05BC Қ NFKC ѹ U+05E8 U+05BC Қ NFKD ѹ Қ U+05E8 U+05BC ѹ U+05E8 U+05BC 閵 閵 ਢ 閵 ਢ U+AC00 U+AC00 U+1100 U+1161 U+AC00 U+1100 U+1161 ᚿ ቅ ᚿ ቅ ቄ ቸ ᚿ ቅ ቄ ቸ U+FB48 U+3062 U+FB48 U+3062 U+3061 U+3099 U+FB48 U+3062 U+3061 U+3099 ᐊ ᐊ ᐊ U+32C9 U+32C9 U+32C9 7 章 : 高度な Unicode 処理 㦗 U+0031 U+0030 U+6708 㦗 U+0031 U+0030 U+6708 7.4 追加キ ャ ラ ク タ と サ ロ ゲー ト Unicode の基本多言語面 (BMP) の外にあ る 追加キ ャ ラ ク タ 、すなわち Unicode 値が U+FFFF を超え る キ ャ ラ ク タ は、 1 つの UTF-16 値では表す こ と がで き ず、 サ ロ ゲー ト ペア と 呼ば れ る 2 つの UTF-16 値を必要 と し ます。 追加キ ャ ラ ク タ の例 と し ては、 U+1DXXX にあ る 数 学記号 ・ 音楽記号や、 U+20000 か ら 始ま る 日中韓の拡張キ ャ ラ ク タ が挙げ ら れます。 TET は追加キ ャ ラ ク タ を解釈 ・ 保持 し 、 それに対応す る UTF-32 値を、 ネ イ テ ィ ブな Unicode 文字列が UTF-16 に し か対応 し ていない言語バ イ ンデ ィ ン グにおいて も 利用可能 に し てい ます。 1 番目のサ ロ ゲー ト 値に対 し て get_char_info( ) が返す uv フ ィ ール ド は、 対応す る UTF-32 値を持ち ます。 こ れを利用すれば、 UTF-32 に対応 し ていない UTF-16 環境で作業を し てい る 場合で も 追加キ ャ ラ ク タ の UTF-32 値を直接利用可能です。 1 番目の (高位) サ ロ ゲー ト と 2 番目の (低位) サ ロ ゲー ト は保持 さ れます。 get_text( ) が返す文字列は 2 個の UTF-16 値を内容 と し て持ち ます。 7.4 追加キ ャ ラ ク タ と サロゲー ト 105 7.5 グ リ フ に対す る Unicode マ ッ ピ ン グ PDF 内のテ キ ス ト は、さ ま ざ ま な フ ォ ン ト やエン コ ーデ ィ ン グ方式に よ っ て表 さ れてい る 可能性があ る のに対 し 、 TET は、 PDF 内の元のテ キ ス ト 表現にかかわ ら ず、 グ リ フ か ら 抽象情報を抽出 し 、 すべてのテ キ ス ト を Unicode キ ャ ラ ク タ へ正規化 し ます。 PDF 内で見 つかっ た情報を、 おのおの対応す る Unicode 値へ変換す る こ と を、 Unicode マ ッ ピ ング と いい、 こ れはテ キ ス ト の意味を理解す る (テ キ ス ト の視覚表現を画面上や紙に展開す る の ではな く ) ために必須です。 正 し い Unicode マ ッ ピ ン グ を与え る ために、 TET は、 PDF 文 書内で見つか る さ ま ざ ま なデー タ 構造を照会 し た り 、 埋め込まれた、 あ る いは外部の フ ォ ン ト フ ァ イ ルを照会 し た り 、 内蔵の、 あ る いはユーザーが与えた テーブルを照会 し た り し ます。 さ ら に TET は、 非標準な グ リ フ名に対 し て Unicode マ ッ ピ ン グ を決定す る い く つ かの方式 も 適用 し ます。 あ ら ゆ る 方策を尽 く し て も なお、 一部のテ キ ス ト が Unicode へマ ッ プで き ない PDF 文 書 も あ り ます。 こ の よ う な場合に対処す る ため、 TET は、 問題のあ る PDF フ ァ イ ルに対 す る Unicode マ ッ ピ ン グ を制御す る ために利用で き る さ ま ざ ま な設定機能を提供 し てい ま す。 マ ッ プ不能グ リ フ PDF 内のテ キ ス ト が Unicode へ う ま く マ ッ プで き ない場合、その原因 は何種類かあ り ます。 た と えば、 Type 1 フ ォ ン ト が未知のグ リ フ名を含んでい る こ と が原 因か も し れ ません。 あ る いは、 TrueType ・ OpenType ・ CID のいずれかの フ ォ ン ト の場合 には、 グ リ フ ID で指定 さ れていて、 フ ォ ン ト ま たは PDF の中に Unicode 値が含まれてい ない こ と が原因か も し れません。 TET はその よ う なマ ッ プな し キ ャ ラ ク タ に対 し て、 私用 領域内の コ ー ド 点を割 り 当て ます。 こ の PUA 値は fold オプシ ョ ンで除去ま たは置 き 換え が可能です。 デフ ォ ル ト では PUA キ ャ ラ ク タ は U+FFFD へ、 すなわち Unicode 未知キ ャ ラ ク タ へマ ッ プ さ れ ま す。 こ の キ ャ ラ ク タ に対 し て自分の コ ー ド は対処す る べ き です。 Unicode マ ッ ピ ン グの問題を意に介 し ない場合であれば、 単に U+FFFD を無視 し て も よ い です し 、 あ る いは下記の文書オプシ ョ ン を用いて こ れを除去する こ と も で き ます : fold={ {[:Private_Use:] remove} } マ ッ プ不能グ リ フ か ど う かを調べ る には、 get_char_info( ) が返す unknown フ ィ ール ド を 利用 し ます。 Unicode マ ッ ピ ン グ制御の概要 TET には、 実際には Unicode 値を持たない PDF 文書か ら 、 それで も 何 と か し てテ キ ス ト を う ま く 抽出で き る よ う 処理す る ための、 さ ま ざ ま な代 替機能が備わっ てい ます。 し か し なが ら それで も なお、 PDF やフ ォ ン ト デー タ の構造内で 充分な情報が得 ら れないためにテ キ ス ト を抽出す る こ と がで き ない文書 と い う も のは存 在 し ます。 TET は、 Unicode マ ッ ピ ン グ情報を追加供給す る ために活用す る こ と ので き る さ ま ざ ま な設定機能を持っ てい ます。 こ の節ではそ う し た機能について解説 し ます。 open_document( ) で glyphmapping オプシ ョ ン を用い る と (160 ページの 11.6 「文書関 数」 を参照)、 グ リ フ に対す る Unicode マ ッ ピ ン グ を何通 り かの方式で制御す る こ と がで き ます。 利用可能な方式の概要を以下に列挙 し ます (組み合わせて利用す る こ と も 可能)。 こ う し た制御は、 フ ォ ン ト ご と に適用す る こ と も で き ま す し 、 1 つの文書内のすべての フ ォ ン ト に対 し て グ ロ ーバルに適用す る こ と も で き ます : > forceencoding サブオプシ ョ ン を用い る と 、 PDF におけ る 定義済みのエン コ ーデ ィ ン グ WinAnsiEncoding ・ MacRomanEncoding が用い ら れ る たびに、 すべて別のエン コ ーデ ィ ン グで処理 さ せ る こ と がで き ます。 > codelist ・ tounicodecmap サブオプシ ョ ン を用い る と 、 Unicode 値の リ ス ト を シ ンプルテ キ ス ト 形式 (codelist リ ソ ース) で与え る こ と がで き ます。 106 7 章 : 高度な Unicode 処理 > glyphlist サブオプシ ョ ン を用い る と 、非標準グ リ フ名を Unicode 値にマ ッ プ し た リ ス ト を与え る こ と がで き ます。 > glyphrule サブオプシ ョ ン を用い る と 、グ リ フ名の数値か ら Unicode 値を アルゴ リ ズ ム的 に導 き 出すための規則を定義す る こ と がで き ます。 encodinghint オプシ ョ ン を用い る と 、 内部規則を制御す る こ と がで き ます。 > 定義済みのエ ン コ ーデ ィ ン グはすでに何ダース も あ り ますが、 それに加え て カ ス タ ム のエン コ ーデ ィ ン グ を定義す る こ と も 可能で、 こ れは encodinghint オプシ ョ ンで、 ま たは glyphrule オプシ ョ ンの encoding サブオプシ ョ ンで利用する こ と がで き ます。 > PDF が充分な情報を与えずフ ォ ン ト が PDF に埋め込まれて も いない と き に外部の フ ォ ン ト か ら Unicode マ ッ ピ ン グ情報が得 ら れ る よ う 設定 し てお く こ と も 可能です。 PDFlib FontReporter Plugin 1 で PDF 文書 を分析 正 し いUnicode マ ッ ピ ン グ テーブルを作 り たい と き 、 それに必要な情報を得 る には、 問題を含むその PDF 文書を分析 し なければ な り ません。 PDFlib GmbH は こ う し た場面で役立つ TET の無償派生製品 PDFlib FontReporter を提供 し てい ま す。 こ れは、 フ ォ ン ト ・ エ ン コ ーデ ィ ン グ ・ グ リ フ の情報を簡単に収集で き る Adobe Acrobat プ ラ グ イ ン です。 こ のプ ラ グ イ ンは、 実際の各グ リ フ に以下の情報を付 し た詳 し い フ ォ ン ト レ ポー ト を作成 し ます。 > その対応す る コ ー ド :16 進の 1 桁目が左端の列に示 さ れ、16 進の 2 桁目が上端の行に示 さ れます。 CID フ ォ ン ト の場合はヘ ッ ダに印字 さ れ る オ フ セ ッ ト を加え る と 、 グ リ フ に対応す る コ ー ド が得 ら れます。 > そのグ リ フ名 : も し あれば。 > そのグ リ フ に対応す る (1 つない し 複数の) Unicode 値 (Acrobat がそれを決定で き る 場 合)。 こ う し た さ ま ざ ま な情報は、 TET のグ リ フ マ ッ ピ ン グ制御に対 し て重要な役割を演 じ ま す。 あ る フ ォ ン ト レ ポー ト の一例か ら 2 つのページ を 抜 き 出 し て図 7.2 に示 し ま す。 FontReporter Plugin に よ っ て作成 さ れた フ ォ ン ト レ ポー ト を利用すれば、 PDF フ ォ ン ト を 分析 し 、 ひいては TET がテ キ ス ト を正 し く 抽出で き る よ う にマ ッ ピ ン グ テーブルを作 る こ と が可能です。TET のテ キ ス ト 抽出を制御す る ために Unicode マ ッ ピ ン グ テーブルやグ リ フ名 ヒ ュ ー リ ス テ ィ ッ ク ス を書 こ う と 思 う な ら ば、それに対応す る フ ォ ン ト レ ポー ト に 目を通 し てお く こ と を強 く 推奨 し ます。 1. PDFlib FontReporter Plugin は www.pdflib.com/products/fontreporter か ら 無償ダウ ン ロー ド 可能です。 7.5 グ リ フ に対する Unicode マ ッ ピ ング 107 図 7.2 Adobe Acrobat 用 PDFlib FontReporter Plugin が作成する フ ォ ン ト レ ポー ト の例 優先規則 TET はグ リ フ マ ッ ピ ン グ制御を以下の順番で適用 し ます : > codelist ・ ToUnicode CMap リ ソ ース が まず照会 さ れます。 > フ ォ ン ト が内部 ToUnicode CMap を持つな ら それが次に考慮 さ れます。 > グ リ フ名について TET は、 外部か内部のグ リ フ名マ ッ ピ ン グ規則を、 ど ち ら か フ ォ ン ト と グ リ フ名の一致す る も のが見つかれば適用 し ます。 > 最後の手段 と し て、 ユーザーが与えた グ リ フ リ ス ト が適用 さ れます。 コ ー ド リ ス ト リ ソ ースはあ ら ゆる種類の フ ォ ン ト に利用可能 コ ー ド リ ス ト はグ リ フ リ ス ト に似てお り 、 ただ各 コ ー ド のグ リ フ名でな く Unicode 値を指定す る 点が違い ます。 同 じ 鋳造場で作 ら れた複数の フ ォ ン ト な ら ば、互いに同一の コ ー ド 割 り 当て を使用 し てい る こ と も あ る か も し れませんが、 一般には コ ー ド (グ リ フ ID と も い う ) と い う のはフ ォ ン ト ご と に異な る も のです。 その結果、 フ ォ ン ト ご と に別々の コ ー ド リ ス ト が必要にな り ま す。 コ ー ド リ ス ト はテ キ ス ト フ ァ イ ルであ り 、 各行ご と に、 1 つの コ ー ド に対す る Unicode マ ッ ピ ン グ を以下の規則に従っ て記述 し てい ます : > パーセ ン ト 記号 「%」 の後のテ キ ス ト は無視 さ れます。 こ れは注釈に使え ます。 > 1 列目にはグ リ フ の コ ー ド を 10 進か 16 進記法で書 き ます。こ れは 1 バ イ ト フ ォ ン ト の場 合は 0 ∼ 255 の範囲、 CID フ ォ ン ト の場合は 0 ∼ 65535 の範囲内の値でなければな り ません。 108 7 章 : 高度な Unicode 処理 図 7.3 あ る ロ ゴ タ イ プのフ ォ ン ト に対する フ ォ ン ト レポー ト を見た と こ ろ、 こ のフ ォ ン ト は誤っ た Unicode マ ッ ピ ン グ を持 っ ている こ と がわか っ た。 こ れはカ ス タ ムの コ ー ド リ ス ト で正す こ と が可能。 > その後につづけてその行には、その コ ー ド に対す る Unicode コ ー ド 点を 7 つま で書 く こ と がで き ます。 値は 10 進か (前に x か 0x をつけて) 16 進記法で与え る こ と がで き ま す。 UTF-32 に対応 し てい ますので、 サ ロ ゲー ト ペア も 使え ます。 コ ー ド リ ス ト はフ ァ イ ル名の拡張子 と し て .cl を用い る き ま り にな っ てい ます。 コ ー ド リ ス ト は codelist リ ソ ース を用いて設定を行 う こ と がで き ます。 コ ー ド リ ス ト リ ソ ース が何 も 明示的に指定 さ れていない場合、 TET は <mycodelist>.gl ( こ こ で <mycodelist> は リ ソ ー ス名) と い う 名前の フ ァ イ ルを searchpath ヒ エ ラ ルキーの中で探 し ます (詳 し く は、 61 ページの 5.2 「 リ ソ ース設定 と フ ァ イ ル検索」 を参照)。 つま り いいかえれば、 リ ソ ース名 と フ ァ イ ル名 (か ら 拡張子 .cl を除いた も の) と が同一の と き は リ ソ ース を設定す る 必要 はない と い う こ と で、 なぜな ら その場合 TET は下記の呼び出 し と 等価な動作を暗黙に行 う か ら です ( こ こ で name は任意の リ ソ ース名) : set_option("codelist {name name.cl}"); 次の例は コ ー ド リ ス ト の使用例です。 こ こ では、 図 7.3 に示す よ う に ロ ゴ タ イ プのグ リ フ が誤っ てマ ッ プ さ れてい る 場合を想定 し ます。 こ の フ ォ ン ト では、 1 つのグ リ フ が実際に は複数のキ ャ ラ ク タ を表 し てお り 、キ ャ ラ ク タ をすべて並べ る と 会社の ロ ゴ タ イ プが形成 さ れ る よ う にな っ てい る のですが、 各グ リ フ が誤っ て キ ャ ラ ク タ a ・ b ・ c ・ d ・ e にマ ッ プ さ れて し ま っ てい る のです。 こ れを正すには以下の コ ー ド リ ス ト を作れば よ いで し ょ う : % GlobeLogosOneフォントの各コードに対するUnicodeマッピング x61 x62 x63 x64 x65 x0054 x0042 x0073 x0047 x0062 x0068 x0065 x0020 x006F x0074 x006F x006E x0020 x006C x006F x0065 % % % % % The Bo ston Glo be そ し て open_document( ) で下記のオプシ ョ ン を用いて コ ー ド リ ス ト を与え ます( こ の コ ー ド リ ス ト は GlobeLogosOne.cl と い う フ ァ イ ルにあ り 、検索パ ス で見つか る よ う に し て あ る と し て) : glyphmapping {{fontname=GlobeLogosOne codelist=GlobeLogosOne}} ToUnicode CMap リ ソ ースはあ ら ゆる種類の フ ォ ン ト に利用可能 PDF は ToUnicode CMap と い う デー タ 構造に対応 し てい ます。 こ れを用い る と 、 フ ォ ン ト の各グ リ フ に対す る Unicode 値を与え る こ と がで き ます。 こ のデー タ 構造が PDF フ ァ イ ル内に存在す る 場 合、 TET はそれを利用 し ます。 あ る いは、 ToUnicode CMap を外部フ ァ イ ル と し て与え る こ と も 可能です。 こ れは PDF 内の ToUnicode CMap が不完全な場合や、 誤っ た内容を含ん でい る と き や、 存在 し ない場合に有用です。 ToUnicode CMap は コ ー ド リ ス ト よ り も 優先 さ れます。 ただ、 コ ー ド リ ス ト のほ う が ToUnicode CMap よ り も 形式が簡単なため、 好ん で用い ら れます。 7.5 グ リ フ に対する Unicode マ ッ ピ ング 109 CMap では、 フ ァ イ ル名に拡張子をつけない き ま り にな っ てい ます。 ToUnicode CMap は cmap リ ソ ース を用いて設定を行 う こ と がで き ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イ ル検索」 を参照)。 cmap リ ソ ース の内容は、 標準的な CMap の文法に従 う 必要があ り ます。1 ToUnicode CMap を Warnock フ ァ ミ リ のすべての フ ォ ン ト に適用す る には、open_ document( ) で下記のオプシ ョ ン を用い ます : glyphmapping {{fontname=Warnock* tounicodecmap=warnock}} グ リ フ リ ス ト リ ソ ースは 1 バ イ ト フ ォ ン ト に利用可能 グ リ フ リ ス ト (グ リ フ名 リ ス ト の略) を用い る と 、 非標準のグ リ フ名に対 し て カ ス タ ムの Unicode 値を与え た り 、 あ る い は標準の グ リ フ名に対す る 既存の値を無視 さ せて別の値を使わせた り す る こ と がで き ま す。 グ リ フ リ ス ト はテ キ ス ト フ ァ イ ルであ り 、 以下の規則に従っ て各行ご と に、 1 つのグ リ フ名に対す る 1 つの Unicode マ ッ ピ ン グ を記述 し ます : > パーセ ン ト 記号 「%」 の後のテ キ ス ト は無視 さ れます。 こ れは注釈に使え ます。 > 1 列目にはグ リ フ名を書 き ます。フ ォ ン ト 内で用い ら れてい る 任意のグ リ フ名を書 く こ と がで き ます (すなわち、 標準のグ リ フ名の Unicode 値を無視 さ せて別の値を使わせ る こ と も 可能)。 グ リ フ名の中にパーセ ン ト 記号を入れたい場合は \% と シーケ ン ス で 書 く 必要があ り ます (パーセ ン ト 記号は注釈を開始 さ せ る 役割を持つので)。 > 1 つのグ リ フ名に対 し ては 1 つのマ ッ ピ ン グだけが許 さ れます。同一のグ リ フ名に対 し て複数のマ ッ ピ ン グがあ る 場合はエ ラ ー と し て扱われます。 > その後につづけてその行には、そのグ リ フ名に対す る Unicode コ ー ド 点を 7 つま で書 く こ と がで き ます。 値は 10 進記法か (前に x か 0x をつけて) 16 進記法で与え る こ と が で き ます。 UTF-32 に対応 し てい ますので、 サ ロ ゲー ト ペア も 使え ます。 > グ リ フ名の中に印字不能キ ャ ラ ク タ を入れたい場合はテ キ ス ト フ ァ イ ル用のエ ス ケー プシーケ ン ス を用い ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イ ル検索」 を参照)。 グ リ フ リ ス ト はフ ァ イ ル名の拡張子 と し て .gl を用い る き ま り にな っ てい ます。 グ リ フ リ ス ト は glyphlist リ ソ ース を用いて設定を行 う こ と がで き ます。グ リ フ リ ス ト リ ソ ース が何 も 明示的に指定 さ れていない場合、 TET は <myglyphlist>.gl ( こ こ で <myglyphlist> は リ ソ ース名) と い う 名前の フ ァ イ ルを searchpath ヒ エ ラ ルキーの中で探 し ます (詳 し く は、 61 ページの 5.2 「 リ ソ ース設定 と フ ァ イ ル検索」 を参照)。 つま り いいかえれば、 リ ソ ー ス名 と フ ァ イ ル名 (か ら 拡張子 .gl を除いた も の) と が同一の と き は リ ソ ース を設定す る 必要はない と い う こ と で、 なぜな ら その場合 TET は下記の呼び出 し と 等価な動作を暗黙 に行 う か ら です ( こ こ で name は任意の リ ソ ース名) : set_option("glyphlist {name name.gl}"); グ リ フ マ ッ ピ ン グの優先規則に よ っ て、 フ ォ ン ト が ToUnicode CMap を含んでい る 場合に はグ リ フ リ ス ト は照会 さ れません。 以下の例はグ リ フ リ ス ト の使用例です : % TeX文書で用いられるグリフ名に対するUnicode値 precedesequal similarequal negationslash union prime 0x227C 0x2243 0x2044 0x222A 0x2032 1. partners.adobe.com/public/developer/en/acrobat/5411.ToUnicode.pdf を参照 110 7 章 : 高度な Unicode 処理 CMSY で始 ま る すべて の フ ォ ン ト 名に対 し て グ リ フ リ ス ト を 適用 し た い と き は、 open_ document( ) で下記のオプシ ョ ン を用い ます : glyphmapping {{fontname=CMSY* glyphlist=tarski}} 1 バ イ ト フ ォ ン ト の数値グ リ フ 名 を規則で解釈 さ せる PDF文書内のグ リ フ名は と き に、 何 ら かの定義済みの リ ス ト か ら 採っ て来 ら れないで、アルゴ リ ズ ム的に生成 さ れてい る こ と があ り ます。 こ れはその PDF を生成 し た アプ リ ケーシ ョ ンの 「機能」 か も し れません し 、あ る いはプ リ ン タ ド ラ イ バが フ ォ ン ト を別の形式に変換 し た こ と に よ る も のか も し れ ま せんが、 その過程で元のグ リ フ名が失われ、 G00, G01, G02,…の よ う な規則的な名前に 置 き 換え ら れてい る こ と があ る のです。 TET は、 普及 し てい る さ ま ざ ま なアプ リ ケーシ ョ ンや ド ラ イ バが生成す る 数値グ リ フ名を処理す る ためのグ リ フ名規則を内蔵 し てい ます。 ただ、グ リ フ名が同 じ であ っ て も それが別々のエン コ ーデ ィ ン グに対 し て生成 さ れ る 場合 も あ る ので、 open_document( ) で encodinghint オプシ ョ ン を与え て、 文書内に現れ る 規則 的な グ リ フ名が従 う べ き エン コ ーデ ィ ン グ を指定す る こ と も で き る よ う にな っ てい ます。 た と えば文書に ロ シ ア語のテ キ ス ト が入っ てい る こ と がわかっ てい る のに、PDF 内の情報 不足で う ま く それが抽出で き ない場合は、 オプシ ョ ン encodinghint= cp1250 を与え て キ リ ル文字 コ ー ド ページ を指定す る こ と がで き ます。 こ う し た数値グ リ フ名を解釈す る 内蔵の規則のほかに、 自分でカ ス タ ムの規則を定義 す る こ と も で き ます。それには open_document( ) で glyphmapping オプシ ョ ンに fontname・ glyphrule サブオプシ ョ ン を用い ます。 その際には以下の情報を与え る 必要があ り ます : > その規則を適用す る べ き フ ォ ン ト の完全名か短縮名 (fontname オプシ ョ ン) > グ リ フ名の接頭辞、 すなわち数値部の前につ く キ ャ ラ ク タ 列 (prefix サブオプシ ョ ン) > 数値を解釈す る 際の基数= 10 進か 16 進か (base サブオプシ ョ ン) > で き た数値 コ ー ド を解釈す る べ き エン コ ーデ ィ ン グ (encoding サブオプシ ョ ン) た と えばフ ォ ン ト T1, T2, T3,…内のグ リ フ名が c00, c01, c02, …, cFF で、各グ リ フ名が WinAnsi キ ャ ラ ク タ の 16 進位置 (00, …, FF) にそれぞれ対応 し て い る こ と がわか っ た (PDFlib FontReporter を利用す る な ど し て) 場合には、 open_document( ) で下記のオプシ ョ ン を用 い ます : glyphmapping {{fontname=T* glyphrule={prefix=c base=hex encoding=winansi} }} 外部 フ ォ ン ト フ ァ イル と シ ス テム フ ォ ン ト PDF が Unicode マ ッ ピ ン グのための充分な 情報を持たず、 し か も フ ォ ン ト が埋め込まれていない と き は、 TET が Unicode マ ッ ピ ン グ の導出に利用で き る フ ォ ン ト デー タ が追加 さ れ る よ う 設定す る こ と も で き ます。 フ ォ ン ト デー タ はデ ィ ス ク 上の TrueType か OpenType の フ ォ ン ト フ ァ イ ルか ら 来 る よ う にす る こ と も で き 、 その場合は fontoutline リ ソ ース カ テ ゴ リ を用いてその よ う に設定す る こ と が 可能です。 あ る いは Mac や Windows シ ス テ ム上では、 TET はホ ス ト オペレーテ ィ ン グ シ ス テ ム上に イ ン ス ト ール さ れた フ ォ ン ト を利用す る こ と も で き ます。 こ う し た ホ ス ト フ ォ ン ト を利用 さ せない よ う にす る には open_document( ) で fontoutline オプシ ョ ン を用い ま す。 デ ィ ス ク フ ァ イ ルを WarnockPro フ ォ ン ト のために設定す る には下記の呼び出 し を行い ます : TET_set_option("fontoutline {WarnockPro WarnockPro.otf}"); 外部フ ォ ン ト フ ァ イ ルの設定については、 詳 し く は、 61 ページの 5.2 「 リ ソ ー ス設定 と フ ァ イ ル検索」 を参照 し て く だ さ い。 7.5 グ リ フ に対する Unicode マ ッ ピ ング 111 112 7 章 : 高度な Unicode 処理 8 画像抽出 8.1 画像抽出の基本 さ ま ざ ま な画像形式 TET は PDF ページ群か ら ラ ス タ 画像群を抽出 し 、 その抽出 し た画 像を、 以下のいずれかの形式で格納 し ます : > TIFF (.tif) 画像は多 く の場合に生成 さ れます。 TET が生成す る 多 く の TIFF 画像は、 多 く の TIFF ビ ュ ーア ・ コ ン シ ュ ーマで利用で き ます。 ただ し 、 い く つかの高度な TIFF 機能には、 すべての画像ビ ュ ーアが対応 し てい る わけではあ り ません。 Windows XP の 画像ビ ュ ーアは、 TIFF で広 く 使われてい る Flate 圧縮に対応 し ていない こ と に留意 し て く だ さ い。 当社では Adobe Photoshop を、 TIFF 画像の有効性に関す る ベンチマー ク と し てい ます。 > JPEG (.jpg) は、PDF 内ですでに JPEG アルゴ リ ズ ム (DCTDecode フ ィ ル タ ) で圧縮 さ れ てい る 画像について生成 さ れます。 ただ し 、 DCT 圧縮 さ れた画像を TIFF と し て抽出 す る 必要があ る 場合 も い く つかあ り ます。 PDF 色処理のすべての側面が JPEG で表現 で き る わけではないか ら です。 > JPEG 2000 (.jpx) は、PDF 内ですでに JPEG 2000 アルゴ リ ズ ム (JPXDecode フ ィ ル タ ) を 用いて圧縮 さ れてい る 画像について生成 さ れます。 画像 を デ ィ ス ク ま たは メ モ リ へ抽出 TET API は、 PDF 文書か ら 抽出 し た画像を 2 種類 の方式で受け渡す こ と がで き ます : > write_image_file( ) API 関数は、画像フ ァ イ ルをデ ィ ス ク 上に生成 し ます。こ の画像フ ァ イ ルのベース フ ァ イ ル名は filename オプシ ョ ンで指定す る 必要があ り ます。 TET は画 像種別に応 じ て適切な接尾辞を自動的に付加 し ます。 > get_image_data( ) API 関数は、 画像デー タ を メ モ リ 内で受け渡 し ます。 こ れは、 画像 デー タ を他の処理構成要素へ、 デ ィ ス ク フ ァ イ ルを扱 う 必要な し に受け渡 し たい と き に便利です。 詳細は、 自分の画像抽出上の要請に依存 し ます (118 ページの 8.4 「ページベース と リ ソ ー スベース の画像ループ」 を参照) 。 いずれの場合に も 、 抽出画像の種別を知 る こ と が可能 です (次項参照)。 抽出画像の フ ァ イル種別 を知 る 画像フ ァ イ ル種別は、TETML 内の Image/@extractedAs 属性で報告 さ れてい ます。 API レベルでは、 以下の慣用表現を用いて抽出画像の種別を知 る こ と がで き ます。 int imageType = tet.write_image_file(doc, tet.imageid, "typeonly"); /* 画像種別を表す数値を種別名へマップ */ String imageFormat; switch (imageType) { case 10: imageFormat = "TIFF"; break; case 20: imageFormat = "JPEG"; break; 8.1 画像抽出の基本 113 case 30: imageFormat = "JPEG2000"; break; case 40: imageFormat = "RAW"; break; default: System.err.println("write_image_file() が未知の値を返しました " + imageType + ", 画像をスキップします, エラー : " + tet.get_errmsg()); } 画像の XMP メ タ デー タ PDF では、 XMP 形式を用いて、 文書全体ま たは文書の一部に対 し て メ タ デー タ を付与 し てい ます。 XMP と その用途に関 し て詳 し く は右記を参照 し て く だ さ い : www.pdflib.com/knowledge-base/xmp-metadata/ 画像オブジ ェ ク ト には、 PDF 文書の中で、 XMP メ タ デー タ が関連づけ ら れてい る こ と があ り ます。 XMP メ タ デー タ が存在 し てい る と き は、 TET はデフ ォ ル ト では、 出力形式 JPEG ・ TIFF の抽出画像につい て、 そ の中に それ を 埋め込み ま す。 こ の動作は、 write_ image_file( ) ・ get_image_data( ) の keepxmp オプシ ョ ンで制御す る こ と がで き ます。 こ の オプシ ョ ンが false に設定 さ れてい る と き は、 TET は、 画像出力フ ァ イ ルを生成す る 際に 画像 メ タ デー タ を無視 し ます。 pCOS ク ッ ク ブ ッ ク 内の image_metadata ト ピ ッ ク では、画像フ ァ イ ルを一切生成せず に pCOS イ ン タ フ ェース を用いて画像 メ タ デー タ を直接抽出す る 方法を示 し てい ます。 114 8 章 : 画像抽出 8.2 画像の連結 と フ ィ ル タ リ ン グ 画像連結 画像を、 PDF 文書内で表現 さ れてい る と お り に抽出す る こ と が望ま し く ない 場合 も あ り ます : 一見 1 個の画像であ る も のが、 実はた く さ んの小画像を並べた も のであ る 場合が多 く あ り ます。 こ の よ う に画像を断片化す る 理由 と し て よ く あ る のは以下の と お り です : > アプ リ ケーシ ョ ンや ド ラ イ バのなかには、マルチ ス ト リ ッ プ TIFF 画像を断片化 PDF 画 像へ変換す る も のがあ り ます。 ス ト リ ッ プの数は数ダース か ら 何百個に も 及ぶ場合が あ り ます。 > ス キ ャ ン ソ フ ト ウ ェ アのなかには、 ス キ ャ ン し たページ を小 さ な断片 (ス ト リ ッ プ ま たは タ イ ル) に分割す る も のがあ り ます。 断片の数は通常、 数ダース を超え る こ と は あ り ません。 > アプ リ ケーシ ョ ンのなかには、 印刷出力や PDF 出力を生成す る 際に画像を小 さ な断片 に分割す る も のがあ り ます。 極端な例 と し ては、 と り わけ Microsoft Office アプ リ ケー シ ョ ン群に よ っ て作成 さ れた文書では、1 つのページが数千 も の小画像断片を含んでい る 場合 も あ り ます。 TET の画像連結エン ジ ンは、 こ の よ う な状況を検出 し て、 画像断片を再結合 し て 1 つの大 き な有用な画像に し ます。 画像群が連結候補 と 見な さ れ る ためには、 い く つかの条件が満 た さ れ る 必要があ り ます : > 画像断片群が水平ま たは垂直に並んでお り (任意の角度でではな く )、 サブ画像群の矩 形グ リ ッ ド を形成 し てい る こ と 。 > 構成要素あ た り のビ ッ ト 数が同 じ であ る こ と 。 > 色空間が同 じ 、 ない し 互換であ る こ と 。 > 色空間 と 圧縮方式 (特に JPEG 2000 圧縮) の組み合わせに よ っ ては、画像連結がで き ま せん。 連結候補群が、 結合 し て大 き な画像にで き る 場合には、 それ ら は連結 さ れます。 連結 さ れ た画像は、images[ ]/mergetype pCOS 擬似オブジ ェ ク ト に よ っ てその よ う に識別で き ます。 それは、 連結 さ れた画像については値 1 (擬似) を持ち、 連結処理に よ っ て消費 さ れた画 像については 2 (消費済) を持ち ます。 消費済画像は一般に、 受け取っ た アプ リ ケーシ ョ ン側では無視す る べ き です。 画像連結を完全に無効化す る には下記のページオプシ ョ ン を用い ます : 図 8.1 こ の画像はた く さ んの小 さ な ス ト リ ッ プか ら 成っ ています が、 TET は これ を 1 個の再利用 可能な画像 と し て抽出 し ます。 8.2 画像の連結 と フ ィ ル タ リ ング 115 imageanalysis={merge={disable}} 画像はいつ連結 さ れ るか ページ上の画像の分析 と 連結は、 おのおの open_page( ) への 呼び出 し に よ っ て引 き 起 こ さ れます。 こ れは、 以下の重要な結果につなが り ます : > pCOS images[ ] 配列内の項目数は、すなわち length:images 擬似オブジ ェ ク ト の数は、増 え てい く 可能性があ り ます : ページが順次処理 さ れてい く につれて、 画像連結に よ っ てで き た擬似画像が配列に加わ っ てい く か ら です。 ですので、 すべての連結済画像を 抽出す る ためには、 length:images を取得 し て画像デー タ を抽出する 前に、 文書内のす べてのページ を開 く 必要があ り ます。 擬似 (連結済) 画像は、 images[ ]/mergetype 擬 似オブジ ェ ク ト で、 それに対応す る フ ラ グ artificial (数値 1) でマー ク さ れてい ます。 > 一方、 images[ ] 配列内の要素のなかには、 連結済画像の一部分 と し てのみ用い ら れ る も のがあ り え ます。 し か し 、 消費済の項目は、 images[ ] 配列か ら 除去 さ れ る のではな く 、 images[ ]/mergetype 擬似オブジ ェ ク ト で、 それに対応する フ ラ グ consumed (数値 2) でマー ク さ れてい ます。 文書内に画像がい く つあ るか なん と 、 こ の簡単な質問には簡単な答えがあ り ません。答 えは以下の決定に よ っ て変わ り ます : > 画像 リ ソ ース を数えたいか、 それ と も 配置 さ れた画像を数えたいのか。 > 連結済画像の一部分 と し てのみ用い ら れてい る 、 単独では配置 さ れていない画像を数 に入れたいか。 TET と pCOS 擬似オブジ ェ ク ト を用いれば、こ れ ら すべての種類の画像数の答え を知 る こ と がで き ます。TET ク ッ ク ブ ッ ク 内の image_count ト ピ ッ ク では、画像の さ ま ざ ま な数え 方の可能性を演示 し てい ます。 それは以下の よ う な出力を生成 し ます : No of raw image resources before merging: 82 No of placed images: 12 No of images after merging (all types): 83 normal images: 1 artificial (merged) images: 1 consumed images: 81 No of relevant (normal or artificial) image resources: 2 小画像 フ ィ ル タ リ ン グ TET は、 ページ上に微小画像がた く さ んあ る と き は、 それ ら を 無視 し ます。 多 く の小画像は、 画像連結処理に よ っ て結合 さ れて 1 つの大画像に さ れ る こ と が多いですので、小画像除去は画像除去の後に行われます。かつそれ ら は、imageanalysis ページオプシ ョ ンの smallimages サブオプシ ョ ンの maxarea ・ maxcount サブオプシ ョ ン で指定で き る 大 き さ と 数に関す る 条件を満たす必要があ り ます。小画像除去を完全に無効 化す る には、 下記のページオプシ ョ ン を用い ます : imageanalysis={smallimages={disable}} 116 8 章 : 画像抽出 8.3 配置画像 と 画像 リ ソ ース TET では、 配置画像 と 画像 リ ソ ース を区別 し ます : > 配置画像は、 ページ上の画像に対応 し ます。 配置画像は視覚特性を持ち ます : 特定の 位置に配置 さ れてお り 、 寸法 (ポ イ ン ト ・ ミ リ メ ー ト ルな ど の絶対単位で測 ら れ る ) を 持っ てい ます。 多 く の場合その画像はページ上で可視にな っ てい ますが、 場合に よ っ ては、 ページ上の他のオブジ ェ ク ト に よ っ て隠 さ れていた り 、 可視ページ領域の外に 配置 さ れていた り 、 全体的ない し 部分的に ク リ ッ プ さ れていた り し て不可視にな っ て い ます。 配置画像は、 TETML 内で PlacedImage 要素で表 さ れてい ます。 > 画像 リ ソ ース は、 実際の ピ ク セルデー タ ・ 色空間 ・ 要素数 ・ 要素あ た り ビ ッ ト 数な ど を表現す る リ ソ ー ス です。 配置画像 と 違っ て、 画像 リ ソ ース は明示的な視覚情報を持 ち ません。 ただ し 、 幅 と 高 さ の特性 (ピ ク セル単位で測 ら れ る ) は持っ てい ます。 画 像 リ ソ ース はそれぞれ一意な ID を持っ てお り 、 それを用いてその ピ ク セルデー タ を抽 出す る こ と がで き ます。 画像 リ ソ ース は、 TETML 内で Image 要素で表 さ れてい ます。 1 個の画像 リ ソ ース は、 その文書内の任意の数の配置画像の も と と し て使われ る こ と があ り え ます。 通常、 画像 リ ソ ース はそれぞれ 1 回だけ配置 さ れますが、 同一ページ上に、 ま たは複数ページ上に繰 り 返 し 配置 さ れ る こ と も あ り え ます。 た と えば、 文書内の各ページ のヘ ッ ダに繰 り 返 し 用い ら れ る 企業 ロ ゴの画像を考え てみま し ょ う 。ページ上の ロ ゴはそ れぞれ、 1 個の配置画像か ら 成っ てい ますが、 最適化 さ れた PDF においては、 それ ら の配 置画像がすべて同一の画像 リ ソ ース に紐付け ら れてい る こ と があ り え ます。 一方、 最適化 さ れていない PDF においては、 配置 ロ ゴはそれぞれ、 同一の画像 リ ソ ース の自分用の複 製を元に し てい る こ と があ り え ます。 こ れは見た目は同 じ 結果にな り ますが、 PDF 文書の フ ァ イ ルサ イ ズは大 き く な り ます。 最適化 さ れていない PDF 文書は、 ど のページか ら も 参照す ら さ れていない画像 リ ソ ース (すなわち未使用 リ ソ ース) を含んでい る こ と も あ り え ます。 表 8.1 で、 配置画像 と 画像 リ ソ ース の さ ま ざ ま な特性を比較 し てい ます。 表 8.1 配置画像 と 画像 リ ソ ースの比較 特性 配置画像 画像 リ ソ ース TETML 要素 PlacedImage Image 画像連結によ る影響 あり あり ページ と の紐付け あり - ピ ク セル単位の幅 と 高 さ あり あり ポ イ ン ト 単位の幅 と 高 さ あり - ページ上の位置 あり - 視覚上の出現回数 1 0、 1 ない し それ以上 一意な ID な し : get_image_info( ) が返す imageid メ ンバ と 、 TETML 内の PlacedImage/@image 属性は、 背後の画像 リ ソ ース を特定するにすぎ ません はい : get_image_info( ) が 返す imageid メ ンバ と 、 TETML 内の Image/@id 属 性 TET コ マ ン ド ラ イ ン ツール < フ ァ イル名 >_p< ページ番号 >_< 画像番号 >. における フ ァ イル命名規則 [tif|jpg|jpx] < フ ァ イル名 >_I< 画像 ID>. [tif|jpg|jpx] 8.3 配置画像 と 画像 リ ソ ース 117 8.4 ページベース と リ ソ ースベースの画像ルー プ 配置画像 と 画像 リ ソ ース の違いは、 すなわち、 画像抽出について 2 種類の根本的に異な る アプ ロ ーチを も た ら し ます : ページベース と リ ソ ースベース の画像抽出ループです。 ど ち ら の方式 も 、 画像をデ ィ ス ク フ ァ イ ルか メ モ リ へ抽出する ために用い る こ と がで き ます。 ページベースの画像抽出ループ こ の場合には、 アプ リ ケーシ ョ ン は正確なページ レ イ ア ウ ト と 配置画像に関心があ り 、 画像デー タ の重複はい と わない こ と にな り ます。 ページ ベース のループで画像を抽出す る と 、配置画像ご と に 1 つずつ画像フ ァ イ ルが生成 さ れま すので、 複数の抽出配置画像に同一の画像デー タ が含 ま れ る こ と が あ り え ま す。 ア プ リ ケーシ ョ ン側で画像 ID の重複をチ ェ ッ ク す る こ と で画像の重複を避け る こ と も で き ます。 し か し 、 一意な画像 リ ソ ース を抽出 し たいな ら 、 リ ソ ースベース の画像抽出ループを用い る ほ う が簡単です (後述)。 ペ ー ジ ベー ス の 画 像 抽 出 ル ー プ は、 TET コ マ ン ド ラ イ ン ツ ールではオ プ シ ョ ン - - imageloop page で有効にす る こ と がで き ます。 API レベルでのページベース の画像抽 出のための コ ー ド は、 TET ク ッ ク ブ ッ ク の images_per_page ・ images_in_memory ト ピ ッ ク 内で演示 し てい ます。 images_per_page ク ッ ク ブ ッ ク ト ピ ッ ク で、 ページ上の画像の座 標を取得す る 方法 も 示 し てい ます。 ページベース の画像抽出ループの詳細 (上述のサンプル コ ー ド を参照 し て く だ さ い) : get_image_info( ) が、 配置画像に関す る 視覚情報 と 、 その背景画像デー タ の pCOS 画像 ID (imageid フ ィ ール ド で) を取得 し ます。 こ の ID を用いて、 pcos_get_number( ) で画像の 色空間や、 幅 ・ 高 さ を ピ ク セル単位で表 し た も の と い っ た さ ら な る 詳細 を 取得 し た り 、 write_image_file( ) ま たは get_image_data( ) でその画像の ピ ク セルデー タ 本体を取得 し た り す る こ と がで き ます。同一の画像が 1 つない し 複数のページ上で複数回参照 さ れてい る 場合、 その対応す る ID は同一にな り ます。 リ ソ ースベースの画像抽出ループ こ の場合には、 アプ リ ケーシ ョ ン は文書内の画像 リ ソ ース に関心があ り 、 ど の画像が ど のページで用い ら れてい る かはい と わない こ と にな り ます。 複数回 (1 つない し 複数のページ上に) 配置 さ れてい る 画像 リ ソ ース が 1 回だけ抽 出 さ れます。 その半面、 ど のページに も 全 く 配置 さ れていない画像 も 抽出 さ れます。 リ ソ ー ス ベー ス の 画像抽 出 ル ー プ は、 TET コ マ ン ド ラ イ ン ツ ー ル で は オ プ シ ョ ン - - imageloop resource で有効にす る こ と がで き ます。API レベルでの リ ソ ースベース の画 像抽出のための コ ー ド は、 image_resources ミ ニサンプル ・ ク ッ ク ブ ッ ク ト ピ ッ ク 内で演 示 し てい ます。 pCOS リ フ ァ レ ン ス には、 pCOS イ ン タ フ ェース に関 し て さ ら に詳 し い情 報があ り ます。 リ ソ ー ス ベー ス の画像抽出ループの詳細 (上述のサ ン プル コ ー ド を 参照 し て く だ さ い) : 画像 リ ソ ース を抽出す る 前に、 画像連結が必ず有効にな る よ う に、 すべてのページ が開かれます。 画像連結が関係ない場合は こ の ス テ ッ プは ス キ ッ プで き ます。 画像を抽出 す る ためには、 その対応す る 画像 ID が必要です。 コ ー ド は、 0 か ら 最大画像 ID ま でのす べての値を評価 し ます。 こ の最大画像 ID は、 pcos_get_number( ) を用いて、 pCOS パ ス length:images の値 と し て取得 さ れます。 連結済画像の消費済部分 (マルチ ス ト リ ッ プ画 像の ス ト リ ッ プな ど) を ス キ ッ プす る ために、 mergetype pCOS 擬似オブジ ェ ク ト を用い て各画像 リ ソ ース の種別が調べ ら れます。 こ れに よ っ て、 画像連結処理に よ っ て消費 さ れ た画像部分を ス キ ッ プす る こ と がで き ます (最終的な連結済画像にのみ関心があ る か ら で す)。 ひ と たび画像 ID がわかれば、 関数 write_image_file( ) ま たは get_image_data( ) を呼 び出せば、 前者な ら 画像デー タ をデ ィ ス ク フ ァ イ ルへ書 き 出す こ と がで き 、 後者な ら ピ ク セルデー タ を メ モ リ 内で受け渡す こ と がで き ます。 118 8 章 : 画像抽出 8.5 配置画像の視覚情報 get_image_info( ) を用い る と 、 配置画像の視覚情報を取得する こ と がで き ます。 各画像に ついて、 image_info 構造内で以下の値が得 ら れます (図 8.2 参照) : > x ・ y フ ィ ール ド は、 画像参照点の座標です。 参照点は通常、 画像の左下隅です。 ただ し 、 ページ上の座標系変換に よ っ て参照点が変わ る こ と も あ り ます。 た と えば、 画像 が水平反転 さ れていれば、 参照点は画像の左上隅にな る で し ょ う 。 y の値は topdown ページオプシ ョ ンに依存 し ます。 > width ・ height フ ィ ール ド は、 ページ上の配置画像の物理的寸法に対応 し ます。 こ れ ら はポ イ ン ト (すなわち 1/72 イ ンチ) 単位で与え ら れます。 > 角度 alpha は、ピ ク セル行の向 き を記述 し ます。こ の角度は範囲 -180°< alpha < +180° を と り ます。 角度 alpha は、 画像を その参照点を中心に回転 さ せます。 正立 し た画像 については alpha は 0°にな り ます。 alpha と beta の値は topdown ページオプシ ョ ン に依存 し ます。 > 角度 beta は、ピ ク セル列の向 き を記述 し ます。 こ れは alpha の垂線に平行です。 こ の角 度は範囲 -180°< beta < +180°、 ただ し ± 90°以外の値を と り ます。 角度 beta は画像 を斜形化 し 、 beta=180°は画像を x 軸で反転 し ます。 正立 し た画像については、 beta は範囲 -90°< beta < +90°を と り ます。 abs(beta) > 90°な ら 、 その画像はベース ラ イ ンで反転 さ れてい ます。 > imageid フ ィ ール ド は、画像の pCOS ID を内容 と し て持ち ます。こ れを用い る と 、pCOS 関数群で詳 し い画像情報を取得 し た り 、write_image_file( ) ま たは get_image_data( ) で 画像ピ ク セルデー タ 本体を取得 し た り す る こ と がで き ます。 画像変形の結果 と し て、 抽出画像の向 き は誤 り に見え る 場合があ り ます。 なぜな ら 、 抽出 さ れ る 画像デー タ は、 PDF 内の画像オブジ ェ ク ト に基づいてい る か ら です。 PDF ページ 上で配置画像に対 し て適用 さ れてい る 回転や反転 と いっ た変形はいずれ も 、 ピ ク セルデー タ には適用 さ れず、 元の ピ ク セルデー タ が抽出 さ れます。 画像解像度 画像解像度を dpi (dots per inch) 単位で算出す る には、 ピ ク セル単位の画像 幅を ポ イ ン ト 単位の画像幅で割 り 、 それに 72 をかけ る 必要があ り ます : while (tet.get_image_info(page) == 1) { String imagePath = "images[" + tet.imageid + "]"; int width = (int) tet.pcos_get_number(doc, imagePath + "/Width"); int height = (int) tet.pcos_get_number(doc, imagePath + "/Height"); double xDpi = 72 * width / tet.width; 図 8.2 画像の視覚情報 ght hei (x, y) th wid alpha 8.5 配置画像の視覚情報 119 double yDpi = 72 * height / tet.height; ... } 回転 さ れた り 斜形化 さ れた り し てい る 画像については、 dpi 値は無意味か も し れない こ と に留意 し て く だ さ い。 画像の dpi 計算の た めの完全な コ ー ド は、 TET ク ッ ク ブ ッ ク の determine_image_resolution ト ピ ッ ク 内にあ り ます。 120 8 章 : 画像抽出 8.6 制約 と 注意 画像の色再現性 TET は画像を抽出す る 際に、 画像品質を下げません : > ラ ス タ 画像がダ ウ ンサンプル さ れ る こ と はあ り ません。 > 画像の色空間は、出力内で温存 さ れます。CMYK か ら RGB への変換や、同様の色変換を TET が適用す る こ と はあ り ません。 > 色要素の数はつねに不変 と な り ます。 た と えば、 RGB 画像は、 灰色 し か含んでいな く て も 、 グ レース ケールへ変更 さ れません。 各種画像対応 場合に よ っ ては、 抽出 さ れた画像の色の見た目が、 PDF ページ上での見 た目 と 異な る こ と があ り ます。 画像の輪郭は温存 さ れていなが ら も 、 色は以下の よ う な理 由で違っ て見え る 場合があ り ます : > 画像マ ス ク が適用 さ れてい る 。 > 着色 さ れた グ レー ス ケール画像は、 その色な し で、 グ レー ス ケール画像 と し て抽出 さ れます。 > DeviceN カ ラ ーは TIFF では対応 し てい ませんので、DeviceN 色空間を持つ画像は、N=1・ 3 ・ 4 の場合にはそれぞれグ レース ケール ・ RGB ・ CMYK 画像 と し て抽出 さ れます。 N>4 の も のについては、 1 個ない し 複数のアルフ ァ チ ャ ン ネルを持つ CMYK TIFF 画像が生 成 さ れます。 > 分版色空間を持つ画像は、 グ レー ス ケール画像 と し て抽出 さ れ ます。 画像の着色に用 い ら れていた特色は失われます。 > イ ンデ ッ ク ス付き ICCBased 色空間を持つ画像 : ICC プ ロ フ ァ イ ルは無視 さ れます。 画像抽出の予期せぬ結果 場合に よ っ ては、 抽出 さ れた画像の輪郭が PDF ページ と 違っ て見え る こ と があ り ます : > 画像が水平に (上下逆)、 ま たは垂直に反転 し て見え る こ と があ り ます。 こ れは、 PDF ページ上で何 ら かの変形が画像に適用 さ れていて も 、 TET はそれにかかわ ら ず、 その 画像の元の ピ ク セルデー タ を抽出 し てい る こ と に よ り ます。 > 画像マ ス ク は無視 さ れますので、 マ ス ク 効果は抽出画像へは反映 さ れません。 非対応の画像種別 以下の種別の PDF 画像は抽出で き ません。 すなわち、 write_image_ file( ) は こ れ ら の場合には -1 を返 し ます : > PDF イ ン ラ イ ン画像: こ れは まれに し か用い ら れない種類の PDF 画像であ り 、と き た ま 小 さ な ラ ス タ 画像に対 し て用い ら れてい ます。 > JBIG2 圧縮を用いた画像 > イ ンデ ッ ク ス付 き Lab 色空間を用いた画像 8.6 制約 と 注意 121 122 8 章 : 画像抽出 9 TET マー ク ア ッ プ言語 (TETML) 9.1 TETML を生成 PDF 文書文書の内容をプ ロ グ ラ ミ ン グ イ ン タ フ ェース経由で提供す る こ と のほかに、TET では、 こ れ と 同 じ 情報を表す XML 出力を生成す る こ と も で き ます。 TET が生成す る こ の XML 出力を TET マー ク ア ッ プ言語 (TETML) と 呼んでい ます。 TETML は、 PDF ページ 群のテ キ ス ト 内容を含んでい る ほか、 テ キ ス ト 位置 ・ フ ォ ン ト ・ 文字サ イ ズな ど の情報 も 含んでい る こ と があ り ます。 TET がページ上に表組の よ う な構造を検出 し た と き は、 その 表組は TETML 内で表 ・ 表行 ・ セル要素の階層構造 と し て表 さ れます。 なお、 表組情報は TET プ ロ グ ラ ミ ン グ イ ン タ フ ェ ース では得 る こ と がで き ず、 TETML を通 じ てのみ得 る こ と がで き ます。 TETML は画像 と 色空間に関す る 情報 も 含んでい ます。 PDF 文書を TETML へ変換す る には、 TET コ マ ン ド ラ イ ン ツールか TET ラ イ ブ ラ リ の いずれか を用い る こ と がで き ます。 いずれの場合に も 、 TETML 生成の詳細を制御す る た めに利用で き る さ ま ざ ま なオプシ ョ ンがあ り ます。 TET コ マ ン ド ラ イ ン ツ ールで TETML を生成 TET コ マ ン ド ラ イ ン ツールを用い る 場合 は、 --tetml オプシ ョ ンで TETML オプシ ョ ン を生成す る こ と がで き ます。 下記の コ マ ン ド は TETML 出力文書 file.tetml を生成 し ます : tet --tetml word file.pdf さ ま ざ ま なオプシ ョ ン を用いて、 文書の一部分のページのみを変換 し た り 、 処理オプシ ョ ン を与えた り す る こ と も で き ます。 詳 し く は、 19 ページの 2.1 「 コ マ ン ド ラ イ ンオプシ ョ ン」 を参照 し て く だ さ い。 TET ラ イ ブ ラ リ で TETML を生成 TET ラ イ ブ ラ リ では、 API 呼び出 し の簡単な連鎖を用 いて TETML 出力を生成す る こ と がで き ます。 tetml サンプルプ ロ グ ラ ム では、 プ ロ グ ラ ム的に TETML を生成す る ための正統的な指示列を演示 し てい ます。 こ のサンプルプ ロ グ ラ ムは、 すべての対応言語バ イ ンデ ィ ン グで利用可能です。 TETML 出力は、 デ ィ ス ク フ ァ イ ル上に も メ モ リ 内に も 生成で き ま す。 生成 さ れ た TETML ス ト リ ー ム は、 現在利用 さ れて い る 多 く のプ ロ グ ラ ミ ン グ言語が提供 し てい る XML 対応を用いて XML ツ リ ーへパースす る こ と がで き ます。 tetml サンプルプ ロ グ ラ ム では、 TETML ツ リ ーを処理す る 様子 も 演示 し てい ます。 TETML の中身 TETML 出力は UTF-8 (USS ま たは MVS を用いた zSeries 上 :EBCDICUTF-8。 www.unicode.org/reports/tr16 を参照) で符号化 さ れてお り 、 以下の情報を含んで い ます ( こ れ ら の項目のい く つかはオプシ ョ ナルです) : > 一般文書情報 ・ メ タ デー タ > 各ページのテ キ ス ト 内容 (単語ま たは段落。 行を含め る こ と も 可能) > グ リ フ の フ ォ ン ト と 位置情報 (フ ォ ン ト 名 ・ サ イ ズ ・ 座標) > グ リ フ の レ イ ア ウ ト 属性 (下 / 上付 き ・ ド ロ ッ プキ ャ ッ プ ・ 影付 き ) > ハ イ フ ネーシ ョ ン属性 > 構造情報。 例 : 表組 > ページ上の配置画像に関す る 情報 > リ ソ ース情報、 すなわち フ ォ ン ト ・ 色空間 ・ 画像 9.1 TETML を生成 123 > PDF 処理中に例外が発生 し た場合はエ ラ ー メ ッ セージ TETML 内では、 さ ま ざ ま な要素 と 属性がオプシ ョ ナルです。 詳 し く は、 127 ページの 9.2 「TETML の詳細を制御」 を参照 し て く だ さ い。 さ ま ざ ま な TETML の例 す: 以下に、 TETML 文書の最 も 重要な各部分を抜 き 出 し て示 し ま <?xml version="1.0" encoding="UTF-8"?> <!-- Created by the PDFlib Text Extraction Toolkit TET (www.pdflib.com) --> <TET xmlns="http://www.pdflib.com/XML/TET3/TET-3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.pdflib.com/XML/TET3/TET-3.0 http://www.pdflib.com/XML/TET3/TET-3.0.xsd" version="4.0"> <Creation platform="Linux-x86_64" tetVersion="4.0" date="2010-06-16T19:16:58+02:00" /> <Document filename="../data/FontReporter.pdf" pageCount="9" filesize="128109" linearized="true" pdfVersion="1.6"> <DocInfo> <Author>PDFlib GmbH</Author> <CreationDate>2008-07-08T15:05:39+00:00</CreationDate> <Creator>FrameMaker 7.0</Creator> <ModDate>2008-09-30T23:15:19+02:00</ModDate> <Producer>Acrobat Distiller 7.0.5 (Windows)</Producer> <Subject>PDFlib FontReporter</Subject> <Title>PDFlib FontReporter 1.3 Manual</Title> </DocInfo> <Metadata> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.1-c041 52.342996, 2008/ 05/07-20:48:00 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> ...XMPメタデータ... </rdf:RDF> </x:xmpmeta> </Metadata> <Options>tetml={} </Options> <Pages> <Page number="1" width="485" height="714"> <Options>tetml={} granularity=word </Options> <Content granularity="word" dehyphenation="false" dropcap="false" font="false" geometry="false" shadow="false" sub="false" sup="false"> <Para> <Word> <Text>PDFlib</Text> <Box llx="111.48" lly="636.33" urx="161.14" ury="654.33"/> </Word> <Word> <Text>GmbH</Text> <Box llx="165.06" lly="636.33" urx="214.84" ury="654.33"/> </Word> <Word> <Text>Munchen</Text> <Box llx="218.75" lly="636.33" urx="292.23" ury="654.33"/> </Word> ...ページ内容が続く... </Para> 124 9 章 : TET マー ク ア ッ プ言語 (TETML) </Content> </Page> <Resources> <Fonts> <Font id="F0" name="Gen_TheSans-Plain" fullname="MLNGEG+Gen_TheSans-Plain" type="Type 1 CFF" embedded="true"/> <Font id="F1" name="TheSansExtraBold-Plain" fullname="MLNGEH+TheSansExtraBold-Plain" type="Type 1 CFF" embedded="true"/> <Font id="F2" name="TheSans-Plain" fullname="MLNGGI+TheSans-Plain" type="Type 1 CFF" embedded="true"/> ...さまざまなフォントが続く... </Fonts> <ColorSpaces> <ColorSpace id="CS0" name="DeviceGray" components="1"/> <ColorSpace id="CS1" name="DeviceRGB" components="3"/> <ColorSpace id="CS2" name="DeviceCMYK" components="4"/> <ColorSpace id="CS3" name="Indexed" components="1" base="CS1"/> </ColorSpaces> </Resources> </Pages> </Document> </TET> 選択す る TETML モー ド に応 じ て、 さ ら な る 詳細を TETML 内で表す こ と も で き ま す。 TETML モー ド について詳 し く は、 128 ページの 「テ キ ス ト モー ド を選択」 で説明 し ます。 上記サンプルにグ リ フ詳細が加わっ た 1 つの変化形を以下に示 し ます。Glyph 要素は、フ ォ ン ト ・ 位置情報を含んでい ます : <Word> <Text>PDFlib</Text> <Box llx="111.48" lly="636.33" urx="161.14" ury="654.33"> <Glyph font="F1" size="18" x="111.48" y="636.33" width="9.65">P</Glyph> <Glyph font="F1" size="18" x="121.12" y="636.33" width="11.88">D</Glyph> <Glyph font="F1" size="18" x="133.00" y="636.33" width="8.33">F</Glyph> <Glyph font="F1" size="18" x="141.33" y="636.33" width="4.88">l</Glyph> <Glyph font="F1" size="18" x="146.21" y="636.33" width="4.88">i</Glyph> <Glyph font="F1" size="18" x="151.08" y="636.33" width="10.06">b</Glyph> </Box> </Word> <Word> <Text>GmbH</Text> <Box llx="165.06" lly="636.33" urx="214.84" ury="654.33"> <Glyph font="F1" size="18" x="165.06" y="636.33" width="12.06">G</Glyph> <Glyph font="F1" size="18" x="177.12" y="636.33" width="15.44">m</Glyph> <Glyph font="F1" size="18" x="192.56" y="636.33" width="10.06">b</Glyph> <Glyph font="F1" size="18" x="202.61" y="636.33" width="12.22">H</Glyph> </Box> </Word> <Word> <Text>Munchen</Text> <Box llx="218.75" lly="636.33" urx="292.23" ury="654.33"> <Glyph font="F1" size="18" x="218.75" y="636.33" width="15.77">M</Glyph> <Glyph font="F1" size="18" x="234.52" y="636.33" width="10.19">u</Glyph> <Glyph font="F1" size="18" x="244.70" y="636.33" width="10.22">n</Glyph> 9.1 TETML を生成 125 <Glyph <Glyph <Glyph <Glyph </Box> </Word> 126 font="F1" font="F1" font="F1" font="F1" size="18" size="18" size="18" size="18" x="254.92" x="262.44" x="272.66" x="282.00" 9 章 : TET マー ク ア ッ プ言語 (TETML) y="636.33" y="636.33" y="636.33" y="636.33" width="7.52">c</Glyph> width="10.22">h</Glyph> width="9.34">e</Glyph> width="10.22">n</Glyph> 9.2 TETML の詳細 を制御 さ ま ざ ま な TETML テキス ト モー ド TETML は、 さ ま ざ ま な テ キ ス ト モー ド で生成す る こ と がで き ます。 各モー ド は、 含むフ ォ ン ト ・ 位置情報の量が異な り 、 ま た、 テ キ ス ト を よ り 大 き な単位 (粒度) に ま と め る や り 方が異な っ てい ます。 テ キ ス ト モー ド は、 各ペー ジに対 し て個別に指定す る こ と が可能です。し か し 多 く の場合、TETML フ ァ イ ルは全ペー ジに対す る デー タ を同一のモー ド で含みます。 以下のテ キ ス ト モー ド が利用可能です : > glyph モー ド は、 各グ リ フ のテ キ ス ト ・ フ ォ ン ト ・ 座標を含み、 単語グループ化や構造 情報を一切含ま ない低レベルな種類です。 こ れはページ上の元のテ キ ス ト 情報を表 し てい ますので、 デバ ッ グや分析の用途を想定 し てい ます。 > word モー ド では、 テ キ ス ト は単語ご と に ま と め ら れ、 各単語の座標を持つ Box 要素が 加わ り ます。 フ ォ ン ト 情報は一切得 ら れ ません。 こ のモー ド は、 単語ベース で動作す る アプ リ ケーシ ョ ン に適 し てい ます。 約物キ ャ ラ ク タ はデフ ォ ル ト では独立 し た単語 と し て扱われますが、 こ の動作はページオプシ ョ ンで変え る こ と も で き ます (84 ペー ジの 「単語境界検出」 を参照)。 テ キ ス ト の行を Line 要素で特定 さ せ る こ と も 可能で す。 こ れは tetml ページオプシ ョ ンで制御 さ れます。 > wordplus モー ド は、 word モー ド と 似てい ますが、 単語内の全グ リ フ の フ ォ ン ト ・ 座標 の詳細が加わ り ます。 座標は、 topdown ページオプシ ョ ンに従っ て、 左下隅か左上隅 か ら の相対位置で表 さ れ ます。 wordplus モー ド では、 フ ォ ン ト の使われ方を分析 し 、 単語内での フ ォ ン ト や文字サ イ ズな ど の変化を追 う こ と が可能です。 wordplus は、 関 連する TETML 要素をすべて含む唯一のテ キ ス ト モー ド ですので、あ ら ゆ る 種類の処理 作業に適 し てい ます。 その半面、 こ れは TETML 内に大量の情報を含みますので、 最 も 大 き な量の出力を生成 し ます。 > line モー ド は、個別の Line 要素を構成す る すべてのテ キ ス ト を含みます。 その う え、複 数の行が 1 個の Para 要素内に ま と め ら れ る こ と も あ り ます。 line モー ド は、 ページ内 容が行に ま と め ら れてい る こ と がわか っ てい る 場合か、 ま たは受取先アプ リ ケーシ ョ ンが行ベース のテ キ ス ト 入力 し か扱えない場合にのみ推奨 し ます。 > page モー ド は、 段落レベルか ら 始ま る 構造情報を含みますが、 フ ォ ン ト ・ 座標の詳細 は一切含みません。 表 9.1 に、 各種テ キ ス ト モー ド 内に存在する TETML 要素を挙げます。 表 9.1 各種テキス ト モー ド 内の TETML 要素一覧 テキス ト モー ド 構造 表組 テキス ト 位置 テキス ト 詳細 glyph - - - Glyph word Para ・ Word Table ・ Row ・ Cell Box - Table ・ Row ・ Cell Box Glyph オプ シ ョ ナル : Line wordplus Para ・ Word オプ シ ョ ナル : Line line Para ・ Line - - - page Para Table ・ Row ・ Cell - - 9.2 TETML の詳細を制御 127 テキス ト モー ド を選択 TET コ マ ン ド ラ イ ン ツール (19 ページの 2.1 「 コ マ ン ド ラ イ ンオ プシ ョ ン」 を参照) では、 望むページモー ド を、 --tetml オプシ ョ ンに対す る 引数 と し て 指定す る こ と がで き ます。下記の コ マ ン ド は、wordplusモー ド でTETML出力を生成 し ます。 tet --tetml wordplus file.pdf TET ラ イ ブ ラ リ では、 テ キ ス ト モー ド は直接指定す る こ と はで き ず、 オプシ ョ ン群の組み 合わせ と し て指定 し ます : > 最小要素内のテ キ ス ト の量を、process_page( ) の granularity オプシ ョ ンで指定す る こ と がで き ます。 > granularity=glyph ま たは word の場合には、さ ら にグ リ フ詳細の量を指定す る こ と も 可 能です。 グ リ フ情報の一部分が必要ない と き は、 tetml オプシ ョ ンの glyphdetails サブ オプシ ョ ン でそれを省略 さ せ る こ と も で き ます。 下記のページオプシ ョ ン リ ス ト は、すべてのグ リ フ詳細を含めたwordplusモー ド でTETML 出力を生成 し ます : granularity=word tetml={ glyphdetails={all} } 表 9.2 に、 各種ページモー ド を作成す る ためのオプシ ョ ン を ま と め ます。 表 9.2 TET ラ イ ブ ラ リ で各種 TETML テキス ト モー ド を作成 テキス ト モー ド process_page( ) の granularity オプ シ ョ ン process_page( ) の tetml オプ シ ョ ン glyph granularity=glyph tetml={glyphdetails={all}} word granularity=word - wordplus granularity=word tetml={glyphdetails={all}} Line 要素付き word granularity=word tetml={elements={line}} Line 要素付き wordplus granularity=word tetml={glyphdetails={all} elements={line}} line granularity=line - page granularity=page - TETML 出力 を制御す る ための文書オ プ シ ョ ン こ の項では、 生成 さ れ る TETML 出力を 直接制御す る さ ま ざ ま なオプシ ョ ン の効力を ま と め ま す。 他のすべての文書オプシ ョ ン は、 処理の詳細を制御す る ために用い る こ と がで き ま す。 文書オプ シ ョ ン の完全な説明 は、 161 ページの表 11.6 にあ り ます。 文書関連 の オ プ シ ョ ン は、 --docopt コ マ ン ド ラ イ ン オ プ シ ョ ン に、 ま た は open_ document( ) 関数に与え る 必要があ り ます。 tetml オプシ ョ ンは、 TETML の一般的な諸側面を制御 し ます。 い く つかの TETML 要 素は、 必要なければ、 elements サブオプシ ョ ン を用いてな く す こ と も で き ます。 下記の文 書オプシ ョ ン リ ス ト は、 生成 さ れ る TETML 出力内に文書レベルの XML メ タ デー タ がな い よ う に し てい ます : tetml={ elements={nodocxmp} } 128 9 章 : TET マー ク ア ッ プ言語 (TETML) engines オプシ ョ ンは、 テ キ ス ト ・ 画像抽出エン ジ ン を有効化ま たは無効化 し ます。 下記 のオプシ ョ ン リ ス ト は、 テ キ ス ト 内容を処理 し ますが、 画像処理は無効化 し てい ます : engines={noimage} TETML を生成す る 際に与え ら れたすべての文書オプシ ョ ンは、 下記の文書オプシ ョ ンで 無効化 さ れないかぎ り 、 /TET/Document/Options 要素内に記録 さ れます : tetml={ elements={nooptions} } TETML 出力 を制御す る ためのページ オ プ シ ョ ン ペー ジ オ プ シ ョ ン の完全 な 説明は表 11.8 にあ り ます。 ページ関連のオプシ ョ ンは、 --pageopt コ マ ン ド ラ イ ン オプシ ョ ン に、 ま たは process_page( ) 関数に与え る 必要があ り ます。 tetml オプシ ョ ンは、 Glyph 要素内の座標 ・ フ ォ ン ト 関連情報を有効化ま たは無効化 し ます。 下記のページオプシ ョ ン リ ス ト は、 Glyph 要素内の フ ォ ン ト 詳細を有効化 し てい ま すが、 それ以外のグ リ フ属性はない よ う に し てい ます : tetml={ glyphdetails={font} } 下記のページオプシ ョ ン リ ス ト は、 TETML 出力に Line 要素を加え てい ます : tetml={ glyphdetails={font} elements={line} } 下記のページオプシ ョ ンは、 下付 き と 上付 き を示すために、 Glyph 要素に sub ・ sup 属性 を追加 し てい ます : tetml={ glyphdetails={sub sup} } 下記のページオプシ ョ ンは、 all を用いて、 Glyph 要素に可能なすべての属性を生成 し てい ます : tetml={ glyphdetails={all} } 下記のページオプシ ョ ンは、デフ ォ ル ト の上向 き 座標ではな く 下向 き 座標を要請 し てい ま す: topdown={output} 下記のページオプシ ョ ン リ ス ト は、 TET に対 し て、 約物キ ャ ラ ク タ を隣接す る 単語に結合 す る よ う 指示 し てい ます。 すなわち こ の場合、 約物キ ャ ラ ク タ は独立 し た単語 と し ては扱 われません : contentanalysis={nopunctuationbreaks} 下記のページオプシ ョ ンは、 page モー ド でのみ意味を持ち ます。 デフ ォ ル ト 区切 り キ ャ ラ ク タ を ラ イ ン フ ィ ー ド か ら スペースへ変更 し ます : contentanalysis={lineseparator=U+0020} TETML を生成す る 際に与え ら れたすべてのページオプシ ョ ンは、 下記の文書オプシ ョ ン で無効化 さ れないかぎ り 、 /TET/Document/Pages/Page/Options 要素内に (各ページ ご と に 個別に) 記録 さ れます : tetml={ elements={nooptions} } 9.2 TETML の詳細を制御 129 例外処理 PDF 解析中にエ ラ ーが発生 し た場合、 TET は一般には、 可能な ら ばその問題 を 修復 ま た は無視 し よ う と し 、 可能で な い な ら 例外 を 発生 さ せ ま す。 し か し 、 TET で TETML 出力を生成 し てい る 際には、 PDF 解析上の問題は通常、 TETML 内の Exception 要 素 と し て報告 さ れます : <Exception errnum="4506">Object 'objects[49]/Subtype' does not exist</Exception> TETML 出力を処理 し てい る 際に、期待 し た要素でな く Exception 要素が現れた場合をいか に処理す る かは、 アプ リ ケーシ ョ ン側で手はずを整え る 必要があ り ます。 TETML 出力フ ァ イ ルの生成を妨げ る 問題の場合は (出力フ ァ イ ルへの書 き 込み権限が ないな ど)、 例外が発生 し 、 有効な TETML 出力は生成 さ れません。 130 9 章 : TET マー ク ア ッ プ言語 (TETML) 9.3 TETML の さ ま ざ ま な要素 と TETML スキーマ すべての TETML 要素 ・ 属性 と それ ら の関係についての正式な XML ス キーマ定義 (XSD) が、 TET デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれてい ます。 TET 名前空間は下記の と お り です : http://www.pdflib.com/XML/TET3/TET-3.0 こ の ス キーマは Web 上の下記 URL か ら ダ ウ ン ロ ー ド す る こ と も で き ます : http://www.pdflib.com/XML/TET3/TET-3.0.xsd 各 TETML 文書のルー ト 要素内には、 TETML 名前空間 と ス キーマ ロ ケーシ ョ ンが と も に 存在 し てい ます。 表 9.3 に、 すべての TETML 要素の役割を説明 し ます。 TET 4.0 で導入 さ れた属性には その旨記 し てい ます。 図 9.1 に、 TETML 要素群の XML 階層構造を図示 し ます。 表 9.3 TETML 要素 ・ 属性一覧 TETML 要素 説明 と 属性 Attachment PDF 添付については、 入れ子にな っ た Document 要素内にその内容を記述 し ます。 非 PDF 添付にすいては、 その名前のみが挙げ ら れ、 内容は記述 さ れません。 属性 : name ・ level ・ pagenumber Attachments Attachment 要素群の コ ン テナ Box 単語の座標を記述 し ます。 属性 llx と lly は Box の左下隅を、 urx と ury は右上隅を、 標準 PDF 座標で記述 し ます。 1 個の単語が複数の Box 要素を含む場合 も あ り ます。 た と えばハ イ フ ン区切 り さ れた単語が複数のテキス ト 行にわた っ ている場合や、 単語の先頭が大き な キ ャ ラ ク タ にな っ ている場合な ど です。 属性 : llx ・ lly1 ・ urx ・ ury1 ・ ulx ・ uly1 ・ lrx ・ lry1 Cell 1 個の表セルの内容を記述 し ます。 属性 : colSpan ColorSpace PDF 色空間を記述 し ます。 属性 : alternate ・ base ・ components ・ id ・ name ColorSpaces ColorSpace 要素群の コ ン テナ Content ページ内容を階層構造 と し て記述 し ます。 属性 : granularity ・ dehyphenation (TET 4.0) ・ dropcap (TET 4.0) ・ font ・ geometry ・ shadow (TET 4.0) ・ sub (TET 4.0) ・ sup (TET 4.0) Creation TET 実行に関する日付 と オペレーテ ィ ングシ ス テムプ ラ ッ ト フ ォ ーム と 、 TET のバージ ョ ン番号を記述 し ます。 属性 : platform ・ tetVersion ・ date DocInfo 定義済 ・ カ ス タ ム文書情報項目 Document PDF フ ァ イル名 ・ サイ ズ ・ PDF バージ ョ ン番号を含む一般的文書情報を記述 し ます。 文書 : filename ・ pageCount ・ filesize ・ linearized ・ pdfVersion ・ pdfa (TET 4.0 : PDF/A-2 に 対する新 し い値群) ・ pdfe (TET 4.0) ・ pdfx ・ tagged Encryption さ ま ざ ま なセキ ュ リ テ ィ 設定を記述 し ます。 属性 : keylength ・ algorithm ・ description ・ masterpassword ・ userpassword ・ noprint ・ nomodify ・ nocopy ・ noannots ・ noassemble ・ noforms ・ noaccessible ・ nohiresprint ・ plainmetadata 9.3 TETML の さ ま ざ ま な要素 と TETML スキーマ 131 表 9.3 TETML 要素 ・ 属性一覧 TETML 要素 説明 と 属性 Exception TET が発生 さ せた例外に関連する エ ラ ー メ ッ セージ ・ 番号を内容 と し て持ち ます。 PDF デー タ 構造が正 し く ないために入力か ら充分な情報を抽出で き ない場合には、 こ の Exception 要素が他の要素を置き換え る こ と があ り ます。 属性 : errnum Font フ ォ ン ト リ ソ ース を記述 し ます。 必須の name 属性は正準フ ォ ン ト 名を内容 と し て持ち、 オプ シ ョ ナルな fullname 属性はサブ セ ッ ト 接頭辞を含む フ ォ ン ト 名を持ち ます。 属性 : embedded ・ fullname (TET 4.0) ・ id ・ type ・ name ・ vertical Fonts Font 要素群の コ ン テナ Glyph 1 個のグ リ フ に対する フ ォ ン ト ・ 位置情報の詳細を記述 し ます。 こ の要素は、 こ のグ リ フ が生み出す Unicode キ ャ ラ ク タ を内容 と し て持ち ます。 こ れは、 た と えば合字の場合な ど、 複数のキ ャ ラ ク タ にな る こ と も あ り ます。 単語に対する Glyph 要素群は、 1 個ない し 複数 の Box 要素内にま と め られています。 属性 : x ・ y1 ・ width ・ alpha1 ・ beta1 ・ shadow (TET 4.0) ・ dropcap (TET 4.0) ・ font ・ size ・ sub (TET 4.0) ・ sup (TET 4.0) ・ textrendering ・ unknown ・ dehyphenation (TET 4.0) Image 画像 リ ソ ース を、 すなわち、 画像を構成する ピ ク セル配列本体を記述 し ます。 属性 : bitsPerComponent ・ colorspace ・ extractedAs (TET 4.0) ・ height ・ id ・ mask ・ maskonly ・ mergetype ・ width Images Image 要素群の コ ン テナ Line 1 個の行に対する テキス ト を内容 と し て持ち ます。 TET 4.0 : Line は Word 要素群を含む こ と も あ り え ます。 Metadata XMP メ タ デー タ を内容 と し て持ち ます。 文書 ・ フ ォ ン ト ・ 画像に紐付け られます。 Options TETML を生成する ために用い られた文書またはページオプ シ ョ ン を内容 と し て持ち ます。 Page 1 個のページの内容を含みます。 属性 : number ・ height ・ width ・ topdown (TET 4.0) Pages Page 要素群の コ ン テナ Para 1 個の段落を構成する テキス ト を内容 と し て持ち ます。 PlacedImage ページ上に配置 さ れている画像のイ ン ス タ ン ス を記述 し ます。 属性 : alpha1 ・ beta1 ・ height ・ image ・ width ・ x ・ y1 Resources 色空間 ・ フ ォ ン ト ・ 画像 リ ソ ース を内容 と し て持ち ます。 Row 1 個ない し 複数の表セルを内容 と し て持ち ます。 Table 1 個ない し 複数の表行を内容 と し て持ち ます。 TET ルー ト 要素 属性 : version (TET 4.0 は 4.0 を生成 し ます。 TET 3 は 3 を生成 し ま し た。 こ れは区別のた めに利用で き ます) Text 単語な どの要素のテキス ト 内容 Word 1 個の単語 1. 垂直座標 と 角度はすべて、 topdown ページオ プ シ ョ ン に従 っ て、 左下隅か左上隅のいずれかか ら の相対位置で表 さ れます。 132 9 章 : TET マー ク ア ッ プ言語 (TETML) 133 9 章 : TET マー ク ア ッ プ言語 (TETML) 図 9.1 TETML 要素の階層構造。 オプ シ ョ ナルな要素は破線の枠 で示 し ています。 実線の枠の要素は必須です。 9.4 TETML を XSLT で変換 XSLT のご く 簡単な概略 XSLT (eXtensible Stylesheet Language Transformations の略) は、 XML 文書を他の文書へ変換す る ための言語です。 その入力は必ず XML 文書ですが (私た ちの場合は TETML 文書)、 出力は必ず し も XML であ る 必要はあ り ません。XSLT では、任 意の計算を行 う こ と も で き 、 プ レーン テ キ ス ト や HTML 出力を生成す る こ と も で き ます。 XSLT ス タ イ ルシー ト を用いて TETML 入力を処理 し 、 その入力に基づいた新 し いデー タ セ ッ ト (テ キ ス ト ・ XML ・ CSV ・ HTML のいずれかの形式で提供) を生成 し ま し ょ う 。 こ の TETML 入力は、 PDF 文書の内容を反映 し てい ます。 TETML 文書は、 123 ページの 9.1 「TETML を生成」 で説明 し た よ う に、 TET コ マ ン ド ラ イ ン ツールで、 ま たは TET ラ イ ブ ラ リ で生成 さ れてい ます。 XSLT は非常に強力ですが、 通常のプ ロ グ ラ ミ ン グ言語 と はか な り 異な っ て い ま す。 XSLT プ ロ グ ラ ミ ン グの初歩を こ の節で解説 し よ う と す る つ も り はあ り ません。 それに関 し ては さ ま ざ ま な書籍や Web の情報があ り ますのでそち ら を参照 し て く だ さ い。 私たち のサンプルは XSLT 1.0 だけに し て あ り ます。いろいろ な XSLT 2.0 実装が入手可能ではあ り ますが、XSLT 1.0 に比べる と ま だ広 く 普及 し てい る と は言いがたい現状です。XSLT 1.0 の仕様は www.w3.org/TR/xslt にあ り ます。 と はいえ、読者が TETML 文書の XSLT 処理にすばや く 着手 し 実現で き る よ う 手助けす る こ と は私たちの望みです。 こ の節では、 XSLT ス タ イ ルシー ト を動作 さ せ る ために最 も 重要な環境を説明す る と と も に、 こ の目的のために広 く 利用 さ れてい る ソ フ ト ウ ェ ア を挙 げます。 XSLT ス タ イ ルシー ト を XML 文書に適用す る ためには、 XSLT プ ロ セ ッ サが必要 です。 無償や商用の さ ま ざ ま な XSLT プ ロ セ ッ サが入手可能であ り 、 そのなかには ス タ ン ド ア ロ ン なや り 方で利用で き る も の も あれば、プ ロ グ ラ ミ ン グ言語の助けに よ っ て自分の プ ロ グ ラ ムの中で利用可能な も の も あ り ます。 XSLT ス タ イ ルシー ト では、処理の詳細を制御す る ために環境か ら ス タ イ ルシー ト へ渡 さ れ る パ ラ メ タ を活用す る こ と も 可能です。 私た ちの XSLT サンプルのなかに も ス タ イ ル シー ト パ ラ メ タ を利用 し てい る も のがい く つかあ り ますので、 さ ま ざ ま な環境でパ ラ メ タ を ス タ イ ルシー ト へ受け渡す方法について も 情報を提供 し ます。 さ ま ざ ま なパ ッ ケージ ン グで利用で き る 、 広 く 利用 さ れてい る XSLT プ ロ セ ッ サには、 以下の よ う な も のがあ り ます : > Microsoft の MSXML と い う XML 実装。Windows 2000 SP4 か ら オペレーテ ィ ン グ シ ス テ ム に内蔵 さ れてい ます。 > Microsoft の .NET Framework 2.0 XSLT 実装 > Saxon。 無償版 と 商用版が入手可能です。 > Xalan。Apache フ ァ ウ ンデーシ ョ ンがホ ス ト し てい る オープン ソ ース プ ロ ジ ェ ク ト です (C++ 実装 と Java が入手可能です)。 > GNOME プ ロ ジ ェ ク ト のオープン ソ ース の libxslt ラ イ ブ ラ リ > Sablotron。 オープン ソ ース の XSLT ツールキ ッ ト です。 コ マ ン ド ラ イ ン で XSLT XSLT ス タ イ ルシー ト を コ マ ン ド ラ イ ン か ら 適用す る こ と は、 便利な開発 ・ 試験環境を提供 し ます。 以下の さ ま ざ ま な例は、 XSLT ス タ イ ルシー ト を コ マ ン ド ラ イ ン 上 で 適用す る 方法 を 示 し て い ま す。 サ ン プ ル はすべ て、 入力 フ ァ イ ル FontReporter.tetml を ス タ イ ルシー ト tetml2html.xsl で処理 し てお り 、 その際、 XSLT パ ラ メ タ toc-generate (ス タ イ ルシー ト 内で用い ら れてい る ) を値 0 に設定 し てお り 、 そ し て 生成 さ れた出力を FontReporter.html へ送っ てい ます : > Java ベース の Saxon プ ロ セ ッ サ (www.saxonica.com 参照) は下記の よ う に使え ます : 134 9 章 : TET マー ク ア ッ プ言語 (TETML) java -jar saxon9.jar -o FontReporter.html FontReporter.tetml tetml2html.xsl toc-generate=0 > xsltproc ツールは、多 く の Linux デ ィ ス ト リ ビ ュ ーシ ョ ンに含まれてい ます。xmlsoft.org/ XSLT を参照 し て く だ さ い。 ス タ イ ルシー ト を TETML 文書に適用す る には下記の コ マ ン ド を用い ます : xsltproc --output FontReporter.html --param toc-generate 0 tetml2html.xsl FontReporter.tetml > Xalan C++ は、 コ マ ン ド ラ イ ン ツールを提供 し てお り 、 こ れは下記の よ う に し て起動で き ます : Xalan -o FontReporter.html -p toc-generate 0 FontReporter.tetml tetml2html.xsl > MSXML パーサを持つ Windows シ ス テ ムでは、Microsoft が提供 し てい る 無償の msxsl.exe プ ロ グ ラ ム を利用で き ます。 こ のプ ロ グ ラ ムは ( ソ ース コ ー ド も 含め) 下記の場所で 入手可能です : www.microsoft.com/downloads/details.aspx?familyid=2FB55371-C94E-4373-B0E9-DB4816552E41 こ のプ ロ グ ラ ムは下記の よ う に動作 さ せます : msxsl.exe FontReporter.tetml tetml2html.xsl -o FontReporter.html toc-generate=0 自分のア プ リ ケーシ ョ ン内で XSLT 自分のアプ リ ケーシ ョ ンの中に XSLT 処理を組み込 みたい場合には、 XSLT プ ロ セ ッ サの選択は当然、 使 う プ ロ グ ラ ミ ン グ言語 と 環境に依存 し ます。 TET デ ィ ス ト リ ビ ュ ーシ ョ ンは、 さ ま ざ ま な重要な環境のためのサンプル コ ー ド を含んでい ます。 runxslt サンプル群は、 TETML 文書を読み込み、 XSLT ス タ イ ルシー ト をパ ラ メ タ 付 き で適用 し 、 生成 さ れた出力を フ ァ イ ルへ書 き 出す方法を演示 し てい ます。 こ れ ら のプ ロ グ ラ ムは、 引数な し で実行 さ れた場合には、 TET デ ィ ス ト リ ビ ュ ーシ ョ ン と と も に提供 さ れてい る すべての XSLT サンプルを実行 し ます。あ る いは、TETML 入力フ ァ イ ル名 ・ XSLT ス タ イ ルシー ト 名 ・ 出力フ ァ イ ル名 ・ パ ラ メ タ / 値対群について引数群を 与え る こ と も で き ます。 runxslt サンプル群は、 XSLT 処理を自分のアプ リ ケーシ ョ ンへ組 み込むための出発点 と し て活用す る こ と がで き ます : > Java 開発者は、javax.xml.transform パ ッ ケージ内の メ ソ ッ ド 群を利用で き ます。 こ れは runxslt.java サンプルで演示 し てい ます。 ま た、 ant ビル ド ツールでは、 コ ーデ ィ ン グ な し で Java ベース の XSLT を実行で き ます。TET デ ィ ス ト リ ビ ュ ーシ ョ ン内の build.xml フ ァ イ ルは、 全サンプル用の XSLT タ ス ク 群を含んでい ます。 > .NET 開発者は、 System.Xml.Xsl.XslTransform 名前空間内の メ ソ ッ ド 群を利用で き ます。 こ れは runxslt.ps1 PowerShell ス ク リ プ ト で演示 し てい ます。 同様の コ ー ド を、 C# や他 の .NET 言語で利用で き ます。 > COM オー ト メ ーシ ョ ンに対応 し てい る すべての Windows ベース のプ ロ グ ラ ミ ン グ言語 は、MSXML パーサが提供 し てい る MSXML2.DOMDocument オー ト メ ーシ ョ ン ク ラ ス の メ ソ ッ ド 群を利用で き ます。こ れは runxslt.vbs サンプルで演示 し てい ます。同様の コ ー ド を、 他の COM 対応言語で利用で き ます。 Perl な ど他の多 く のプ ロ グ ラ ミ ン グ言語では、 XSLT 拡張が利用可能です。 Web サーバで XSLT XML か ら HTML への変換は XSLT の用途 と し て代表的な も のです ので、 XSLT ス タ イ ルシー ト を Web サーバ上で動作 さ せたい と き も 多 く あ り ます。 い く つ かの重要なシナ リ オ : 9.4 TETML を XSLT で変換 135 > ASP ま たはASP.NETを持つWindowsベース のWebサーバでは、上述のCOM ま たは.NET イ ン タ フ ェース を利用で き ます。 > Java ベース の Web サーバでは javax.xml.transform パ ッ ケージ を利用で き ます。 > PHP ベース の Web サーバでは Sablotron プ ロ セ ッ サを利用で き ます。 www.php.net/ manual/en/intro.xsl.php を参照 し て く だ さ い。 Web ブ ラ ウザで XSLT 現在普及 し てい る 多 く のブ ラ ウ ザ も 、 XSLT 変換に対応 し てい ま す。 XSLT ス タ イ ルシー ト を TETML 文書に適用す る よ う ブ ラ ウ ザに指示す る には、 その TETML 文書の xml 処理命令を含む先頭行の後、 かつルー ト 要素の前に、 適切な処理命令 を持つ行を追加 し ま す。 そ し て それ を ブ ラ ウ ザへ読み込めば、 ブ ラ ウ ザはその ス タ イ ル シー ト を適用 し 、 結果の出力を表示 し ます (なお、 Internet Explorer では、 ロ ーカルデ ィ ス ク か ら の フ ァ イ ルを処理す る 際にはフ ァ イ ル名接尾辞 .xml が必要です) : <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="tetml2html.xsl" version="1.0"?> <TET xmlns="http://www.pdflib.com/XML/TET3/TET-3.0" ... ブ ラ ウ ザは、 XSLT ス タ イ ルシー ト を TETML 文書に適用 し 、 そ し てその結果のテ キ ス ト ・ HTML ・ XML のいずれかの出力 を表示 し ま す。 あ る いは、 ブ ラ ウ ザでの XSLT 処理は、 JavaScript コ ー ド か ら 引 き 起 こ さ せ る こ と も 可能です。 Firefox 2 以上では、xslt-param 処理命令を用いてパ ラ メ タ を XSLT ス タ イ ルシー ト に与 え る こ と も で き ます : <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="tetml2html.xsl" version="1.0"?> <?xslt-param name="toc-generate" value="0"?> <TET xmlns="http://www.pdflib.com/XML/TET3/TET-3.0" ... 136 9 章 : TET マー ク ア ッ プ言語 (TETML) 9.5 さ ま ざ ま な XSLT サ ン プル TET デ ィ ス ト リ ビ ュ ーシ ョ ンは、 XSLT を TETML に適用 し た場合の強力 さ を演示す る XSLT ス タ イ ルシー ト をい く つか含んでい ます。 こ れ ら は、 TETML アプ リ ケーシ ョ ンの出 発点 と し て活用す る こ と も で き ます。 こ の節では、 こ の XSLT サンプル群の概要を紹介す る と と も に、 サンプル出力を掲載 し ます。 134 ページの 9.4 「TETML を XSLT で変換」 で、 XSLT ス タ イ ルシー ト を動作 さ せ る ための多 く のオプシ ョ ン を説明 し てい ます。 こ の ス タ イ ルシー ト 群の機能 と 内部動作に関 し て詳 し く は、 XSLT コ ー ド の コ メ ン ト に記 し て あ り ます。 こ の ス タ イ ルシー ト サンプル群のい く つかの一般的側面 : > 多 く の XSLT サンプルはパ ラ メ タ に対応 し てお り 、こ れを用いて さ ま ざ ま な処理詳細を 制御する こ と がで き ます。 こ れ ら のパ ラ メ タ は、 XSLT コ ー ド 内で設定す る こ と も で き ます し 、 環境 (ant な ど) か ら 上書 き す る こ と も で き ます。 > 多 く の XSLT サンプルでは、 特定のテ キ ス ト モー ド (た と えば word モー ド 。 詳 し く は、 127 ページの 「 さ ま ざ ま な TETML テ キ ス ト モー ド 」 を参照) の TETML 入力を必要 と し ます。 それ ら のサンプルは、 誤っ た入力か ら 自己を守る ために、 与え ら れた TETML 入力が要請に準拠 し てい る か ど う か をチ ェ ッ ク し て、 準拠 し ていないな ら エ ラ ーを報 告 し ます。 > XSLT サンプルのなかには、文書内の PDF 添付を再帰的に処理する も のがあ り ます ( こ れは後述の説明の中でその旨記 し てい ます)。 し か し 多 く のサンプルは PDF 添付を無 視 し ます。 それ ら も 、 添付を処理す る よ う に拡張す る こ と が容易な よ う に書かれてい ます。 Attachments 要素内の対象要素を選択すれば充分です。 関連する xsl:template 要 素自体に変更を加え る 必要はあ り ません。 > XSLTサンプルはすべてXSLT 1で動作 し ます。サンプルに よ っ てはXSLT 2の機能を使え ば も っ と 簡単化で き る も の も あ り ますが、使いやす さ を考え て XSLT 1 に こ だわ り たい と 考え ま し た。 コ ン コ ーダ ン ス を生成 concordance.xsl ス タ イ ルシー ト は、word ま たは wordplus モー ド の TETML 入力を受け付け ます。 こ れは コ ン コ ーダ ン ス を、 すなわち、 文書内の単語を出 現頻度の高い順に並べた一覧を生成 し ま す。 こ れは、 言語分析のための コ ン コ ーダ ン ス や、 翻訳者のための相互参照や、 整合性チ ェ ッ ク な ど を生成す る のに有用で し ょ う 。 List of words in the document along with the number of occurrences: the 207 font 107 of 100 a 92 in 83 and 75 fonts 64 PDF 60 FontReporter 58 ... フ ォ ン ト フ ィ ル タ リ ン グ fontfilter.xsl ス タ イ ルシー ト は、 glyph ま たは wordplus モー ド の TETML 入力を受け付け ます。 こ れは文書内の、 特定の フ ォ ン ト を用いた、 かつ指定 さ れた値 よ り 大 き なサ イ ズの単語の一覧を作 り ます。 こ れは、 特定の フ ォ ン ト / サ イ ズの組 み合わせを検出 し た り 、 品質管理のために有用で し ょ う 。 同 じ コ ン セプ ト を用いて、 大 き な文字サ イ ズ を用いた テ キ ス ト 部分に基づいた目次を生成す る こ と も で き ます。 9.5 さ ま ざ ま な XSLT サン プル 137 Text containing font 'TheSansBold-Plain' with size greater than 10: [TheSansBold-Plain/24] Contents [TheSansBold-Plain/13.98] 1 [TheSansBold-Plain/13.98] Installing [TheSansBold-Plain/13.98] PDFlib [TheSansBold-Plain/13.98] FontReporter [TheSansBold-Plain/13.98] 2 [TheSansBold-Plain/13.98] Working [TheSansBold-Plain/13.98] with [TheSansBold-Plain/13.98] FontReporter [TheSansBold-Plain/13.98] A [TheSansBold-Plain/13.98] Revision [TheSansBold-Plain/13.98] History [TheSansBold-Plain/24] 1 [TheSansBold-Plain/24] Installing [TheSansBold-Plain/24] PDFlib [TheSansBold-Plain/24] FontReporter ... フ ォ ン ト の使用箇所 を検索 fontfinder.xsl ス タ イ ルシー ト は、glyph ま たは wordplus モー ド の TETML 入力を受け付け ます。 文書内のすべてのフ ォ ン ト について、 特定の フ ォ ン ト を用いてい る テ キ ス ト の出現箇所をすべて、そのページ番号 と ページ上の位置 と と も に一 覧に し ます。 こ れは、 望ま し く ない フ ォ ン ト を検出 し て整合性をチ ェ ッ ク し た り 、 特定の 悪い文字サ イ ズの使用を見つけた り す る ために有用で し ょ う 。 TheSansExtraBold-Plain used on: page 1: (111, 636), (165, 636), (219, 636), (292, 636), (301, 636), (178, 603), (221, 603), (226, 603), (272, 603), (277, 603), (102, 375), (252, 375), (261, 375), (267, 375) TheSans-Plain used on: page 1: (102, 266), (119, 266), (179, 266), (208, 266), (296, 266), (346, 266), (367, 266) ... フ ォ ン ト 統計 fontstat.xsl ス タ イ ルシー ト は、glyph ま たは wordplus モー ド の TETML 入 力を受け付け ます。 こ れはフ ォ ン ト と グ リ フ の統計を生成 し ます。 こ れは、 品質管理に有 用なほか、 各フ ォ ン ト についてマ ッ プな し グ リ フ (すなわち、 いかな る Unicode キ ャ ラ ク タ を も マ ッ プで き ない グ リ フ) も 報告 さ れ ま すので、 ア ク セ シ ビ リ テ ィ 試験に も 有用で し ょ う。 19894 total glyphs in the document; breakdown by font: 68.71% ThesisAntiqua-Normal: 13669 glyphs 22.89% TheSans-Italic: 4553 glyphs 6.38% TheSansBold-Plain: 1269 glyphs 0.9% TheSansMonoCondensed-Plain: 179 glyphs 0.49% TheSansBold-Italic: 98 glyphs 0.27% TheSansExtraBold-Plain: 54 glyphs 0.21% TheSerif-Caps: 42 glyphs 0.15% TheSans-Plain: 29 glyphs 0.01% Gen_TheSans-Plain: 1 glyphs 138 9 章 : TET マー ク ア ッ プ言語 (TETML) 索引 を生成 index.xsl ス タ イ ルシー ト は、 word ま たは wordplus モー ド の TETML 入力を 受け付け ます。 こ れは索引を、 すなわち、 文書内の単語を アルフ ァ ベ ッ ト 順に並べ、 おの おのページ番号 と と も に一覧に し た も のを生成 し ます。数字 と 約物キ ャ ラ ク タ は無視 さ れ ます。 Alphabetical list of words in the document along with their page number: A about 2 7 8 access 8 12 accessible 11 achieving 9 12 Acrobat 2 5 7 8 9 10 11 14 15 17 ActiveX 2 actual 9 12 actually 11 12 14 addition 9 Additional 12 additions 17 address 9 12 addressed 9 addressing 9 Adobe 2 5 8 12 14 ... XMP メ タ デー タ を抽出 metadata.xsl ス タ イ ルシー ト は、任意のモー ド の TETML 入力を 受け付け ます。 こ れは文書レベルの XMP メ タ デー タ を対象 と し てお り 、 XMP か ら い く つ かの メ タ デー タ プ ロ パテ ィ を抽出 し ます。 文書内の PDF 添付 (PDF パ ッ ケージ ・ ポー ト フ ォ リ オを含め) は再帰的に処理 さ れます : dc:creator = PDFlib GmbH xmp:CreatorTool = FrameMaker 7.0 表組内容 を CSV 形式で抽出 table.xsl ス タ イ ルシー ト は、 word ・ wordplus ・ page のいず れかのモー ド の TETML 入力を受け付け ます。 こ れは、指定 さ れた表組の内容を抽出 し て、 その表組内容を含む CSV フ ァ イ ル (カ ン マ区切 り 値) を生成 し ます。 CSV フ ァ イ ルは、 あ ら ゆ る 表計算アプ リ ケーシ ョ ンで開 く こ と がで き ます。 こ れは、 PDF 文書内の表組の内 容を再利用す る のに有用で し ょ う 。 TETML を HTML へ変換 tetml2html.xsl ス タ イ ルシー ト は、wordplus モー ド の TETML 入 力を受け付け ます。 こ れは TETML を、 ブ ラ ウ ザで表示で き る HTML へ変換 し ます。 こ の コ ンバー タ は、 PDF 文書 と 同等の視覚表現を生成 し よ う と す る も のではな く 、 以下の側面 を演示す る も のです : > 見出 し 要素 (H1 ・ H2 な ど) を、 設定可能な文字サ イ ズに基づいて生成 し ます。 > TETML 内の表組要素を、 おのおの HTML 表組構造へマ ッ プ し て、 表組をブ ラ ウ ザで表 示可能に し ます。 > HTML ページの冒頭に目次を生成 し ます。その各項目は、文書内の何 ら かの見出 し に基 づいてお り 、 おのおのの見出 し へ飛ぶア ク テ ィ ブ リ ン ク を含んでい ます。 > 各ページについて画像の一覧を生成 し ます。 おのおの、 TET コ マ ン ド ラ イ ン ツールに よ っ て resource 画像ループモー ド で (例 : tet --image --tetml file.pdf) 生成 さ れた画像 フ ァ イ ル名を用いて画像フ ァ イ ルへ リ ン ク さ れてい ます。 9.5 さ ま ざ ま な XSLT サン プル 139 生テキス ト を TETML か ら 抽出 textonly.xsl ス タ イ ルシー ト は、 任意のモー ド の TETML 入力を受け付け ます。 こ れは、 すべての Text 要素を取得 し つつ、 他のすべての要素を無 視す る こ と に よ り 、 生テ キ ス ト 内容を抽出 し ます。 文書内の PDF 添付 (PDF パ ッ ケージ ・ ポー ト フ ォ リ オを含め) は再帰的に処理 さ れます。 140 9 章 : TET マー ク ア ッ プ言語 (TETML) 10 pCOS イ ン タ フ ェ ース pCOS (PDFlib Comprehensive Object Syntax) イ ン タ フ ェース は、 PDF 文書のページ内容記 述以外のすべてのセ ク シ ョ ン、 すなわちページサ イ ズ ・ メ タ デー タ ・ イ ン タ ラ ク テ ィ ブ要 素等か ら 任意の情報を取得で き る 簡単でエ レ ガ ン ト な機能を提供 し ま す。 pCOS イ ン タ フ ェース の利用例 と 、 pCOS パス文法の説明は、 別文書であ る pCOS リ フ ァ レ ン ス に含ま れてい ます。 さ ら な る 作成例が pCOS ク ッ ク ブ ッ ク にあ り ます : www.pdflib.com/pcos-cookbook/ 141 142 10 章 : pCOS イ ン タ フ ェ ース 11 TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 11.1 オ プ シ ョ ン リ ス ト オプシ ョ ン リ ス ト は、 さ ま ざ ま な API 関数呼び出 し を制御す る ための、 強力で、 それでい て簡単な方式です。 多 く の API メ ソ ッ ド では、 オプシ ョ ン リ ス ト が使え る よ う にな っ てい ますので、 関数に膨大な引数を与え る 必要があ り ません。 略 し て optlist と も いい ます。 こ れは、 任意の数のオプシ ョ ン を内容 と し て持つ こ と ので き る 文字列です。 オプシ ョ ン リ ス ト は、 さ ま ざ ま なデー タ 型や、 リ ス ト の よ う な複合デー タ に対応 し てい ます。 多 く の言語 バ イ ンデ ィ ン グでは、 オプシ ョ ン リ ス ト は、 必要な キーワー ド と 値を連結 し てい く こ と に よ っ て、 簡単に構築す る こ と がで き ます。 バインディング C 言語バ イ ンデ ィ ン グ : sprintf( ) 関数を用いてオプシ ョ ン リ ス ト を構築す る と よ いで し ょ う。 バインディング .NET 言語バ イ ンデ ィ ン グ : C# プ ロ グ ラ マーは、 AppendFormat( ) StringBuilder メ ソ ッ ド は 整形項目を表すのに中括弧 { } を用いて、 それが引数の文字列表現へ置 き 換え ら れ る こ と に留意す る 必要があ り ます。 一方 Append( ) メ ソ ッ ド では、 中括弧キ ャ ラ ク タ にいかな る 特別な意味を も 持たせてい ません。オプシ ョ ン リ ス ト 文法は中括弧キ ャ ラ ク タ を利用 し て い ますので、AppendFormat( ) と Append( ) の ど ち ら の メ ソ ッ ド を使 う か を選ぶ と き には注 意が必要です。 11.2 オ プ シ ョ ン リ ス ト 文法 正式な オ プ シ ョ ン リ ス ト 文法定義 オプシ ョ ン リ ス ト は、 以下の規則に従っ て構築す る 必要があ り ます : > オプシ ョ ン リ ス ト 内のすべての要素 (キー と 値) は、 1 個ない し 複数の右記区切 り キ ャ ラ ク タ に よ っ て区切 る 必要があ り ます : スペース ・ タ ブ ・ キ ャ リ ッ ジ リ タ ーン ・ ニ ュ ー ラ イ ン ・ 等号 「=」。 > 一番外側の囲み中括弧は、 要素には含まれません。 { } と 書けば空要素を意味 し ます。 > 一番外側の中括弧の中の区切 り キ ャ ラ ク タ は、要素を分割す る 効力を も はや持たず、要 素の一部分 と な り ます。 ですので、 区切 り キ ャ ラ ク タ を含む要素は、 中括弧で囲む必 要があ り ます。 > 先頭ま たは末尾に中括弧を持つ要素は、 中括弧で囲む必要があ り ます。 > 要素が片方だけの中括弧を含む場合には、 その中括弧は直前にバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ を 付け て保護す る 必要が あ り ま す。 要素の閉 じ 中括弧の直前のバ ッ ク ス ラ ッ シ ュ も 、 直前にバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ を付け る 必要があ り ます。 > オプシ ョ ン リ ス ト はバ イ ナ リ ゼ ロ 値を含んではいけ ません。 オプシ ョ ン リ ス ト は、 こ の PDFlib リ フ ァ レ ン ス内の仕様に従い、 リ ス ト 値を持つ こ と が あ り え ます。 リ ス ト 値は 1 個ない し 複数の要素 ( こ れ自体 も ま た リ ス ト であ る 場合 も あ り ます) を内容 と し て持ち ます。 それ ら は上述の規則に従っ て区切 ら れますが、 等号は区切 り キ ャ ラ ク タ と し て も はや見な さ れない と い う 点が唯一異な り ます。 単純オ プ シ ョ ン リ ス ト 多 く の場合、 オプシ ョ ン リ ス ト は 1 個ない し 複数のキー / 値対 を内容 と し て持ち ます。 キー と 値は、 ま た複数のキー / 値対 も 同様に、 1 個ない し 複数の 11.1 オプ シ ョ ン リ ス ト 143 空白キ ャ ラ ク タ (スペース ・ タ ブ ・ キ ャ リ ッ ジ リ タ ーン ・ ニ ュ ー ラ イ ン) で区切 る 必要が あ り ます。 あ る いは、 キーは等号 「=」 で値 と 区切 る こ と も で き ます : key=value key = value key value key1 = value1 key2 = value2 可読性を増すため、 キー と 値の間には等号を用い、 隣 り 合 う キー / 値対の間には空白を用 い る こ と を推奨 し ます。 オプシ ョ ン リ ス ト は左か ら 右へ と 評価 さ れ ますので、 オプシ ョ ンは同一 リ ス ト 内で複 数回与え る こ と も で き ます。 こ の場合、 最後に現れたオプシ ョ ンがそれ以前の も のを上書 き し ます。 下記の例では、 1 番目のオプシ ョ ンでの割 り 当ては 2 番目に よ っ て上書 き さ れ ますので、 オプシ ョ ン リ ス ト 処理後に key は値 value2 を持つ こ と にな り ます : key=value1 key=value2 リ ス ト 値 リ ス ト は、 1 個ない し 複数の区切 ら れた値を内容 と し て持ち ます。 こ の値は単 純値であ る こ と も あ り ます し 、 それ自体が リ ス ト 値であ る こ と も あ り ます。 リ ス ト は中括 弧 { } で囲まれてお り 、 リ ス ト 内の値群は空白キ ャ ラ ク タ で区切る 必要があ り ます。 例 : searchpath={/usr/lib/tet d:\tet} (ディレクトリ名2個を持つリスト) リ ス ト は、 入れ子にな っ た リ ス ト を内容 と し て持つ こ と も あ り ます。 こ の場合、 各 リ ス ト の間は空白で区切 る 必要があ り ます。 区切 り キ ャ ラ ク タ は、 隣 り 合 う キ ャ ラ ク タ } と { の 間には挿入す る 必要が あ り ま すが、 同 じ 種類の中括弧ど う し の間では省 く こ と も で き ま す: fold={ {[:Private_Use:] remove} {[U+FFFD] remove} } (リスト2個を持つリスト) リ ス ト がち ょ う ど 1 個の リ ス ト を内容 と し て持つ と き も 、入れ子にな っ た リ ス ト の中括弧 群を省 く こ と はで き ません : fold={ {[:Private_Use:] remove} } (入れ子のリスト1個を持つリスト) 入れ子にな っ たオ プ シ ョ ン リ ス ト と リ ス ト 値 オプシ ョ ン に よ っ ては、 オ プ シ ョ ン リ ス ト 型ま たはオプ シ ョ ン リ ス ト の リ ス ト 型を受け付け る も のがあ り ます。オプ シ ョ ン リ ス ト 型のオプシ ョ ン は、 1 個ない し 複数の子オプシ ョ ン リ ス ト を内容 と し て持ち ま す。 オ プ シ ョ ン リ ス ト の リ ス ト 型のオプシ ョ ンは、 1 個ない し 複数の入れ子にな っ たオプシ ョ ン リ ス ト を内容 と し て持ち ます。 入れ子にな っ たオプシ ョ ン リ ス ト を扱 う 際には、 囲む中括弧 の数を正 し く 指定す る こ と が重要です。 い く つかの例を以下に挙げます。 オプシ ョ ン contentanalysis の値はオプシ ョ ン リ ス ト であ り 、 そのオプシ ョ ン リ ス ト 自 体が 1 個のオプシ ョ ン punctuationbreaks を内容 と し て持ち ます : contentanalysis={punctuationbreaks=false} 下記の例で、 オプシ ョ ン glyphmapping の値は、 オプシ ョ ン リ ス ト ただ 1 個を内容 と し て 持つオプシ ョ ン リ ス ト の リ ス ト です : glyphmapping={ {fontname=GlobeLogosOne codelist=GlobeLogosOne} } 下記の例で、 オプシ ョ ン glyphmapping の値は、 オプシ ョ ン リ ス ト 2 個を内容 と し て持つ オプシ ョ ン リ ス ト の リ ス ト です : 144 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス glyphmapping { {fontname=CMSY* glyphlist=tarski} {fontname=ZEH* glyphlist=zeh}} オプシ ョ ン リ ス ト 1 個を内容 と し て持つ リ ス ト において、 そのオプシ ョ ン リ ス ト の中の fontname 値が スペース を含んでい る ので、 さ ら に中括弧で囲む必要があ り ます : glyphmapping={ {fontname={Globe Logos One} codelist=GlobeLogosOne} } キー ワー ド 2 個を内容 と し て持つ リ ス ト : fonttypes={Type1 TrueType} 異な る 型が混在 し た リ ス ト 。 内側の リ ス ト 群は、 Unicode 集合 1 個 と キーワー ド 1 個を内 容 と し て持っ てお り 、 外側の リ ス ト は、 オプシ ョ ン リ ス ト 2 個 と キーワ ー ド default を内 容 と し て持っ てい ます : fold={ {[:Private_Use:] remove} {[U+FFFD] remove} default } 矩形 1 個を内容 と し て持つ リ ス ト : includeboxes={{10 20 30 40}} はま り やすい罠 こ の項では、 オプシ ョ ン リ ス ト 文法について よ く あ る 誤 り を挙げます。 中括弧は区切 り キ ャ ラ ク タ ではあ り ませんので、 下記は誤 り です : key1 {value1}key2 {value2} 誤り! こ れはエ ラ ー メ ッ セージ Unknown option 'value2' を引き 起 こ し ます。 同様に、 下記は区切 り キ ャ ラ ク タ が抜けてい る ので誤 り です : key{value} key={{value1}{value2}} 誤り! 誤り! 中括弧は照応 し てい る 必要があ り ますので、 下記は誤 り です : key={open brace {} 誤り! こ れはエ ラ ー メ ッ セージ Braces aren't balanced in option list 'key={open brace {}' を引 き 起 こ し ます。 文字列の中のただ 1 個の中括弧は、 バ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ を直前に付け る 必要があ り ます : key={closing brace \} and open brace \{} 正しい! 文字列値の末尾のバ ッ ク ス ラ ッ シ ュ は、 直後が閉 じ 中括弧キ ャ ラ ク タ であ る 場合には、 も う 1 個のバ ッ ク ス ラ ッ シ ュ を直前に付け る 必要があ り ます : filename={C:\path\name\} filename={C:\path\name\\} 誤り! 正しい! 11.2 オプ シ ョ ン リ ス ト 文法 145 11.3 基本型 文字列 文字列は、 一般に非 ロ ー カ ラ イ ズ の キ ー ワ ー ド の た め に用い ら れ る プ レ ー ン ASCII 文字列です (EBCDIC プ ラ ッ ト フ ォームでは EBCDIC 文字列)。 空白ま たは 「=」 キ ャ ラ ク タ を含む文字列は、 { } で囲む必要があ り ます : password={ secret string } contents={length=3mm} (3個の空白を含む文字列値) (1個の等号を含む文字列値) キ ャ ラ ク タ { } は、 文字列の一部分 と し たい場合には、 \ キ ャ ラ ク タ を直前に付け る 必要が あ り ます : password={weird\}string} (右中括弧を含む文字列値) 要素の閉 じ 中括弧の直前のバ ッ ク ス ラ ッ シ ュ は、直前にバ ッ ク ス ラ ッ シ ュ キ ャ ラ ク タ を付 け る 必要があ り ます : filename={C:\path\name\\} (1個のバックスラッシュで終わる文字列) 空文字列は、 中括弧の対で構築で き ます : {} 内容文字列 ・ ハ イ パーテ キ ス ト 文字列 ・ 名前文字列 : こ れ ら は、 さ ま ざ ま な形式の Unicode 内容を持つ こ と がで き ます。 パ ラ メ タ escapesequence が設定 さ れてい る 場合には、 シ ン グ ルバ イ ト はエ ス ケープシーケ ン ス で表す こ と も で き ます。 こ れ ら の文字列型 と 、 文字列オ プシ ョ ンに対す る エン コ ーデ ィ ン グ選択について詳 し く は、PDFlib チ ュ ー ト リ アルを参照 し て く だ さ い。 非Unicode対応言語バ イ ンデ ィ ン グ:オプシ ョ ン リ ス ト の先頭が [EBCDIC-]UTF-8 BOM で あ る 場合には、 オプ シ ョ ン リ ス ト の内容 ・ ハ イ パーテ キ ス ト ・ 名前文字列はそれぞれ [EBCDIC-]UTF-8 文字列 と し て解釈 さ れます。 Unichar Unichar は、 1 個の Unicode 値であ り 、 い く つかの種類の文法に対応 し てい ます : 10 以上の 10 進値 (例 : 173)、 接頭辞 x ・ X ・ 0x ・ 0X ・ U+ のいずれかを付けた 16 進値 (xAD ・ 0xAD ・ U+00AD)、 数値参照、 文字参照、 グ リ フ名参照か ら 「&」 ・ 「;」 修飾を除い た も の (shy ・ #xAD ・ #173)。 あ る いは、 リ テ ラ ルな キ ャ ラ ク タ を与え る こ と も で き ます。 Unichar は、 範囲 0 ∼ 1 114 111 (0 ∼ 0x10FFFF) 内であ る 必要があ り ます : 例 : unknownchar=? unknownchar=63 unknownchar=x3F unknownchar=0x3F unknownchar=U+003F lineseparator={CRLF} (リテラル) (10進) (16進) (16進) (Unicode記法) (標準グリフ名参照) 1 個の数字キ ャ ラ ク タ は、 10 進 Unicode 値 と し てではな く 、 リ テ ラ ルに扱われます : replacementchar=3 (U+0033 THREE。U+0003ではありません!) Unicode 集合 Unicode 集合は、 以下の構成要素に よ っ て構築する こ と がで き ます : > パ タ ーンは、 一連のキ ャ ラ ク タ を角括弧で ま と めた も のであ り 、 Unicode キ ャ ラ ク タ 群 と Unicode プ ロ パテ ィ 集合群の リ ス ト を内容 と し て持ち ます。 146 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス > リ ス ト は、 Unicode キ ャ ラ ク タ の連鎖であ り 、 2 個のキ ャ ラ ク タ の間に 「-」 で示 し た範 囲を持つ こ と がで き ます。 例 : U+FB00-U+FB17。 連鎖は、 Unicode 順に左か ら 右ま での すべてのキ ャ ラ ク タ の範囲を示 し ます。 複数の Unicode キ ャ ラ ク タ は、 間を空白で区 切 ら ずに直接つなげて書 く 必要があ り ます。 例 : U+0048U+006C。 > リ ス ト 内の Unicode キ ャ ラ ク タ は以下の よ う に指定で き ます : ASCII キ ャ ラ ク タ は リ テ ラ ル と し て指定で き ます ち ょ う ど 4 桁の 16 進数字 : \uhhhh ま たは U+hhhh ち ょ う ど 5 桁の 16 進数字 : U+hhhhh 1 ∼ 6 桁の 16 進数字 : \x{hhhhhh} ち ょ う ど 8 桁の 16 進数字 : \Uhhhhhhhh エ ス ケープ さ れたバ ッ ク ス ラ ッ シ ュ : \\ > Unicode プ ロ パテ ィ 集合は、Unicode プ ロ パテ ィ に よ っ て指定 さ れます。プ ロ パテ ィ 名を 指定す る ための文法は、 POSIX と Perl 文法の拡張であ り 、 こ こ で type は Unicode プ ロ パテ ィ の名前を (www.unicode.org/Public/UNIDATA/PropertyAliases.txt 参照)、 value は その値を (www.unicode.org/Public/UNIDATA/PropertyValueAliases.txt 参照) 表 し ます : POSIX 式文法 : [:type=value:] POSIX 式文法で否定 : [:^type=value:] Perl ス タ イ ル文法 : \p{type=value} Perl ス タ イ ル文法で否定 : \P{type=value} type= は、 Category ・ Script プ ロ パテ ィ については省け ますが、 それ以外のプ ロ パテ ィ については必要です。 > 集合演算をパ タ ーンに適用す る こ と も で き ます : 2 個の集合の和を と る には、 単純にそれ ら を連結 し ます : [[:letter:] [:number:]] 2 個の集合の積を と る には、 「&」 演算子を用い ます : [[:letter:] & [U+0061-U+007A]] 2 個の集合の差を と る には、 「-」 演算子を用い ます : [[:letter:]-[U+0061-U+007A]] 補集合を得 る には、 開 き 「[」 の直後に 「^」 を入れ ま す : [^U+0061-U+007A]。 それ以 外の場所では、 「^」 は特別な意味を持ち ません。 表 11.1 にいろいろ な Unicode 集合の例を挙げます。 下記 Web サ イ ト を利用す る と 、 いろ いろ な Unicode 集合表現を対話的に試す こ と がで き ます : unicode.org/cldr/utility/list-unicodeset.jsp 論理値 論理値は、値 true ま たは false を と り ます。論理値オプシ ョ ン で値を省略す る と 、 値 true と 見な さ れます。name=false の短縮記法 と し て noname を用い る こ と も 可能です: usehostfonts nousehostfonts (usehostfonts=trueと同等) (usehostfonts=falseと同等) キーワー ド キー ワー ド 型のオプシ ョ ンは、決め ら れた キーワー ド の定義済 リ ス ト の 1 つ を と る こ と がで き ます。 例 : clippingarea=cropbox オプシ ョ ンに よ っ ては、 数値 と キー ワー ド のいずれかの値を と る も の も あ り ます。 数値 オプシ ョ ン リ ス ト は、 い く つかの数値型に対応 し てい ます。 11.3 基本型 147 表 11.1 い ろ い ろ な Unicode 集合の例 Unicode 集合の指定 [U+0061-U+007A] その Unicode 集合内のキ ャ ラ ク タ 群 a から z ま での小文字 [U+0640] ア ラ ビ ア文字 タ ト ウ ィ ールの 1 キ ャ ラ ク タ のみ [\x{0640}] ア ラ ビ ア文字 タ ト ウ ィ ールの 1 キ ャ ラ ク タ のみ [U+FB00-U+FB17] 欧文 ・ アル メ ニア文字の合字群 [^U+0061-U+007A] a から z ま で以外のすべてのキ ャ ラ ク タ [:Lu:] [:UppercaseLetter:] すべての大文字 (Unicode 集合の短形式 と 長形式) [:L:] [:Letter:] L で始ま るすべての Unicode カ テ ゴ リ (Unicode 集合の 短形式 と 長形式) [:General_Category=Dash_Punctuation:] 一般カ テ ゴ リ Dash_Punctuation 内のすべてのキ ャ ラ ク タ [:Alphabetic=No:] すべての非アルフ ァ ベ ッ ト キ ャ ラ ク タ [:Private_Use:] 私用領域 (PUA) 内のすべてのキ ャ ラ ク タ 整数型は、 10 進 と 16 進の整数を と り ます。 x ・ X ・ 0x ・ 0X のいずれかで始ま る 正の整数 は 16 進値を意味 し ます : -12345 0 0xFF float は、 10 進浮動小数点数ま たは整数を と り ます。 ピ リ オ ド ま たはカ ン マ を浮動小数点 値の小数点 と し て使え ます。 指数記法に も 対応 し てい ます。 以下の値はすべて同等です : size size size size 148 = = = = -123.45 -123,45 -1.2345E2 -1.2345e+2 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 11.4 図形型 矩形 矩形は、 矩形の左下隅 と 右上隅の x ・ y 座標を指定す る float 値 4 個の リ ス ト です。 座標を解釈す る ための座標系 (デフ ォ ル ト ま たはユーザー座標系) はオプシ ョ ンに よ っ て 異な り ますので、 都度説明 し て あ り ます。 例 : includebox = {{0 0 500 100} {0 500 500 600}} 11.4 図形型 149 11.5 一般関数 11.5.1 オ プ シ ョ ン処理 C++ void set_option(string optlist) C# Java void set_option(String optlist) Perl PHP set_option(string optlist) VB RB Sub set_option(optlist As String) C void TET_set_option(TET *tet, const char *optlist) TET に対する 1 個ない し 複数のグローバルオプ シ ョ ン を設定 し ます。 optlist 表 11.2 に従っ て グ ロ ーバルオプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト 。1 つのオ プシ ョ ンが複数回与え ら れた と き は、最後に出現 し た も のがそれ以前の も のを上書 き し ま す。 1 個のオプシ ョ ンに複数の値を与え る ためには (searchpath な ど)、 こ のオプシ ョ ン の リ ス ト 引数内ですべての値を与え て く だ さ い。 右記のオプシ ョ ンが使え ます : asciifile ・ cmap ・ codelist ・ encoding ・ filenamehandling ・ fontoutline ・ glyphlist ・ license ・ licensefile ・ logging ・ userlog ・ outputformat ・ resourcefile ・ searchpath 詳細 表 11.2 でその旨記 さ れてい る オプシ ョ ンについては、 こ の関数を複数回呼び出 し て値を 蓄積 さ せ る こ と も で き ます。 その旨記 し ていないオプシ ョ ンでは、 新 し い値が古い値を上 書 き し ます。 表 11.2 TET_set_option( ) のグ ローバルオプ シ ョ ン一覧 オプ シ ョ ン 説明 asciifile (論理値。 i5/iSeries ・ zSeries 上でのみ対応) ASCII エ ン コ ーデ ィ ングのテキス ト フ ァ イル (UPR 設 定フ ァ イル ・ グ リ フ リ ス ト ・ コ ー ド リ ス ト な ど) を受け付けます。 デ フ ォ ル ト : i5/iSeries では true、 zSeries では false cmap1 , 2 (名前文字列の リ ス ト ) 文字列対の リ ス ト 。 各対は、 CMap リ ソ ース 1 個の名前 と 値を内容 と し て 持ち ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イル検索」 を参照)。 codelist1, 2 (名前文字列の リ ス ト ) 文字列対の リ ス ト 。 各対は、 コ ー ド リ ス ト リ ソ ース 1 個の名前 と 値を内容 と し て持ち ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イル検索」 を参照)。 encoding1, 2 (名前文字列の リ ス ト ) 文字列対の リ ス ト 。 各対は、 エ ン コ ーデ ィ ング リ ソ ース 1 個の名前 と 値を 内容 と し て持ち ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イル検索」 を参照)。 filenamehandling (キーワー ド 。 Windows では必須ではあ り ません) フ ァ イル名の タ ーゲ ッ ト エ ン コ ーデ ィ ング (デ フ ォル ト : Mac OS X では unicode、 それ以外では legacy) : ascii 7 ビ ッ ト ASCII basicebcdic コ ー ド ページ 1047 に従っ た、 ただ し Unicode 値 <= U+007E のみの基本 EBCDIC basicebcdic_37 コ ー ド ページ 0037 に従っ た、 ただ し Unicode 値 <= U+007E のみの基本 EBCDIC honorlang 環境変数 LANG を解釈 し 、 それが utf8 ・ UTF-8 ・ cpXXXX ・ CPXXXX ・ iso8859-x ・ ISO8859-x のいずれかを指定 し ている な ら フ ァ イル名へ適用。 legacy auto エ ン コ ーデ ィ ング (すなわち カ レ ン ト シ ス テムエ ン コ ーデ ィ ング) を用いて フ ァ イル名を解釈 し 、 honorlang パラ メ タ が設定 さ れている な ら LANG 変数を解釈。 unicode (EBCDIC-) UTF-8 形式の Unicode エ ン コ ーデ ィ ング すべての有効な エ ン コ ーデ ィ ング名 TET が認識する任意の (内蔵ま たはユーザー定義の) エ ン コ ーデ ィ ング 150 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 11.2 TET_set_option( ) のグローバルオプ シ ョ ン一覧 オプ シ ョ ン 1, 2 説明 fontoutline (名前文字列の リ ス ト ) 文字列対の リ ス ト 。 各対は、 FontOutline リ ソ ース 1 個の名前 と 値を内容 と し て持ち ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イル検索」 を参照)。 glyphlist1, 2 (名前文字列の リ ス ト ) 文字列対の リ ス ト 。 各対は、 グ リ フ リ ス ト リ ソ ース 1 個の名前 と 値を内容 と し て持ち ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イル検索」 を参照)。 hostfont1, 2 (名前文字列の リ ス ト ) 文字列対の リ ス ト 。 各対は、 埋め こ まれていない フ ォ ン ト に対 し て用いた いホス ト フ ォ ン ト の PDF フ ォ ン ト 名 と UTF-8 符号化 さ れた名前を内容 と し て持ち ます。 license (文字列) ラ イ セ ン スキーを設定 し ます。 これは、 open_document*( ) を初めて呼び出すよ り 前に設 定する必要があ り ます。 licensefile (文字列) ラ イ セ ン スキー (群) を内容 と し て持つ フ ァ イルの名前を設定 し ます。 こ のラ イ セ ン ス フ ァ イルは、 TET_open_document*( ) を初めて呼び出すよ り 前に 1 回だけ設定する こ と がで き ます。 あ るいは、 ラ イ セ ン ス フ ァ イルの名前は、 PDFLIBLICENSEFILE と い う 環境変数で、 または (Windows では) レ ジ ス ト リ を通 じ て与え る こ と も で き ます。 logging1 (オプ シ ョ ン リ ス ト 。 非サポー ト ) 表 11.5 に従 っ て ログ記録出力を指定する オプ シ ョ ン リ ス ト 。 あ るいは、 ログ記録オプ シ ョ ン群は、 TETLOGGING と い う 環境変数で、 ま たは Windows ではレ ジ ス ト リ を通 じ て与え る こ と も で き ます。 空のオプ シ ョ ン リ ス ト にする と 、 前回の呼び出 し で設定 し たオプ シ ョ ン群によ っ て ログ記録が有効にな り ます。 環境変数が設定 さ れている場合には、 ロ グ 記録は、 TET_new( ) への最初の呼び出 し の直後から 開始 さ れます。 userlog (名前文字列。 非サポー ト ) ログ記録が有効に さ れている場合に ログ フ ァ イルへ書き込まれる任意 の文字列。 outputformat (キーワー ド 。 C ・ RPG 言語バイ ンデ ィ ングのみ) TET_get_text( ) が返すテキス ト の形式を指定 し ます (デ フ ォル ト : USS または MVS 付き zSeries では ebcdicutf8、 それ以外のすべての シ ス テムでは utf8)。 utf8 文字列は、 ヌル終端 UTF-8 形式で返 さ れます (ASCII ベース ・ EBCDIC ベースのいずれ のシ ス テムで も )。 ebcdicutf8 (EBCDIC ベースのシ ス テムでのみ利用可能) 文字列は、 ヌル終端 EBCDIC 符号化 UTF8 形式で返 さ れます。 i5/iSeries では コ ー ド ページ 37 が、 zSeries では コ ー ド ページ 1047 が用い られます。 utf16 文字列は、 そのマ シ ンのネ イ テ ィ ブバイ ト 順序の UTF-16 形式で返 さ れます (ネ イ テ ィ ブバイ ト 順序は、 Intel x86 アーキテ ク チ ャ では リ ト ルエ ンデ ィ ア ン、 Sparc ・ PowerPC シ ス テムではビ ッ グエ ンデ ィ ア ン)。 resourcefile (名前文字列) UPR リ ソ ース フ ァ イルの相対ま たは絶対 フ ァ イル名。 こ の リ ソ ース フ ァ イルはただ ちに読み込まれます。 既存の リ ソ ースは温存 さ れ、 その値は再設定 さ れた場合には新 し い もので 上書き さ れます。 明示的な リ ソ ースオプ シ ョ ンは、 リ ソ ース フ ァ イル内の項目の後に評価 さ れま す。 リ ソ ース フ ァ イル名は、 環境変数 TETRESOURCEFILE で、 または Windows のレ ジ ス ト リ キーで与 え る こ と も で き ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イル検索」 を参照)。 デ フ ォ ル ト : tet.upr (MVS では upr) searchpath1 (名前文字列の リ ス ト ) 読み込みたい フ ァ イル群を含むデ ィ レ ク ト リ の相対または絶対パス名 (群)。 こ の検索パスは複数回設定する こ と も で き、 その場合には項目は蓄積 さ れ、 設定 し た順に 使用 さ れます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イル検索」 を参照)。 空文字列にする と 、 既 存のすべての検索パス項目が削除 さ れます。 Windows では、 検索パスはレ ジ ス ト リ 項目を通 じ て設 定する こ と も で き ます。 デ フ ォル ト : 空 1. 複数回呼び出す と オプ シ ョ ン値を蓄積で き ます。 2. UPR 文法 と は異な り 、 名前 と 値の間の等号 「=」 は必須ではな く 、 許容 も さ れません。 11.5 一般関数 151 11.5.2 セ ッ ト ア ッ プ C TET *TET_new(void) 新規 TET オブ ジ ェ ク ト を作成 し ます。 戻り値 後続の呼び出 し で使用す る TET オブジ ェ ク ト へのハン ド ル。 メ モ リ が得 ら れなかっ たた めに こ の関数が成功 し なかっ た と き は NULL を返 し ます。 バインディング オブジ ェ ク ト 指向言語バ イ ンデ ィ ン グでは、こ の関数は TET コ ン ス ト ラ ク タ 内に隠蔽 さ れ てい ますので、 利用で き ません。 Java void delete( ) C# void Dispose( ) C void TET_delete(TET *tet) TET オブ ジ ェ ク ト を削除 し て、 関連する内部 リ ソ ース をすべて解放 し ます。 詳細 TET オブジ ェ ク ト を削除す る と 、 その開いてい る 文書 も 自動的にすべて閉 じ ら れます。 TET オブジ ェ ク ト は、 閉 じ ら れた後は、 いかな る 関数で も 使用 し てはいけ ません。 バインディング オブジ ェ ク ト 指向言語バ イ ンデ ィ ン グでは、こ の関数は TET デス ト ラ ク タ 内に隠蔽 さ れて い ますので、 一般に必要ではあ り ません。 ただ し Java では、 自動的なガベージ コ レ ク シ ョ ンに加え て明示的な ク リ ーン ア ッ プを可能にする ために、利用可能 と な っ てい ます。.NET では、 処理の最後に、 非マネージの リ ソ ース を ク リ ーン ア ッ プする ために Dispose( ) を呼 び出すべ き です。 11.5.3 PDFlib 仮想 フ ァ イ ルシ ス テム (PVF) C++ void create_pvf(string filename, const void *data, size_t size, string optlist) C# Java void create_pvf(String filename, byte[] data, String optlist) Perl PHP create_pvf(string filename, string data, string optlist) VB RB Sub create_pvf(filename As String, data, optlist As String) C void TET_create_pvf(TET *tet, const char *filename, int len, const void *data, size_t size, const char *optlist) メ モ リ 内で与え ら れたデー タ か ら、 名前付 きの仮想の読み取 り 専用 フ ァ イ ルを作成 し ま す。 filename (名前文字列) 仮想フ ァ イ ルの名前。 こ れは、 後続す る TET 呼び出 し において こ の仮想フ ァ イ ルを参照す る ために使え る 任意の文字列です。 len (C 言語バ イ ンデ ィ ン グのみ) filename が UTF-16 文字列の場合の長 さ (バ イ ト 単位 で)。 len=0 な ら ば、 ヌ ル終端文字列を与え る 必要があ り ます。 data 仮想フ ァ イ ルのためのデー タ への参照。 COM では、 こ れは仮想フ ァ イ ルを構成す る デー タ を内容 と し て持つ Byte の Variant です。 C ・ C++ では、 こ れは メ モ リ 位置へのポ イ ン タ です。 Java では、 こ れは byte 配列です。 Perl ・ PHP では、 こ れは文字列です。 size 152 (C・C++ のみ) こ のデー タ を内容 と し て持つ メ モ リ ブ ロ ッ ク の長 さ をバ イ ト 単位で。 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス optlist 表 11.3 に従っ たオプシ ョ ン リ ス ト 。 右記のオプシ ョ ンが使え ます : copy 詳細 仮想フ ァ イ ル名は、 入力フ ァ イ ル名を と る 任意の API 関数に対 し て与え る こ と がで き ま す。 こ う し た関数のなかには、 そのデー タ が も う 必要な く な る ま でその仮想 フ ァ イ ルに ロ ッ ク を かけ る も の も あ り ま す。 仮想 フ ァ イ ルは、 TET_delete_pvf( ) に よ っ て明示的に、 あ る いは TET_delete( ) で自動的に削除 さ れ る ま で、 メ モ リ 内に保持 さ れます。 各 TET オブジ ェ ク ト は、 それぞれ自分自身の PVF フ ァ イ ルのセ ッ ト を保持 し ます。 仮 想フ ァ イ ルを、 異な る TET オブジ ェ ク ト 間で共有す る こ と はで き ません。 複数ス レ ッ ド で個別の TET オブジ ェ ク ト を操作 し てい る 場合、 PVF の使用を同期す る 必要はあ り ませ ん。 filename で、 すでにあ る 仮想フ ァ イ ル と 同 じ 名前を指定す る と 例外が発生 し ます。 こ の関数では、filename がすでに通常のデ ィ ス ク フ ァ イ ルで使われてい る か ど う かはチ ェ ッ ク し ません。 copy オプシ ョ ン を与え ていないかぎ り 、 与え たデー タ を、 それに対応する TET_delete_ pvf( ) への呼び出 し が成功す る 前に、 呼び出 し 側で変更 し た り 解放 (削除) し た り し ては いけ ません。 こ の決ま り に従わない と ク ラ ッ シ ュ す る おそれが高いです。 表 11.3 TET_create_pvf( ) のオプ シ ョ ン一覧 オプ シ ョ ン 説明 copy (論理値) TET は、 与え られたデー タ の内部 コ ピーを ただ ちに作成 し ます。 こ の場合、 与えたデー タ を、 こ の呼び出 し の直後に呼び出 し 側で廃棄 し て も かまいません。 こ の copy オプ シ ョ ンは、 COM ・ .NET ・ Java バイ ンデ ィ ン グでは自動的にに設定 さ れます (それ以外のバイ ンデ ィ ングでの デ フ ォル ト : false)。 それ以外のバイ ンデ ィ ングでは、 copy オプ シ ョ ン を与えないかぎ り デー タ は 複製 さ れません。 C++ int delete_pvf(string filename) C# Java int delete_pvf(String filename) Perl PHP int delete_pvf(string filename) VB RB Function delete_pvf(filename As String) As Long C int TET_delete_pvf(TET *tet, const char *filename, int len) 指名 さ れた仮想 フ ァ イルを削除 し 、 そのデー タ 構造を解放 し ます (ただ し その内容は解放 し ません)。 filename (名前文字列) TET_create_pvf( ) に与えたの と 同 じ 、 仮想フ ァ イ ルの名前。 len (C 言語バ イ ンデ ィ ン グのみ) filename が UTF-16 文字列の場合の長 さ (バ イ ト 単位 で)。 len=0 な ら ば、 ヌ ル終端文字列を与え る 必要があ り ます。 戻り値 指定 さ れた仮想フ ァ イ ルが存在 し てい る が ロ ッ ク さ れてい る 場合は -1、 それ以外の場合 は 1。 詳細 フ ァ イ ルが ロ ッ ク さ れていなければ、 TET はただちに、 filename に関連づけ ら れたデー タ 構造を削除 し ます。 filename と い う 名前の有効な仮想フ ァ イ ルが存在 し ない場合には、 こ の関数は何 も 警告な ど出 さ ずに終了 し ます。 こ の関数を呼び出 し て成功 し た後には、 その filename は再利用す る こ と も で き ます。 仮想フ ァ イ ルはすべて、 TET_delete( ) で自動的に 削除 さ れます。 詳細な動作は、 こ れに対応す る TET_create_pvf( ) への呼び出 し の際に copy オプシ ョ ン を与え ていたか ど う かに依存 し ます : copy オプシ ョ ン を与え ていた場合には、 フ ァ イ ル 11.5 一般関数 153 の管理デー タ 構造 と フ ァ イ ル内容本体 (デー タ ) の両方が解放 さ れますが、 そ う でなかっ た場合には、 内容は解放 さ れません。 後者の場合には ク ラ イ ア ン ト 側で内容を解放す る こ と が期待 さ れてい ます。 11.5.4 Unicode 変換関数 Unicode 変換関数は、 Unicode 文字列変換に有用で し ょ う 。 こ れ ら は、 その よ う な変換機 能を提供 し ていない環境で作業す る ユーザーの利便のために提供 さ れてい ます。 バインディング Unicode 変換関数は、Unicode 対応言語バ イ ンデ ィ ン グ (C++ を除 く ) では利用で き ません。 C バ イ ンデ ィ ン グ : こ の項の関数が返す文字列は、 最大 10 項目を持つ リ ン グバ ッ フ ァ 内 に格納 さ れ ます。 10 個を超え る 文字列が変換 さ れた と き には、 バ ッ フ ァ は再利用 さ れ ま すので、 10 個を超え る 文字列を同時に利用 し たい場合には、 ク ラ イ ア ン ト 側でその文字 列を複製 し てお く 必要があ り ます。 た と えば、 printf( ) 文の引数では こ の関数を最大 10 回 ま で呼び出す こ と がで き ます。 同時に 10 個を超え る 文字列が使用 さ れないな ら ば、 その 戻 り 文字列は互いに独立であ る こ と が保証 さ れてい る か ら です。 C++ string utf8_to_utf16(string utf8string, string ordering) Perl PHP string utf8_to_utf16(string utf8string, string ordering) C const char *TET_utf8_to_utf16(TET *tet, const char *utf8string, const char *ordering, int *size) 文字列を UTF-8 形式か ら UTF-16 へ変換 し ます。 utf8string 変換 し たい文字列。 有効な UTF-8 列 (EBCDIC プ ラ ッ ト フ ォームでは、 こ れ は EBCDIC で符号化 さ れてい る 必要があ り ます) を内容 と し て持つ必要があ り ます。 バ イ ト 順序マー ク (BOM) が存在 し てい る 場合、 それは除去 さ れます。 ordering 結果文字列のバ イ ト 順序を指定 し ます : > utf16 ま たは空文字列 : 変換 さ れた文字列は BOM を持たず、 プ ラ ッ ト フ ォームのネ イ テ ィ ブバ イ ト 順序で格納 さ れます。 > utf16le:変換 さ れた文字列は リ ト ルエンデ ィ ア ン形式にな り 、先頭にLE BOM(\xFF\xFE) が付け ら れます。 > utf16be : 変換 さ れた文字列はビ ッ グエンデ ィ ア ン形式にな り 、 先頭に BE BOM (\xFE\xFF) が付け ら れます。 size (C 言語バ イ ンデ ィ ン グのみ) 戻 り 文字列の長 さ (バ イ ト 単位で、 ただ し 終端ヌ ル 2 バ イ ト を除 く ) が格納 さ れ る メ モ リ 位置へのポ イ ン タ 。 戻り値 変換 さ れた UTF-16 文字列。 C では、 こ れは ヌ ル 2 バ イ ト で終端 さ れます。 C++ string utf16_to_utf8(string utf16string) Perl PHP string utf16_to_utf8(string utf16string) C const char *TET_utf16_to_utf8(TET *tet, const char *utf16string, int len, int *size) 文字列を UTF-16 形式か ら UTF-8 へ変換 し ます。 utf16string 変換 し たい文字列。 文字列内のバ イ ト 順序マー ク (BOM) は解釈 さ れ ます。 それがない場合には、 プ ラ ッ ト フ ォームのネ イ テ ィ ブバ イ ト 順序 と 見な さ れます。 154 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス len (C 言語バ イ ンデ ィ ン グのみ) utf16string の長 さ をバ イ ト 単位で。 size (C 言語バ イ ンデ ィ ン グのみ) 戻 り 文字列の長 さ (バ イ ト 単位で) が格納 さ れ る メ モ リ 位置への C ス タ イ ルポ イ ン タ 。 こ のポ イ ン タ が NULL の場合、 それは無視 さ れます。 戻り値 変換 さ れた UTF-8 文字列。生成 さ れ る UTF-8 文字列は、先頭に UTF-8 BOM(\xEF\xBB\xBF) が付 き ます。EBCDIC プ ラ ッ ト フ ォームでは、変換結果は BOM を含めて最終的に EBCDIC へ変換 さ れます。 C++ string utf32_to_utf16(string utf32string, string ordering) Perl PHP string utf32_to_utf16(string utf32string, string ordering) C const char *TET_utf32_to_utf16(TET *tet, const char *utf32string, int len, const char *ordering, int *size) 文字列を UTF-32 形式か ら UTF-16 へ変換 し ます。 utf32string 変換 し たい文字列。 有効な UTF-32 列を内容 と し て持つ必要があ り ます。 バ イ ト 順序マー ク (BOM) が存在す る 場合、 それは解釈 さ れます。 len (C 言語バ イ ンデ ィ ン グのみ) utf32string の長 さ をバ イ ト 単位で。 ordering 結果文字列のバ イ ト 順序を指定 し ます : > utf16 ま たは空文字列 : 変換 さ れた文字列は BOM を持たず、 プ ラ ッ ト フ ォームのネ イ テ ィ ブバ イ ト 順序で格納 さ れます。 > utf16le : 変換 さ れた文字列は リ ト ルエ ンデ ィ ア ン形式にな り 、 先頭に リ ト ルエ ンデ ィ ア ン BOM (\xFF\xFE) が付け ら れます。 > utf16be : 変換 さ れた文字列はビ ッ グエンデ ィ ア ン形式にな り 、 先頭に ビ ッ グエ ンデ ィ ア ン BOM (\xFE\xFF) が付け ら れます。 size (C 言語バ イ ンデ ィ ン グのみ) 戻 り 文字列の長 さ (バ イ ト 単位で) が格納 さ れ る メ モ リ 位置への C ス タ イ ルポ イ ン タ 。 戻り値 変換 さ れた UTF-16 文字列。 スコープ 任意 C++ string utf8_to_utf32(string utf8string, string ordering) Perl PHP string utf8_to_utf32(string utf8string, string ordering) C const char *TET_utf8_to_utf32(TET *tet, const char *utf8string, const char *ordering, int *size) 文字列を UTF-8 形式か ら UTF-32 へ変換 し ます。 utf8string 変換 し たい文字列。 有効な UTF-8 列 (EBCDIC プ ラ ッ ト フ ォームでは、 こ れ は EBCDIC で符号化 さ れてい る 必要があ り ます) を内容 と し て持つ必要があ り ます。 バ イ ト 順序マー ク (BOM) が存在 し てい る 場合、 それは除去 さ れます。 ordering 予約済。 空にす る 必要があ り ます。 size (C 言語バ イ ンデ ィ ン グのみ) 戻 り 文字列の長 さ (バ イ ト 単位で) が格納 さ れ る メ モ リ 位置への C ス タ イ ルポ イ ン タ 。 11.5 一般関数 155 戻り値 プ ラ ッ ト フ ォームのネ イ テ ィ ブバ イ ト 順序で変換 さ れた UTF-32 文字列。 スコープ 任意 C++ string utf32_to_utf8(string utf32string) Perl PHP string utf32_to_utf8(string utf32string) C const char *TET_utf32_to_utf8(TET *tet, const char *utf32string, int len, int *size) 文字列を UTF-32 形式か ら UTF-8 へ変換 し ます。 utf32string 変換 し たい文字列。 有効な UTF-32 列を内容 と し て持つ必要があ り ます。 バ イ ト 順序マー ク (BOM) が存在す る 場合、 それは解釈 さ れます。 len (C 言語バ イ ンデ ィ ン グのみ) utf32string の長 さ をバ イ ト 単位で。 size (C 言語バ イ ンデ ィ ン グのみ) 戻 り 文字列の長 さ (バ イ ト 単位で) が格納 さ れ る メ モ リ 位置への C ス タ イ ルポ イ ン タ 。 戻り値 変換 さ れた UTF-8 文字列。生成 さ れ る UTF-8 文字列は、先頭に UTF-8 BOM(\xEF\xBB\xBF) が付 き ます。EBCDIC プ ラ ッ ト フ ォームでは、変換結果は BOM を含めて最終的に EBCDIC へ変換 さ れます。 スコープ 任意 C++ string utf16_to_utf32(string utf16string, string ordering) Perl PHP string utf16_to_utf32(string utf16string, string ordering) C const char *TET_utf16_to_utf32(TET *tet, const char *utf16string, int len, const char *ordering, int *size) 文字列を UTF-16 形式か ら UTF-32 へ変換 し ます。 utf16string 変換 し たい文字列。 文字列内のバ イ ト 順序マー ク (BOM) は解釈 さ れ ます。 それがない場合には、 プ ラ ッ ト フ ォームのネ イ テ ィ ブバ イ ト 順序 と 見な さ れます。 len (C 言語バ イ ンデ ィ ン グのみ) utf16string の長 さ をバ イ ト 単位で。 ordering 予約済。 空にす る 必要があ り ます。 size (C 言語バ イ ンデ ィ ン グのみ) 戻 り 文字列の長 さ (バ イ ト 単位で) が格納 さ れ る メ モ リ 位置への C ス タ イ ルポ イ ン タ 。 こ のポ イ ン タ が NULL の場合、 それは無視 さ れます。 戻り値 プ ラ ッ ト フ ォームのネ イ テ ィ ブバ イ ト 順序で変換 さ れた UTF-32 文字列。 スコープ 任意 156 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 11.5.5 例外処理 C++ string get_apiname( ) C# Java String get_apiname( ) Perl PHP string get_apiname( ) VB RB Function get_apiname( ) As String C const char *TET_get_apiname(TET *tet) 例外を発生 さ せた、 または失敗 し た API 関数の名前を得ます。 戻り値 例外を発生 さ せた関数の名前、 ま たは、 呼び出 さ れてエ ラ ー コ ー ド を持っ て失敗 し た最近 の関数の名前。 エ ラ ーがなか っ た場合は空文字列が返 さ れます。 C++ string get_errmsg( ) C# Java String get_errmsg( ) Perl PHP string get_errmsg( ) VB RB Function get_errmsg( ) As String C const char *TET_get_errmsg(TET *tet) 最後に発生 し た例外の、 または失敗 し た関数呼び出 し の原因のテキス ト を得ます。 戻り値 最後に発生 し た例外の説明を、 ま たは、 呼び出 さ れてエ ラ ー コ ー ド を持っ て失敗 し た最近 の関数の原因を内容 と し て持つテ キ ス ト 。 エ ラ ーがなか っ た場合は空文字列が返 さ れ ま す。 C++ int get_errnum( ) C# Java int get_errnum( ) Perl PHP long get_errnum( ) VB RB Function get_errnum( ) As Long C int TET_get_errnum(TET *tet) 最後に発生 し た例外の、 または、 失敗 し た関数呼び出 し の原因の番号を得ます。 Get the number of the last thrown exception or the reason for a failed function call. 戻り値 例外の番号、 ま たは、 呼び出 さ れてエ ラ ー コ ー ド を持っ て失敗 し た最近の関数のエ ラ ー コ ー ド 。 エ ラ ーがなか っ た場合は こ の関数は 0 を返 し ます。 C TET_TRY(tet) C TET_CATCH(tet) C TET_RETHROW(tet) C TET_EXIT_TRY(tet) 例外処理ブ ロ ッ ク を セ ッ ト ア ッ プ し ます。 例外をキ ャ ッ チ し ます。 例外を再び投げます。 例外機構に対 し 、対応する TET_CATCH( ) ブ ロ ッ ク に入る こ と な く TET_TRY( ) ブ ロ ッ クか ら 11.5 一般関数 157 抜ける こ と を通知 し ます。 TET_RETHROW( ) を用いる と 、 例外をキ ャ ッ チ し た後に、 よ り 高い レ ベルの関数へそれを再び投げる こ と がで き ます。 詳細 (C 言語バ イ ンデ ィ ン グのみ) 29 ページの 3.2 「C バ イ ンデ ィ ン グ」 を参照。 11.5.6 ロ グ記録 ロ グ記録機能を利用す る と 、 API 呼び出 し 群を追跡す る こ と がで き ます。 その ロ グ フ ァ イ ルの内容は、 デバ ッ グ目的に有用なほか、 PDFlib GmbH サポー ト か ら 求め ら れ る こ と があ り ます。 表 11.4 に、 TET_set_option( ) (150 ページの 11.5.1 「オプシ ョ ン処理」 を参照) で ロ グ記録機能を有効にす る ためのオプシ ョ ン を挙げます。 表 11.4 TET_set_option( ) のログ記録関連キー一覧 キー 説明 logging 表 11.5 に従っ た ログ記録オプ シ ョ ン群を持つオプ シ ョ ン リ ス ト userlog ログ フ ァ イルへ複製 さ れる文字列 ロ グ記録オプシ ョ ンは、 以下の方法で与え る こ と がで き ます : > TET_set_option( ) の logging オプシ ョ ンに対す る オプシ ョ ン リ ス ト と し て。 例 : tet.set_option("logging", "filename=debug.log remove") > TETLOGGING と い う 環境変数で。 こ の場合、 ロ グ記録出力は、 API 関数のいずれかを最 初に呼び出 し た時か ら 開始 さ れます。 表 11.5 TET_set_option( ) の logging オプ シ ョ ンのサブオプ シ ョ ン一覧 キー 説明 (空 リ ス ト ) disable で無効化 さ れている ログ出力を有効に し ます。 disable (論理値) ログ出力を無効化 し ます。 デ フ ォ ル ト : false enable (論理値) ログ出力を有効に し ます。 filename (文字列) ログ フ ァ イルの名前 (stdout と stderr も受け付けます)。 すでに内容がある と き、 出力 はその末尾に追加 さ れます。 ログ フ ァ イル名はあるいは、 TETLOGFILENAME と い う 環境変数で与 え る こ と も で き ます ( この場合、 こ のオプ シ ョ ン filename はつねに無視 さ れます)。 デ フ ォ ル ト : tet.log (Windows と Mac では / デ ィ レ ク ト リ 内。 Unix では /tmp 内) flush (論理値) true の場合、 ログ フ ァ イルは、 必ず出力が実際に フ ラ ッ シ ュ さ れる よ う 、 出力のたびに 閉 じ ら れ、 次の出力の時にまた開かれます。 プ ログ ラ ムのク ラ ッ シ ュ を追跡する際に、 ログ フ ァ イルが途中で終わっ て し ま っ ている場合に有用で し ょ う 。 ただ し 速度はかな り 遅 く な り ます。 false の場合、 ログ フ ァ イルは 1 回だけ開かれます。 デ フ ォル ト : false remove (論理値) true の場合は、 新 し い出力を書き こ む際に、 既存のログ フ ァ イルは削除 さ れます。 デ フ ォル ト : false stringlimit (整数) テキス ト 文字列内のキ ャ ラ ク タ の数の上限。 0 な ら 無制限。 デ フ ォル ト : 0 158 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 11.5 TET_set_option( ) の logging オプ シ ョ ンのサブオプ シ ョ ン一覧 キー 説明 classes (オプ シ ョ ン リ ス ト ) 整数型のオプ シ ョ ン群を内容 と し て持つ リ ス ト 。 こ こ で各オプ シ ョ ンはログ 記録ク ラ ス を記述 し 、 おのおのの値はその粒度を記述 し ます。 レ ベル 0 はログ記録ク ラ ス を無効 化 し 、 正の数値はク ラ ス を有効に し ます。 レ ベルが上がるほど詳細な出力を与え ます。 以下のオ プ シ ョ ンが使え ます (デ フ ォ ル ト : {api=1 warning=1}) : api すべての API 呼び出 し を、 その引数 と 結果 と と も に ログ記録 し ます。 api=2 の場合は、 すべての API 追跡行の頭に タ イ ムス タ ン プが生成 さ れる と と も に、 非推奨の関数 ・ オプ シ ョ ンにはその旨注記 さ れます。 api=3 の場合は、 try/catch 呼び出 し がログ記録 さ れま す (入れ子の例外処理によ るデバ ッ グ問題に対 し て有用です)。 filesearch SearchPath ま たは PVF を通 じ た フ ァ イルの場所特定に関連するすべての試みを ログ記 録 し ます。 resource Windows レ ジ ス ト リ ・ UPR 定義を通 じ た リ ソ ースの場所特定のすべての試みを、 その リ ソ ース検索の結果 と と も にロ グ記録 し ます。 user userlog オプ シ ョ ン で与え ら れたユーザー指定のログ記録出力。 warning すべての警告を、 すなわち、 無視または内部修復で き る エ ラ ー状況を ログ記録 し ます。 warning=2 の場合は、 例外を発生 さ せずに、 TET_get_errmsg( ) を通 じ て取得で き る メ ッ セージ テキス ト を残す関数か らの メ ッ セージ と 、 フ ァ イルを開 こ う と し た試みの失敗す べての原因も ロ グ記録 さ れます。 11.5 一般関数 159 11.6 文書関数 C++ int open_document(string filename, string optlist) C# Java int open_document(String filename, String optlist) Perl PHP long open_document(string filename, string optlist) VB RB Function open_document(filename As String, optlist As String) As Long C int TET_open_document(TET *tet, const char *filename, int len, const char *optlist) 内容を抽出 し たい、 デ ィ ス ク ベースの、 または仮想の PDF 文書を開き ます。 filename (名前文字列。 ただ し Unicode フ ァ イ ル名は Windows でのみ対応 し てい ます) 処理 さ せたい PDF 入力フ ァ イ ルの絶対ま たは相対名。 こ の フ ァ イ ルは、searchpath リ ソ ー ス カ テ ゴ リ 内で指定 さ れてい る すべてのデ ィ レ ク ト リ 内で検索 さ れます。 Windows では、 UNC パ ス と 、 マ ッ プ さ れたネ ッ ト ワー ク ド ラ イ ブ も 使え ます。 PHP では、 Unicode フ ァ イ ル名は UTF-8 であ る 必要があ り ます。 非 Unicode 言語バ イ ンデ ィ ン グでは、 len = 0 の場合、 フ ァ イ ル名はカ レ ン ト シ ス テ ム コ ー ド ページで解釈 さ れます。 ただ し 、 UTF-8 BOM が頭に付いてい る 場合は、 UTF-8 か EBCDIC-UTF-8 と し て解釈 さ れます。 len (C 言語バ イ ンデ ィ ン グのみ) filename が UTF-16 文字列の場合の長 さ (バ イ ト 単位 で)。 len=0 な ら ば、 ヌ ル終端文字列を与え る 必要があ り ます。 optlist 表 11.6 に従っ て文書オプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト 。 右記のオプ シ ョ ンが使え ます : checkglyphlists ・ decompose ・ encodinghint ・ fold ・ glyphmapping ・ lineseparator ・ normalize ・ inmemory ・ password ・ repair ・ requiredmode ・ shrug ・ tetml ・ usehostfonts ・ wordseparator ・ zoneseparator 戻り値 エ ラ ー時は -1、 そ う でないな ら 文書ハン ド ル。 た と えば、 入力文書ま たは TETML 出力 フ ァ イ ルを開 く こ と がで き ない と き はエ ラ ーにな り ます。 -1 が返 さ れた場合には、 TET_ get_errmsg( ) を呼び出 し てエ ラ ーの詳細を知 る こ と を推奨 し ます。 詳細 1 個の TET オブジ ェ ク ト 内で、 任意の数の文書を同時に開いてお く こ と がで き ます。 し か し 、 1 個の TET オブジ ェ ク ト を複数の ス レ ッ ド で同時に、 ア ク セ ス を同期す る ロ ッ ク 機構 な し で使用 し てはいけ ません。 暗号化 : 文書が暗号化 さ れてい る 場合は、 その権限設定が内容抽出を許 し てい る な ら ば、 そのユーザーパ ス ワー ド を password オプシ ョ ンで与え る 必要があ り ます。 権限設定 が内容抽出を許 し ていない場合には、その文書のマ ス タ ーパ ス ワー ド を与え る 必要があ り ます。 requiredmode オプシ ョ ン を指定 し てい る 場合は、 正 し いパ ス ワ ー ド がな く て も 文 書を開 く こ と がで き ますが、 操作は制限 さ れます。 shrug オプシ ョ ン を用い る と 、 保護 さ れた文書か ら 一定の条件下で内容抽出を可能にする こ と がで き ます (59 ページの 5.1 「暗 号化 PDF か ら 内容を抽出」 を参照)。 i5/iSeries 上での対応フ ァ イ ルシ ス テ ム : TET は、 PC タ イ プの フ ァ イ ルシ ス テ ムでの みテ ス ト さ れてい ます。 ですので、 入力 ・ 出力フ ァ イ ルは、 IFS (統合フ ァ イ ルシ ス テ ム) 内の PC タ イ プ フ ァ イ ル内になければな り ません。QSYS.lib フ ァ イ ルシ ス テ ム内の入力フ ァ イ ルはテ ス ト さ れてお ら ず、 サポー ト さ れてい ません。 QSYS.lib フ ァ イ ルは多 く の場合、 レ コ ー ド ベー ス ま た はデー タ ベー ス オブ ジ ェ ク ト の た めに用い ら れ ま すので、 TET を QSYS.lib オブジ ェ ク ト と と も に使用す る と 予期 し ない動作結果を招 く おそれがあ り ます。 160 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス TET フ ァ イ ル I/O ス ト リ ームはつねに ス ト リ ームベース であ り 、レ コ ー ド ベース ではあ り ません。 表 11.6 TET_open_document( ) ・ TET_open_document_callback( ) の文書オプ シ ョ ン一覧 オプ シ ョ ン 説明 checkglyphlists (論理値) true な らば、 TET は、 テキス ト 抽出が始ま る前に、 すべての condition=allfonts の内蔵グ リ フ マ ッ ピ ング規則を チ ェ ッ ク し ます。 そ う でないな ら、 グ ローバルなグ リ フ マ ッ ピ ン グ規則は 適用 さ れません。 このオプ シ ョ ンは処理速度を低下 さ せますが、 デ フ ォル ト で Unicode へマ ッ プ で き ないグ リ フ名を持つある種の TeX 文書に対 し て有用です。 デ フ ォ ル ト : false decompose (キーワー ド かオプ シ ョ ン リ ス ト ) 指定 し た Unicode 分解 タ グ を持つ、 かつ、 指定 し た Unicode 集 合の一部であ るすべてのキ ャ ラ ク タ に適用 さ れる Unicode 分解。 こ れら の条件はサブオプ シ ョ ンの 名前 と 値で与え られます。 分解を用いる と 、 等価な Unicode キ ャ ラ ク タ 間の違いを除去するか温存 する こ と がで き ます (96 ページの 7.3 「Unicode 後処理」 を参照)。 デ フ ォル ト : 102 ページの 「デ フ ォル ト 分解」 を参照 し て く だ さ い。 ただ し 、 normalize オプ シ ョ ンが none 以外の値を持つ と きは、 すべてのデ フ ォル ト 分解は無効化 さ れます。 すなわち、 normalize オプ シ ョ ン を設定する と デ フ ォ ル ト が decompose=none に設定 さ れます。 ただ し 、 ユー ザー指定の分解はなお適用する こ と がで き ます。 リ ス ト に換えて、 以下のキーワー ド を与え る こ と も で き ます : none 何の分解 も適用 さ れません。 default 他の指定 し た分解の前に、 デ フ ォル ト 分解 (102 ページの 「デ フ ォ ル ト 分解」 を参照) が適用 さ れます。 分解のための以下のサブオプ シ ョ ンが使え ます : canonical ・ circle ・ compat ・ final ・ font ・ fraction ・ initial ・ isolated ・ medial ・ narrow ・ nobreak ・ small ・ square ・ sub ・ super ・ vertical ・ wide こ れらの各サブオプ シ ョ ンは、 分解の ド メ イ ン を、 すなわち、 分解が適用 さ れる Unicode キ ャ ラ ク タ の集合を指定する文字列またはキーワー ド を受け付けます。 文字列は、 ド メ イ ンの Unicode 集合 を指定 し ます。 こ れを用いる と 、 指定 し た分解 タ グ を持つキ ャ ラ ク タ の部分集合に分解を制限す る こ と がで き ます。 こ の ド メ イ ンの外のキ ャ ラ ク タ は変更 さ れません。 Unicode 集合の文字列に換え て、 以下のキーワー ド を与え る こ と も で き ます : _all 全 Unicode キ ャ ラ ク タ の集合。 すなわち、 分解は、 指定 し た分解 タ グ を持つすべての キ ャ ラ ク タ に適用 さ れます。 _none 空集合。 すなわち、 分解はま っ た く 適用 さ れません。 encodinghint (文字列1) 標準規則ではマ ッ プ で きず、 定義済内部グ リ フ マ ッ ピ ング規則に よ っ てのみマ ッ プ で き るグ リ フ名に対する Unicode マ ッ ピ ング を決定する ために用い られる エ ン コ ーデ ィ ングの名前。 キーワー ド none を用いる と 、 すべての定義済規則を無効化する こ と がで き ます。 デ フ ォ ル ト : winansi 11.6 文書関数 161 表 11.6 TET_open_document( ) ・ TET_open_document_callback( ) の文書オプ シ ョ ン一覧 オプ シ ョ ン 説明 fold (キーワー ド 、 または リ ス ト の リ ス ト 。 それぞれの内側の リ ス ト の 1 番目の要素は Unicode 集合ま たはキーワー ド 、 2 番目の要素は Unichar またはキーワー ド ) Unicode 集合 と し て指定 し た字形統 合 ド メ イ ン内のすべてのキ ャ ラ ク タ に対 し 、 字形統合 (等価マ ッ ピ ング) を適用 し ます。 この字 形統合は、 lineseparator または wordseparator オプ シ ョ ン で追加 し た区切 り キ ャ ラ ク タ を除 く すべ てのテキス ト に対 し て適用 さ れます (96 ページの 7.3 「Unicode 後処理」 を参照)。 デ フ ォル ト : 98 ページの表 7.3 を参照。 リ ス ト に換えて、 以下のキーワー ド を与え る こ と も で き ます : none 字形統合は一切適用 さ れません。 サブ リ ス ト に換えて、 以下のキーワー ド を与え る こ と も で き ます : default 他の指定 し た字形統合の前に、 デ フ ォル ト 字形統合が適用 さ れます。 各 リ ス ト の 1 番目の要素は、 字形統合の ド メ イ ン を、 すなわち その字形統合が適用 さ れる Unicode キ ャ ラ ク タ の集合を指定 し ます。 文字列は、 ド メ イ ンの Unicode 集合を指定 し ます。 1 個のキ ャ ラ ク タ が、 fold オプ シ ョ ン内で指定 し ている複数の集合に含まれている場合には、 最初に一致 し た 集合の定義が他のすべてに優先 し ます。 問題を避ける ため、 重な ら ない集合を用いる こ と を推奨 し ます。 Unicode 集合に換えて、 以下のキーワー ド を与え る こ と も で き ます : _dehyphenation 字形統合は、 改行位置でハイ フ ン区切 り さ れた単語内で見つかっ たハイ フ ンキ ャ ラ ク タ に適用 さ れます。 これ らのキ ャ ラ ク タ は、 TET_get_char_info( ) が返す attributes メ ンバ 内 と 、 TETML 内の @dehyphenation 属性で フ ラ グが立ち ます。 各 リ ス ト の 2 番目の要素は、 字形統合の タ ーゲ ッ ト キ ャ ラ ク タ ま たはア ク シ ョ ン を内容 と し て持 ち ます。 これは以下の種類のいずれかで指定 し ます : (Unichar) その ド メ イ ン内のすべてのキ ャ ラ ク タ を、 指定 し た Unicode キ ャ ラ ク タ へ置き換え ま す。 remove ド メ イ ン内のすべてのキ ャ ラ ク タ が除去 さ れます。 preserve ド メ イ ン内のキ ャ ラ ク タ は変更 さ れません。 unknownchar ド メ イ ン内のすべてのキ ャ ラ ク タ を、 unknownchar オプ シ ョ ン で指定 し たキ ャ ラ ク タ へ置き換え ます。 glyphmapping (オプ シ ョ ン リ ス ト の リ ス ト ) オプ シ ョ ン リ ス ト の リ ス ト 。 こ こ で各オプ シ ョ ン リ ス ト は、 標準 メ ソ ッ ド で き ちん と マ ッ プ で き ない 1 個ない し 複数のフ ォ ン ト / エ ン コ ーデ ィ ングの組み合わせに 対する グ リ フ マ ッ ピ ング方式を記述 し ます。 こ のマ ッ ピ ングは、 設定 さ れた順に用い られます。 最後のオプ シ ョ ン リ ス ト が フ ォ ン ト 名ワ イル ド カ ー ド 「*」 を含んでいる場合には、 それ以前の マ ッ ピ ングは用い ら れな く な り ます。 各規則は、 表 11.7 に従 っ たオプ シ ョ ン リ ス ト を内容 と し て 持ち ます。 特定のフ ォ ン ト 名にマ ッ チするすべてのグ リ フ マ ッ ピ ングが こ のフ ォ ン ト に適用 さ れ ます (デ フ ォ ル ト : 定義済内蔵グ リ フ規則群が適用 さ れます)。 なお、 グ リ フ マ ッ ピ ング規則は、 UPR フ ァ イル内の外部 リ ソ ース と し て指定する こ と も で き ます (61 ページの 5.2 「 リ ソ ース設定 と フ ァ イル検索」 を参照)。 keeppua 非推奨。 fold={{[:Private_Use:] preserve}} または fold={{[:Private_Use:] unknownchar}} を用いて く だ さい lineseparator (Unichar。 granularity=zone ・ page の場合のみ) 行ど う し の間に挿入 さ せたいキ ャ ラ ク タ 2。 デ フ ォ ル ト : U+000A 162 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 11.6 TET_open_document( ) ・ TET_open_document_callback( ) の文書オプ シ ョ ン一覧 オプ シ ョ ン 説明 normalize (キーワー ド ) テキス ト 出力を、 Unicode 正規化形の 1 つへ正規化 し ます : none いかな る正規化 も適用 し ません。 nfc 正規化形 C (NFC) : 正準分解の後に正準合成 nfd 正規化形 D (NFD) : 正準分解 nfkc 正規化形 KC (NFKC) : 互換分解の後に正準合成 nfkd 正規化形 KD (NFKD) : 互換分解 Unicode 正規化形には正準分解 と 互換分解がかかわっ て き ますので、 オプ シ ョ ン decompose と normalize の組み合わせは注意深 く 行 う 必要があ り ます。 normalize オプ シ ョ ン を none 以外の値に 設定する と 、 分解のデ フ ォル ト は decompose=none に設定 さ れます。 normalize オプ シ ョ ンは decompose オプ シ ョ ンの後に処理 さ れます。 inmemory (論理値。 TET_open_document( ) のみ) true の場合、 TET はフ ァ イル全体を メ モ リ 内へ読み込み、 それを そ こ で処理 し ます。 こ れは、 シ ス テムに よ っ ては驚異的なパ フ ォ ーマ ン ス向上につながる こ と があ り ますが ( と く に MVS)、 そのかわ り メ モ リ 使用量も増え ます。 false の場合、 文書の 個々の部分が必要に応 じ てデ ィ ス クから読み込まれます。 デ フ ォル ト : false password (文字列) 暗号化 さ れた文書に対するユーザーまたはマ ス タ ーパスワー ド 。 その文書の権限設定が テキス ト コ ピーを許 し ている場合には、 ユーザーパスワー ド で充分ですが、 そ う でない場合はマ ス タ ーパスワー ド を与え る必要があ り ます。 文書の暗号化状態を取得する方法 と 、 ユーザーまたはマス タ ーパスワー ド を知ら な く て も適用で き る pCOS 操作については、 pCOS リ フ ァ レ ン ス を参照 し て く だ さ い。 shrug オプ シ ョ ン を用いる と 、 保護 さ れた文書から一定の条件下で内容抽出を可能にする こ と がで き ます (59 ページの 5.1 「暗号化 PDF か ら内容を抽出」 を参照)。 repair (キーワー ド ) 破損 PDF 文書の扱い方を指定 し ます。 文書の修復は、 通常のパース よ り も時間がか か り ますが、 あ る種の破損 PDF が処理で き る よ う にな る可能性があ り ます。 ただ し 文書によ っ て は、 修復で き ないほど破損 し ている場合 も あ り ます (デ フ ォ ル ト : auto) : force 文書に問題があ っ て も な く て も、 無条件に文書の修復を試みます。 auto PDF を開 く 際に問題が検出 さ れた と き にのみ文書を修復 し ます。 none 文書の修復の試みは一切行われません。 PDF 内に問題があ る と きは、 関数呼び出 し は失 敗 し ます。 requiredmode (キーワー ド ) 文書を開 く 際に受け入れ られる最小 pCOS モー ド (最小 : minimum/ 制限 : restricted/ フ ル : full)。 結果の pCOS モー ド (pCOS リ フ ァ レ ン ス参照) が、 求めたモー ド よ り も 低 く な る場合は呼び出 し は失敗 し ます。 呼び出 し が成功 し た と きは、 結果の pCOS モー ド が最低 で も このオプ シ ョ ン で指定 し た ものであ る こ と が保証 さ れます。 ただ し 、 それよ り 高 く な る場合 も あ り ます。 た と えば、 暗号化 さ れていない文書に対 し て requiredmode=minimum を指定する と 、 結果はフ ルモー ド にな り ます。 デ フ ォル ト : full shrug (論理値) true の場合、 シ ュ ラ ッ グ機能が有効にな り 、 保護 さ れた文書から 一定の条件下で内容抽 出が可能にな り ます (59 ページの 5.1 「暗号化 PDF か ら内容を抽出」 を参照)。 shrug オプ シ ョ ン を用いる場合には、 その PDF 文書作成者の権利を尊重 し て く だ さ い。 デ フ ォ ル ト : false 11.6 文書関数 163 表 11.6 TET_open_document( ) ・ TET_open_document_callback( ) の文書オプ シ ョ ン一覧 オプ シ ョ ン 説明 tetml (オプ シ ョ ン リ ス ト ) TETML 出力が開始 さ れ、 そ し て TET_process_page( ) でページ ご と に作成で き ます。 以下のサブオプ シ ョ ンが使え ます : elements (論理値の リ ス ト ) 出力内に特定の TETML 要素が含ませるかど う かを指定 し ます (デ フ ォル ト : すべて true) : docinfo /TET/Document/DocInfo 要素 docxmp /TET/Document/Metadata 要素 options 要素 /TET/Document/Options と /TET/Document/Pages/Page/Options encodingname (キーワー ド ) 生成 さ れる TETML のテキス ト 宣言の XML エ ン コ ーデ ィ ン グ宣言内で用 いたい名前。 出力はつねに UTF-8 で生成 さ れます (デ フ ォ ル ト : UTF-8) : _none エ ン コ ーデ ィ ン グ宣言は作成 さ れません。 出力は同様に UTF-8 形式にな り ま す。 UTF-8 宣言 encoding="UTF-8" が作成 さ れます。 こ れ以外のエ ン コ ーデ ィ ング名は、 エ ン コ ーデ ィ ング宣言内に リ テ ラ ルに用い ら れま す。 適切な エ ン コ ーデ ィ ング名を与え る と と も に、 TET が TETML 出力を完成 さ せた後 に、 生成 さ れた TETML (UTF-8 です) を、 指定 し たエ ン コ ーデ ィ ングへ変換する こ と は、 ク ラ イ ア ン ト 側の役割です。 filename (文字列) TETML フ ァ イルの名前。 filename を与えなかっ た場合には、 出力は メ モ リ 内 に生成 さ れ、 TET_get_xml_data( ) で取得する こ と がで き ます。 関数呼び出 し が失敗 し た (すなわち、 PDF 入力文書を う ま く 開 く こ と がで き なかっ た) 場合には、 TETML 出力は 生成 さ れません。 unknownchar (Unichar) PDF 文書内の情報が整合 し ない、 または存在 し ないために、 Unicode へマ ッ プ で き ない キ ャ ラ ク タ に対する置き換え と し て用いたいキ ャ ラ ク タ 。 U+0000 にする と 、 未知キ ャ ラ ク タ は除 去 さ れます。 デ フ ォ ル ト : U+FFFD (置換キ ャ ラ ク タ ) 関連するオプ シ ョ ン : 未知の (PUA) キ ャ ラ ク タ を も、 指定 し た unknownchar へ置き換えたい と きは、 fold={{[:Private_Use:] unknownchar}} を用います。 それら を除去するには fold={{[:Private_ Use:] remove}} を用います。 usehostfonts (論理値) true の場合、 埋め こ まれていないが Unicode マ ッ ピ ン グ を決定する ために必要な フ ォ ン ト のデー タ は、 Mac または Windows ホス ト オペ レーテ ィ ングシ ス テム上で検索 さ れます。 デ フ ォ ル ト : true wordseparator (Unichar。 granularity=line ・ page の場合のみ) 単語ど う し の間に挿入 さ せたいキ ャ ラ ク タ 2。 デ フ ォル ト : U+0020 1. 表 11.7 の脚注 2 を参照 2. 区切 り キ ャ ラ ク タ を無効化する には U+0000 を用います。 表 11.7 TET_open_document( ) ・ TET_open_document_callback( ) の glyphmapping オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 codelist (文字列) フ ォ ン ト に適用 さ せたい コ ー ド リ ス ト リ ソ ースの名前。 これは、 埋め こ まれた ToUnicode CMap ま たはエ ン コ ーデ ィ ン グ項目よ り も 優先 さ れます。 fontname (名前文字列) 規則に対 し て選択 さ れる フ ォ ン ト (群) の名前の一部分ない し 全体。 部分集合接頭 辞を与え ている と きは、 指定 し た部分集合だけが選択 さ れます。 部分集合接頭辞を一切与えてい ない と きは、 名前 (部分集合接頭辞な し の) がマ ッ チするすべての フ ォ ン ト が選択 さ れます。 限 られたワ イル ド カ ー ド 1 が使え ます。 デ フ ォ ル ト : * fonttypes (キーワー ド の リ ス ト ) グ リ フ マ ッ ピ ングは、 指定 し た種類のフ ォ ン ト に対 し てのみ適用 さ れま す : * (あ ら ゆる種類の フ ォ ン ト を意味 し ます) ・ Type1 ・ MMType1 ・ TrueType ・ CIDFontType2 ・ CIDFontType0 ・ Type3。 デ フ ォル ト : * 164 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 11.7 TET_open_document( ) ・ TET_open_document_callback( ) の glyphmapping オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 forceencoding (文字列2 1 個か 2 個の リ ス ト 。 名前 2 個があ る と きは、 1 番目は winansi ・ macroman ・ Custom の いずれかで なければな り ません) 1 番目のエ ン コ ーデ ィ ング を、 2 番目の名前で指定 し たエ ン コ ー デ ィ ング リ ソ ースへ置き換え ます。 項目が 1 個 し か与え られていない と きは、 指定 し た エ ン コ ー デ ィ ング を用いて、 MacRoman ・ WinAnsi ・ MacExpert エ ン コ ーデ ィ ングのすべてのイ ン ス タ ン ス が置き換え られます。 こ のオプ シ ョ ンが フ ォ ン ト にマ ッ チ し た場合には、 その同 じ フ ォ ン ト に対 し ては他のグ リ フ マ ッ ピ ングは一切適用 さ れません。 forcettsymbol- (キーワー ド または文字列 2) 埋め込まれた、 実際にはテキス ト フ ォ ン ト である擬似 TrueType 記号 encoding フ ォ ン ト に対する Unicode マ ッ ピ ン グ を決定する ために使われる エ ン コ ーデ ィ ン グの名前か、 ま た は以下のキーワー ド の 1 つ (デ フ ォ ル ト : auto) : auto フ ォ ン ト の内蔵エ ン コ ーデ ィ ング (後述) が、 記号範囲 U+F0000 ∼ U+F0FF 内の Unicode キ ャ ラ ク タ を少な く と も 1 個含んでいる場合には、 encodinghint オプ シ ョ ン で指定 し たエ ン コ ーデ ィ ング を用いて擬似記号キ ャ ラ ク タ が本当のテキス ト キ ャ ラ ク タ へマ ッ プ さ れます。 そ う で ない場合には、 encodinghint は使われず、 キ ャ ラ ク タ は builtin キーワー ド に従 っ て マ ッ プ さ れます。 builtin フ ォ ン ト の post テーブル内のグ リ フ 名の Unicode マ ッ ピ ングから 得られる、 フ ォ ン ト の内蔵エ ン コ ーデ ィ ン グ を用います。 有名な TrueType フ ォ ン ト Wingdings* と Webdings* はつねに記号 フ ォ ン ト と し て扱われます。 globalglyphlist (論理値) true の場合は、 指定 し たグ リ フ リ ス ト は TET オブ ジ ェ ク ト の終了ま で メ モ リ 内に保持 さ れますので、 複数の文書に対 し て適用する こ と も で き ます。 デ フ ォ ル ト : false glyphlist (文字列) 適用 し たいグ リ フ リ ス ト リ ソ ースの名前 glyphrule (オプ シ ョ ン リ ス ト ) 数値グ リ フ 名に対する マ ッ ピ ング規則 (定義済規則に加えて)。 こ のオプ シ ョ ン リ ス ト は以下のサブオプ シ ョ ン を内容 と し て持つ必要があ り ます : prefix (文字列。 空で も可) 規則が適用 さ れる グ リ フ 名の接頭辞。 base (キーワー ド ) グ リ フ名の解釈を指定 し ます : ascii シ ングルバイ ト グ リ フ名はおのおの リ テ ラル ASCII キ ャ ラ ク タ と し て解釈 さ れます (例 : 1 は U+0031 へマ ッ プ さ れます)。 auto グ リ フ名が 10 進 と 16 進のど ち らの値を表すのかを自動的に決定 し ます。 結 果が一意でない場合には、 10 進 と 見な さ れます。 dec グ リ フ名は コ ー ド の 10 進表現 と し て解釈 さ れます。 hex グ リ フ名は コ ー ド の 16 進表現 と し て解釈 さ れます。 encoding (文字列) こ の規則に対 し て用い られる エ ン コ ーデ ィ ング リ ソ ースの名前。 キーワー ド none を指定する と 、 規則は無効にな り ます。 ignoretounicodecmap (論理値) true の場合には、 フ ォ ン ト に対する ToUnicode CMap は無視 さ れます。 デ フ ォ ル ト : false override (論理値。 glyphlist または glyphrule オプ シ ョ ン と と も に用いてのみ意味を持ち ます) true の場合 には、 グ リ フ マ ッ ピ ング規則は、 標準 (内蔵) グ リ フ のマ ッ ピ ング よ り 前に適用 さ れます (すな わち、 新 し いマ ッ ピ ングが内蔵の ものよ り 優先 さ れます)。 そ う でない場合はその逆です。 デ フ ォ ル ト : true tounicodecmap (文字列) フ ォ ン ト に適用 さ せたい ToUnicode CMap リ ソ ースの名前。 こ れは、 埋め込まれた ToUnicode CMap ま たはエ ン コ ーデ ィ ング項目よ り も優先 さ れます。 1. 限 ら れたワ イル ド カ ー ド : 単独キ ャ ラ ク タ 「*」 は全 フ ォ ン ト を意味 し ます。 接頭辞の後に 「*」 を付け る と ( 「MSTT*」 な ど)、 指定 し た接頭辞で始ま るすべての フ ォ ン ト を意味 し ます。 2. 右記の定義済エ ン コ ーデ ィ ン グ名は、 追加設定な し で使え ます : winansi ・ macroman ・ macroman_apple ・ macroman_euro ・ ebcdic ・ ebcdic_37 ・ iso8859-X ・ cpXXXX ・ U+XXXX。 カ ス タ ムエ ン コ ーデ ィ ン グは、 リ ソ ース と し て定義する こ と がで き ます。 11.6 文書関数 165 C++ int open_document_callback(void *opaque, size_t filesize, size_t (*readproc)(void *opaque, void *buffer, size_t size), int (*seekproc)(void *opaque, long offset), string optlist) C int TET_open_document_callback(TET *tet, void *opaque, size_t filesize, size_t (*readproc)(void *opaque, void *buffer, size_t size), int (*seekproc)(void *opaque, long offset), const char *optlist) 内容抽出 し たい PDF 文書を、 カ ス タ ムデー タ ソ ースから 開き ます。 opaque 入力 PDF 文書に関連づけた何 ら かのユーザーデー タ へのポ イ ン タ 。 こ のポ イ ン タ は、 コ ールバ ッ ク 関数群の 1 番目の引数 と し て渡 さ れ、 いか よ う にで も 使 う こ と がで き ます。 TET は こ の不透明ポ イ ン タ をいかな る 形において も 使用 し ません。 filesize PDF 文書全体のサ イ ズ をバ イ ト 単位で。 readproc size バ イ ト を buffer で指 し 示 さ れた メ モ リ へ複製す る C コ ールバ ッ ク 関数。文 書の終わ り に到達 し た場合には、求め ら れた よ り も 少ないデー タ を複製す る こ と がで き ま す。 こ の関数は、 複製 し たバ イ ト 数を返す必要があ り ます。 seekproc 文書内のカ レ ン ト 読み取 り 位置を設定する C コ ールバ ッ ク 関数。 offset は文書 の先頭か ら の位置を表 し ます (0 を最初のバ イ ト と し て) 。 こ の関数は、 成功 し た と き に は 0 を、 そ う でなかっ た と き には -1 を返す必要があ り ます。 optlist 表 11.6 に従っ て文書オプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト 。 戻り値 TET_open_document( ) 参照。 詳細 TET_open_document( ) 参照。 バインディング こ の関数は、 C ・ C++ 言語バ イ ンデ ィ ン グでのみ利用可能です。 C++ void close_document(int doc) C# Java void close_document(int doc) Perl PHP TET_close_document(resource tet, long doc) VB RB Sub close_document(doc As Long) C void TET_close_document(TET *tet, int doc) 文書ハン ド ル と 、 その文書に関連づけ ら れたすべての内部 リ ソ ース を解放 し ます。 doc TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 詳細 文書を閉 じ る と 、 その開いてい る ページ群 も すべて自動的に閉 じ ら れ ま す。 TET_delete( ) を呼び出す と 、 開いてい る 文書 と ページはすべて自動的に閉 じ ら れます。 と はいえ、 文書 が必要な く な っ た時点で明示的に閉 じ る のが良いプ ロ グ ラ ミ ン グ習慣です。閉 じ ら れた文 書ハン ド ルは、 その後はいかな る 関数呼び出 し において も 使用 し てはいけ ません。 166 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 11.7 ページ関数 C++ int open_page(int doc, int pagenumber, string optlist) C# Java int open_page(int doc, int pagenumber, String optlist) Perl PHP long open_page(long pagenumber, string optlist) VB RB Function open_page(doc As Long, pagenumber As Long, optlist As String) As Long C int TET_open_page(TET *tet, int doc, int pagenumber, const char *optlist) 内容抽出 し たいページ を開き ます。 doc TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 pagenumber 開 き たいページの物理的番号。 最初のページ をページ番号 1 と し ます。 総 ページ数は TET_pcos_get_number( ) と pCOS パ ス length:pages で取得で き ます。 optlist 表 11.8 に従っ てページオプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト 。 右記のオプ シ ョ ンが使え ます : clippingarea ・ contentanalysis ・ docstyle ・ excludebox ・ fontsizerange ・ granularity ・ ignoreinvisibletext ・ imageanalysis ・ includebox ・ layoutanalysis ・ layouteffort ・ skipengines ・ structureanalysis ・ topdown。 戻り値 ページのハン ド ル。 エ ラ ーの場合には -1。 -1 が返 さ れた場合には、 TET_get_errmsg( ) を 呼び出 し てエ ラ ーの詳細を知 る こ と を推奨 し ます。 詳細 1 個の文書内で任意の数のページ を同時に開いてお く こ と がで き ます。 同 じ ページ を異な る オプシ ョ ンで複数回開 く こ と も で き ます。 し か し 、 1 つのページ を処理 し てい る 途中に オプシ ョ ン を変え る こ と はで き ません。 ページ内に レ イ ヤー定義 (オプシ ョ ナルな内容グループ) があ っ て も 考慮 さ れません。 レ イ ヤーが可視に さ れてい る か ど う かにかかわ ら ず、ページ上のすべての レ イ ヤー上のす べてのテ キ ス ト が抽出 さ れます。 11.7 ページ関数 167 表 11.8 TET_open_page( ) ・ TET_process_page( ) のページオプ シ ョ ン一覧 オプ シ ョ ン 説明 clippingarea (キーワー ド 。 includebox を指定 し ている と こ れは無視 さ れます) テキス ト が抽出 さ れる領域を指 定 し ます (デ フ ォル ト : cropbox) : mediabox MediaBox を用います ( これは必ず存在 し ます) cropbox CropBox を用います (Acrobat で表示 さ れる領域です)。 なければ MediaBox を用います bleedbox BleedBox を用います。 なければ CropBox を用います trimbox TrimBox を用います。 なければ CropBox を用います artbox ArtBox を用います。 なければ CropBox を用います unlimited 位置にかかわら ずすべてのテキス ト を考慮 し ます。 contentanalysis (オプ シ ョ ン リ ス ト 。 granularity=glyph の場合には不可) 表 11.9 に従っ た、 高レ ベル内容分析 と テ キス ト 処理のためのサブオプ シ ョ ン群の リ ス ト 。 docstyle (キーワー ド ) レ イ アウ ト 検出エ ン ジ ンが さ ま ざ ま なパラ メ タ を選択する ために用いる ヒ ン ト 。 こ れらのパラ メ タ は、 入力文書が以下の分類の 1 つに属する状況において レ イ アウ ト 分析を最適化 し ます : book 典型的な本 business ビ ジネス文書 fancy 複雑な レ イ アウ ト に よ る装飾的なページ forms 構造化 さ れた フ ォ ーム generic 特に特徴を指定 し ない最も一般的な文書分類です。 magazines 雑誌記事 papers 新聞 science 科学記事 searchengine ア プ リ ケーシ ョ ンは検索エ ン ジ ン な ど であ り 、 ページの単語一覧を な るべ く 速 く 取得す る こ と が主た る関心。 表組 ・ ページ構造認識は無効化 さ れます。 spacegrid 視覚レ イ アウ ト がスペースキ ャ ラ ク タ 群を用いて生成 さ れる、 リ ス ト 指向のレポー ト ( メ イ ン フ レームシ ス テムで生成 さ れる こ と が多い)。 こ の種の文書に対 し ては、 影付き 検出や洗練 さ れた単語境界検出 と い っ た多 く の ヒ ュ ー リ ス テ ィ ッ ク は必要ないので、 こ のオプ シ ョ ンに よ っ て テキス ト 抽出を高速化で き ます。 excludebox (矩形の リ ス ト ) 指定 し た矩形を合わせた領域を、 テキス ト 抽出から除外 し ます。 デ フ ォル ト : 空 fontsizerange (float 2 個の リ ス ト ) テキス ト の最小 ・ 最大文字サイ ズを指定 し た 2 個の数値。 こ の区間を外れた サイ ズのテキス ト は無視 さ れます。 最大値にキーワー ド unlimited を指定する と 、 上限な し と い う 意味にな り ます。 デ フ ォル ト : { 0 unlimited } granularity (キーワー ド ) TET_get_text( ) が返すテキス ト 断片の粒度。 glyph 以外のすべてのモー ド で単語検出 機能が有効にな り ます。 詳 し く は 83 ページの 「テキス ト の粒度」 を参照 し て く だ さ い (デ フ ォル ト : word) : glyph 各断片はそれぞれ 1 個のグ リ フ を マ ッ プ し た結果を内容 と し て持ち ますが、 それが複数 のキ ャ ラ ク タ にな る場合も あ り ます (合字の場合な ど)。 word 各断片はそれぞれ、 単語検出機能に よ っ て決定 さ れた 1 個の単語を内容 と し て持ち ま す。 line 各断片はそれぞれテキス ト 1 行を、 ない し はそれにで き る だけ似た ものを内容 と し て持 ち ます。 連続する 2 個の単語の間には単語区切 り キ ャ ラ ク タ が挿入 さ れます。 page 各断片はそれぞれ 1 個のページ を内容 と し て持ち ます。 単語 ・ 行 ・ 区域区切 り キ ャ ラ ク タ が適宜挿入 さ れます。 ignoreinvisibletext (論理値) true の場合には、 表現モー ド 3 (不可視) のテキス ト は無視 さ れます。 デ フ ォル ト : false (不可視テキス ト は、 スキ ャ ン さ れたページ と その OCR テキス ト を内容 と し て持つ画像 + テ キス ト PDF で主に使用 さ れているから です) imageanalysis (オプ シ ョ ン リ ス ト ) 表 11.11 に従 っ た、 高レ ベル画像処理を制御する ためのサブオプ シ ョ ン群の リスト。 168 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 11.8 TET_open_page( ) ・ TET_process_page( ) のページオプ シ ョ ン一覧 オプ シ ョ ン 説明 includebox (矩形の リ ス ト ) テキス ト 抽出を、 指定 し た矩形を合わせた領域に限 り ます。 デ フ ォ ル ト : 切 り 抜 き領域全体 layoutanalysis (オプ シ ョ ン リ ス ト 。 granularity=glyph の場合には不可) 表 11.10 に従 っ た、 レ イ アウ ト 検出機能 を制御する ためのサブオプ シ ョ ン群の リ ス ト 。 layouteffort (キーワー ド ) レ イ アウ ト 認識の品質 / パフ ォ ーマ ン スの ト レー ド オ フ を制御 し ます。 レ イ アウ ト 認識は、 努力を増せば向上で き ますが、 こ れに よ っ て操作は遅 く な るおそれがあ り ます。 このレ イ アウ ト 認識努力を、 キーワー ド none ・ low ・ medium ・ high ・ extra で制御で き ます。 デ フ ォ ル ト : low skipengines (キーワー ド の リ ス ト ) ページ内容に対 し て利用可能なパーサのい く つかを スキ ッ プ し ます。 ス キ ッ プ さ れたエ ン ジ ンは このページに対 し て何のデー タ も返 し ません。 必要で ないエ ン ジ ン を ス キ ッ プする と 、 こ のエ ン ジ ンが出すデー タ を必要 と し ないア プ リ ケーシ ョ ンにおいてパ フ ォ ーマ ン スが向上 し ます (デ フ ォル ト : すべてのエ ン ジ ンが有効) : text (キーワー ド ) テキス ト 抽出エ ン ジ ン を スキ ッ プ し ます。 image (キーワー ド ) 画像抽出エ ン ジ ン を スキ ッ プ し ます。 structureanalysis (オプ シ ョ ン リ ス ト 。 granularity=glyph の場合には不可) 表 11.12 に従 っ た、 ページ構造分析を制 御する ためのサブオプ シ ョ ン群の リ ス ト 。 topdown (オプ シ ョ ン リ ス ト ) 可視ページの左上隅に原点を持つ、 y 座標が下方増加する座標系を指定 し ま す。 そ う で ないな ら、 左下隅に原点を持つデ フ ォ ル ト 座標系が用い られます。 下向き座標を有効 にする と 、 Acrobat で表示 さ れる座標系 と 同 じ にする こ と がで き ます。 使え るサブオプ シ ョ ン : input (論理値) true の場合には、 以下の項目に対 し て座標が有効にな り ます (デ フ ォ ル ト : false) : ページオプ シ ョ ン includebox ・ excludebox output (論理値) true の場合には、 以下の項目に対 し て座標が有効にな り ます (デ フ ォ ル ト : false) : TET_char_info : y ・ alpha ・ beta TET_image_info : y ・ alpha ・ beta TETML : Glyph/@y ・ Glyph/@alpha ・ Glyph/@beta ・ Box/@lly ・ Box/@ury ・ PlacedImage/ @y ・ PlacedImage/@alpha ・ PlacedImage/@beta 表 11.9 TET_open_page( ) ・ TET_process_page( ) の contentanalysis オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 bidi (キーワー ド 。 granularity=glyph の場合には無視 さ れます。 右書きキ ャ ラ ク タ がページ上に存在 し ている場合にのみ効力を持ち ます) 断片内の右書き ・ 左書き テキス ト を並べ替え る反転双方向ア ルゴ リ ズムを制御 し ます (デ フ ォル ト : logical) : visual 断片内の右書き ・ 左書き キ ャ ラ ク タ を視覚順に保ち ます。 すなわち、 反転双方向アルゴ リ ズムを適用 し ません。 logical 反転双方向アルゴ リ ズムを適用 し て、 断片内のキ ャ ラ ク タ を論理順で も た ら し ます。 bidilevel (キーワー ド ) 反転双方向アルゴ リ ズムに対するページのベース レ ベル (すなわち テキス ト 進行の 主要向き) を指定 し ます (デ フ ォル ト : auto) : auto テキス ト 進行の主要向き を、 内容に基づいて ヒ ュ ー リ ス テ ィ ッ ク に決定 し ます。 ltr テキス ト 進行の主要向き と し て左書き を前提 し ます (欧文文書な ど) rtl テキス ト 進行の主要向き と し て右書き を前提 し ます (ヘブ ラ イ文字 ・ ア ラ ビ ア文字文書 な ど) dehyphenate (論理値) true の場合には、 ハイ フ ン区切 り さ れた単語が特定 さ れ、 ハイ フ ン を挟むテキス ト 断片 ど う し が連結 さ れます。 ハイ フ ン自体は keephyphens オプ シ ョ ンに従っ て扱われます。 デ フ ォ ル ト : true 11.7 ページ関数 169 表 11.9 TET_open_page( ) ・ TET_process_page( ) の contentanalysis オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 dropcapsize (float) 大き なグ リ フ が ド ロ ッ プキ ャ ッ プ と し て認識 さ れる最小サイ ズ。 ド ロ ッ プキ ャ ッ プは、 区 域の先頭の大き なキ ャ ラ ク タ で、 数行にわた っ てぶら 下がっ ている ものです。 それらは、 その区 域の残 り と 連結 さ れ、 その区域内の最初の単語の一部を成 し ます。 デ フ ォ ル ト : 35 dropcapratio (float) ド ロ ッ プキ ャ ッ プ と 隣接テキス ト の文字サイ ズの最小比率。 大き なキ ャ ラ ク タ は、 そのサ イ ズが dropcapsize を超えてお り 、 かつ、 その文字サイ ズ比率が dropcapratio を超えている場合に ド ロ ッ プキ ャ ッ プ と し て認識 さ れます。 言い換えれば、 これは ド ロ ッ プキ ャ ッ プがわた る テキス ト 行数です。 デ フ ォ ル ト : 4 ( ド ロ ッ プキ ャ ッ プは 3 行にわた る ものが非常に多いですが、 行間の 分も考慮に入れる必要があ り ます) includeboxorder (整数) 複数の包含枠を与えている と き (オプ シ ョ ン includebox 参照)、 こ のオプ シ ョ ンは、 枠の 順序が単語検出機能に対 し どのよ う な効力を持つかを制御 し ます (デ フ ォ ル ト : 0) : 0 ページ内容を分析する際に、 包含枠順序は無視 し ます。 結果は、 あたかも 包含枠群の外 のテキス ト がすべて削除 さ れたの と 同 じ にな り ます。 こ れは、 ほ し く ないテキス ト (ヘ ッ ダ ・ フ ッ タ な ど) を除去 し つつ、 単語検出機能には何の影響も与え ないよ う にす る ために有用です。 1 包含枠順序を、 単語 と 区域を生成する際には考慮に入れますが、 区域順序を決定する際 には考慮 し ません。 1 個の単語が複数の枠に属する こ と は決 し てあ り ません。 で き た区 域群は、 論理順に並べ替わ り ます。 枠が重な り あ っ ている場合には、 そのテキス ト は リ ス ト 内で最も先に現れた枠に属 し ます。 それ以外では、 オプ シ ョ ン リ ス ト 内における包 含枠の順序は考慮 さ れません。 こ の設定は、 テキス ト を フ ォ ームか ら抽出する時や、 テ キス ト を表組か ら抽出する時や、 複雑な レ イ アウ ト において包含枠が重な り あ っ ている 場合に有用です。 2 包含枠順序を、 すべての操作について考慮 し ます。 各包含枠の内容は他の枠 と は独立に 扱われ、 で き たテキス ト は包含枠の順序に従っ て連結 さ れます。 こ れは、 フ ォ ームから テキス ト を特定の順序で抽出 し たい時や、 雑誌レ イ アウ ト 内の記事段組を定義済順序で 抽出 し たい時に有用です。 こ う し た場合には、 包含枠を適切な順序で指定する ために、 そのページ レ イ アウ ト に関する事前の知識が必要です。 keep hyphenglyphs (論理値) true かつ dehyphenate=true の場合には、 ハイ フ ン除去 さ れた単語の各部分の間のハイ フ ング リ フは、 get_char_info( ) が返すグ リ フの リ ス ト 内 と TETML 内の Glyph 要素で温存 さ れま す。 こ れは、 ページ上のテキス ト を正確に置き換えたいな ど、 ハイ フ ンの位置について詳 し い情 報を必要 と する ア プ リ ケーシ ョ ンにおいて有用です。 こ れは fold={{_dehyphenation remove} と は 異な る こ と に留意 し て く だ さ い。 後者は、 get_text( ) が返す論理テキス ト から ハイ フ ン を除去する だけであ り 、 グ リ フ に対 し ては効力を持ち ません。 デ フ ォル ト : false lineseparator 非推奨1 linespacing (キーワー ド ) 段落内のテキス ト 行ど う し の間の典型的な縦間隔を指定 し ます : small ・ medium ・ large のいずれかです (デ フ ォ ル ト : medium) maxwords (整数かキーワー ド ) ページ上の単語の数が、 指定 し た数以下の と きは (キーワー ド unlimited を 指定する と 上限な し にな り ます)、 ページ上で検出 さ れた区域群は適切に連結 さ れ並べ替え さ れま す。 ページ上の単語の数が、 指定 し た数を超えている と きは、 区域は一切作成 さ れず、 単語群は ページ内容の読み順で抽出 さ れます。 後者の場合には処理はよ り 速 く な り ますが、 抽出 さ れる単 語群の順序は最適ではな く な るおそれがあ り ます。 新聞のよ う な、 多 く の単語を含む大き なペー ジに対 し ては、 このオプ シ ョ ン を unlimited に設定する こ と を推奨 し ます。 デ フ ォル ト : 5000 170 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 11.9 TET_open_page( ) ・ TET_process_page( ) の contentanalysis オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 merge (整数) ス ト リ ッ プ と 区域の連結を制御 し ます (デ フ ォル ト : 2) : 0 ス ト リ ッ プ作成後の連結な し 。 これはかな り 処理速度を向上 さ せますが、 最適未満の出 力を生成するおそれがあるほか、 影によ っ ては正 し く 検出 さ れないおそれがあ り ます。 1 単純な、 ス ト リ ッ プ を区域へ入れ込む連結 : ス ト リ ッ プは、 それが区域に重な っ てお り 、 それでいて、 次のス ト リ ッ プ以外のス ト リ ッ プ と 重な り 合 っ ていない場合に (影な し の場合における区域の重な り 合いを避ける ため)、 こ の区域内へ連結 さ れます。 2 順序破 り な テキス ト のための高度な区域連結 : merge=1 に加えて、 複数の重な り 合 う 区 域は、 両区域のテキス ト 内容が重な り 合わないな らば、 結合 さ れて 1 個の区域にな り ま す。 numericentities (キーワー ド ) 数値 ・ 分数 ・ 時刻のよ う な数値実体に対する単語境界検出を制御 し ます (デ フ ォル ト : keep) : split その実体を、 punctuationbreaks サブオプ シ ョ ンに従 っ て分割 し ます。 keep その実体を、 単語ま る ご と と し て温存 し ます。 shadowdetect (論理値) true の場合には、 影付きや偽ボール ド テキス ト を作 り 出 し ている、 重な り 合 う テキス ト 断片群の冗長な イ ン ス タ ン スは検出 さ れ除去 さ れます。 デ フ ォ ル ト : true punctuation breaks (論理値。 granularity=word の場合のみ) true の場合には、 文字のそばに配置 さ れている約物キ ャ ラ ク タ は単語境界 と し て扱われ、 そ う でない場合にはそれは隣接する単語内へ含め られます。 た と えば、 こ のオプ シ ョ ンは URL と メ ールア ド レ スの扱いに影響を与え ます。 デ フ ォル ト : true superscript (整数) 下付き ・ 上付き検出を制御 し ます (デ フ ォ ル ト : 2) : 0 下付き ・ 上付き検出な し 1 単純な下付き ・ 上付き検出 2 下付き ・ 上付き検出のための高度なアルゴ リ ズム wordseparator 非推奨 1 1. TET_open_document*( ) の、 対応する オ プ シ ョ ン を用いて く だ さ い。 表 11.10 TET_open_page( ) ・ TET_process_page( ) の layoutanalysis オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 layoutastable (論理値) true の場合には、 レ イ アウ ト 認識エ ン ジ ンはページ上の区域群を 1 個ない し 複数の表組 と し て扱います。 連な り が表組 と 見な さ れる ために必要な最小の列数は、 文書のス タ イルに依存 し ます。 false の場合には、 スーパー表組認識は無効化 さ れます (デ フ ォ ル ト : true)。 layoutcolumnhint (キーワー ド ) このオプ シ ョ ンは、 複雑な レ イ アウ ト における区域読み順検出を向上 さ せる可能性 があ り ます。 使え るキーワー ド (デ フ ォル ト : multicolumn) : multicolumn ページは多段組テキス ト を含んでいます。 区域は段組か ら段組へ並べ替え さ れます。 none ヒ ン ト は何も得 られません。 区域順序はページ内容順序によ っ て決定 さ れます。 singlecolumn ページは 1 段組テキス ト を含んでいます。 区域は行から 行へ並べ替え さ れます。 layoutdetect (整数) 再帰的レ イ アウ ト 認識の深度を指定 し ます (デ フ ォ ル ト : 1) : 0 レ イ アウ ト 認識な し 。 1 ページ全体に対する レ イ アウ ト 認識。 ほ と んどの文書が こ れで充分です。 2 レ ベル 1 の結果に対する レ イ アウ ト 認識。 こ れは、 さ ま ざ ま な多段組副レ イ アウ ト を持 つレ イ アウ ト や、 ページ上の さ ま ざ ま な箇所に タ イ ト ルがあ る レ イ アウ ト や、 複数段落 表組に対 し て必要です。 3 レ ベル 2 の結果に対する レ イ アウ ト 認識。 こ れは非常に複雑な レ イ アウ ト に対 し てのみ 必要です。 11.7 ページ関数 171 表 11.10 TET_open_page( ) ・ TET_process_page( ) の layoutanalysis オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 layoutrowhint (オプ シ ョ ン リ ス ト ) レ イ アウ ト 行処理を制御 し ます。 使え る オプ シ ョ ン (デ フ ォル ト : none) : full レ イ アウ ト 行処理を有効に し ます。 none レ イ アウ ト 行処理を無効化 し ます。 separation (キーワー ド ) レ イ アウ ト 行処理を有効に し ますが、 レ イ アウ ト 認識がスーパー表組 と 推測 し た場合には無効化 し ます。 以下のサブオプ シ ョ ンが使え ます : preservecolumns 区域ど う し の間の視覚関係に基づいて縦の段組を保つ こ と を試みます。 段組 内の区域ど う し が大き く 引き離 さ れている場合 (画像がは さ ま っ ている な ど し て) には これを推奨 し ます。 thick 隣 り 合 う 区域ど う し を連結 し て、 それを同 じ レ イ アウ ト 行内に配置 し よ う と 試みます。 これによ っ て、 レ イ アウ ト 行の数は少な く な り 、 一つ一つは大き く な り ます。 段組内の段落ど う し が互いに文字サイ ズよ り も引き離 さ れてい る雑誌や新聞のよ う な複雑な レ イ アウ ト や、 い く つかの多段組記事が縦に並 んでいる レ イ アウ ト には これを推奨 し ます。 thin 隣 り 合 う 区域ど う し を引き離 し 、 それら を別々のレ イ アウ ト 行に配置 し よ う と 試みます。 こ れによ っ て、 レ イ アウ ト 行の数は多 く な り 、 一つ一つは小 さ く な り ます。 例 : layoutanalysis = {layoutrowhint={full separation=thick}} mergetables (整数) 表行 1 個だけの表組は、 表組認識中にスキ ッ プ さ れ、 通常の区域 と し て扱われます。 2 個 の連続する区域が表組であ る場合には (表行 1 個だけのであ っ て も )、 それら は結合する こ と も で き ます (デ フ ォ ル ト : none) : down 下方へのみ結合 し ます。 none 連結 し ません。 up 上方へのみ結合 し ます。 updown 双方向に結合 し ます。 splithint (キーワー ド かオプ シ ョ ン リ ス ト ) 2 ページ見開き ス プ レ ッ ド (ない し は さ ら な る ス プ レ ッ ド から 成るページ も ) の特別な扱い を有効に し ます。 ページ を縦または横に、 2 個以上のセ ク シ ョ ンに分 割する こ と がで き ます。 キーワー ド includebox を指定する と 、 分割領域群は includebox オプ シ ョ ンによ っ て定義 さ れます。 こ れに換えて、 以下のオプ シ ョ ン を与え る こ と も で き ます : x (float) x 軸に関する除数。 例 : 0.5 な ら 2 ページ見開き ス プ レ ッ ド 、 0.33 な ら 3 ページ スプレ ッ ド 。 y (float) y 軸に関する除数。 standalonefontsize (float) 巨大グ リ フ に対する最小文字サイ ズ。 巨大グ リ フは 1 グ リ フ ス ト リ ッ プ を形成 し 、 かつ、 他の区域 と は結合 さ れません (デ フ ォル ト : 70)。 supertablecolumns (整数。 layoutastable=true の場合のみ) 区域の連な り を スーパー表組 と 見なすためのレ イ アウ ト 行内の最小の段組数。 表組が段落群から 作成 さ れる と き、 こ れらの段組は結合 さ れずに、 別々の 区域 と し て認識 さ れます。 こ の結果 と し て、 レ イ アウ ト 認識は これ らの区域の連な り を表組 と し て特定する こ と がで き ます (デ フ ォ ル ト : 4)。 tabledetect (整数) 再帰的表組認識の深度を指定 し ます (デ フ ォ ル ト : 1) : 0 表組認識な し 。 1 各区域に対する表組認識。 2 レ ベル 1 で検出 さ れた各表セルに対する表組認識。 こ れは、 入れ子にな っ た表組のため に、 ま た、 複数行にわた る セルの解決のために必要です。 172 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 表 11.11 TET_open_page( ) ・ TET_process_page( ) の imageanalysis オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 smallimages (オプ シ ョ ン リ ス ト ) 小画像除去を制御 し ます。 小画像は多 く の場合擬似的な ものであ り 、 本当の 画像ではないので無視する必要があ り ます。 使え るオプ シ ョ ン : disable (論理値) true の場合には、 小画像除去は無効化 さ れます。 デ フ ォ ル ト : false maxarea (float) 小画像 と 見な さ せたい画像の最大面積 (幅×高 さ ) を ピ ク セル単位で。 デ フ ォ ル ト : 500 maxcount (整数) 小画像の最大許容数。 こ れを超え る数の小画像が見つかっ た と きはそれ ら すべ てが除去 さ れます。 デ フ ォル ト : 50 merge (オプ シ ョ ン リ ス ト ) 画像連結を制御 し ます。 こ の処理は、 合わせて 1 個の大画像を形成で き る隣 接画像群を結合 し ます。 これは、 PDF 内に個々のス ト リ ッ プが温存 さ れている マルチス ト リ ッ プ 画像に対 し て、 また、 多数の微小画像に分解 さ れている背景画像に対 し て有用です。 使え る オプ ション : disable (論理値) true の場合には、 画像連結は無効化 さ れます。 デ フ ォ ル ト : false gap (float) 連結対象 と 見な さ せたい 2 個の画像の間の間隔をポ イ ン ト 単位で。 デ フ ォル ト : 1.0 (0.0 でないのは、 位置計算における避けがたい誤差のためです) 表 11.12 TET_open_page( ) ・ TET_process_page( ) の structureanalysis オプ シ ョ ンのサブオプ シ ョ ン一覧 オプ シ ョ ン 説明 bullets (オプ シ ョ ン リ ス ト の リ ス ト 。 list=true の場合のみ) リ ス ト 内で ビ ュ レ ッ ト キ ャ ラ ク タ と し て用い ら れる Unicode キ ャ ラ ク タ と フ ォ ン ト 名の組み合わせを指定 し ます。 使え るサブオプ シ ョ ン : bulletchars (Unicode 値の リ ス ト ) ビ ュ レ ッ ト キ ャ ラ ク タ のための 1 個ない し 複数の Unicode 値。 こ のサブオプ シ ョ ン を与え ない場合には、 指定 し た fontname を用いているキ ャ ラ ク タ す べてがビ ュ レ ッ ト キ ャ ラ ク タ と し て扱われます。 fontname (文字列) ビ ュ レ ッ ト キ ャ ラ ク タ を使 う フ ォ ン ト の名前。 こ のサブオプ シ ョ ン を与えな い場合には、 bulletchars サブオプ シ ョ ン で指定 し たキ ャ ラ ク タ はつねにビ ュ レ ッ ト キ ャ ラ ク タ と し て扱われます。 例: bullets={{fontname=ZapfDingbats}} bullets={{bulletchars={U+2022}} bullets={{fontname=KozGoPro-Medium bulletchars={U+2460 U+2461 U+2462 U+2463 U+2464}} list (論理値) リ ス ト 認識を有効に し ます (デ フ ォ ル ト : false)。 false の場合には、 リ ス ト 構造に関す る情報は何も決定 さ れません。 paragraph (論理値) 段落認識を有効に し ます (デ フ ォル ト : true)。 false の場合には、 段落構造に関する情 報は何も 決定 さ れません。 table (論理値) 表組認識を有効に し ます (デ フ ォル ト : true)。 false の場合には、 表組認識エ ン ジ ンは 無効化 さ れます。 11.7 ページ関数 173 C++ void close_page(int page) C# Java void close_page(int page) Perl PHP close_page(long page) VB RB Sub close_page(page As Long) C void TET_close_page(TET *tet, int page) ページハン ド ル と 、 関連するすべての リ ソ ース を解放 し ます。 page TET_open_page( ) で得 ら れた有効なページハン ド ル。 詳細 TET_close_document( ) を呼び出す と 、 その文書の開いてい る ページはすべて自動的に閉 じ ら れます。 と はいえ、 ページが必要な く な っ た時点で明示的に閉 じ る のが良いプ ロ グ ラ ミ ン グ習慣です。 閉 じ ら れたページハン ド ルは、 その後はいかな る 関数呼び出 し において も 使用 し てはいけ ません。 174 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 11.8 テキス ト ・ メ ト リ ク ス抽出関数 C++ string get_text(int page) C# Java String get_text(int page) Perl PHP string get_text(long page) VB RB Function get_text(page As Long) As String C const char *TET_get_text(TET *tet, int page, int *len) ページの内容か ら、 次のテキス ト 断片を得ます。 page TET_open_page( ) で得 ら れた有効なページハン ド ル。 len (C 言語バ イ ンデ ィ ン グのみ) 返 さ れ る 文字列の UTF-16 値群での長 さ (バ イ ト 単位 にあ ら ず!) を保持す る 変数へのポ イ ン タ 。 バ イ ト 数を知 る には、 outputformat=utf16 の 場合は こ の値を 2 倍す る 必要があ り 、 outputformat=utf8 の場合は、 返 さ れた ヌ ル終端文 字列の文字列長を用い る 必要があ り ます。 戻り値 ページ上の、 次のテ キ ス ト 断片を内容 と し て持つ文字列。 こ の断片の長 さ は、 TET_open_ page( ) の granularity オプシ ョ ンに よ っ て決定 さ れます。 granularity=glyph の場合であ っ て も 、 こ の文字列は複数のキ ャ ラ ク タ を内容 と し て持つ場合があ り ます (91 ページの 7.1 「Unicode の さ ま ざ ま な重要概念」 を参照)。 ページ上のテ キ ス ト がすべて取得 さ れていた場合には、 空文字列か ヌ ルオブジ ェ ク ト が返 さ れます (後述) 。 こ の場合には、 テ キ ス ト が も う ない理由はページ上のエ ラ ーに よ る も の な の か、 そ れ と も ペー ジ の末尾に到達 し た か ら な の か を 知 る た め に、 TET_get_ errnum( ) を呼び出すべ き です。 バインディング C 言語バ イ ンデ ィ ン グ : 結果は、 TET_set_option( ) の outputformat オプシ ョ ンに従っ て、 ヌ ル終端 UTF-8 (デフ ォ ル ト ) か UTF-16 のいずれかの文字列で提供 さ れます。 i5/iSeries と zSeries では、 EBCDIC 符号化 さ れた UTF-8 を選択す る こ と も で き 、 かつ こ れがデフ ォ ル ト で有効にな っ てい ます。 テ キ ス ト が も う 得 ら れない と き は、 NULL ポ イ ン タ と *len=0 が返 さ れます。 C++ ・ COM : 結果は、 UTF-16 形式の Unicode 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 空文字列が返 さ れます。 Java ・ .NET : 結果は、 Unicode 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 ヌ ルオブジ ェ ク ト が返 さ れます。 Perl ・ PHP ・ Python 言語バ イ ンデ ィ ン グ : 結果は、 UTF-8 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 ヌ ルオブジ ェ ク ト が返 さ れます。 REALbasic L 結果は、 UTF-16 形式の Unicode 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 空文字列が返 さ れます。 RPG 言語バ イ ンデ ィ ン グ : 結果は、 Unicode 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 NULL ポ イ ン タ が返 さ れます。 11.8 テキス ト ・ メ ト リ ク ス抽出関数 175 C++ const TET_char_info *get_char_info(int page) C# Java int get_char_info(int page) Perl PHP object get_char_info(long page) VB RB Function get_char_info(int page) As Long C const TET_char_info *TET_get_char_info(TET *tet, int page) 最近のテキス ト 断片内の、 次のグ リ フ に対する詳 し い情報を得ます。 page TET_open_page( ) で得 ら れた有効なページハン ド ル。 注記 この関数の名前は付け間違いです。ページ上の視覚的なグ リ フ についての情報を報告する 関数であ っ て、 それに対応する Unicode キ ャ ラ ク タ について報告するのではないのですか ら、 TET_get_glyph_info( ) と い う 名前に し てお く べき で し た。 戻り値 TET_get_text( ) が返 し た最近のテ キ ス ト 断片について、 グ リ フ が も う 得 ら れない と き は、 バ イ ンデ ィ ン グ依存の値が返 さ れます。詳 し く は後述のバイ ンデ ィ ングの項を参照 し て く だ さ い。 詳細 こ の関数は、 TET_get_text( ) の後に 1 回ない し 複数回呼び出す こ と がで き ます。 こ れは、 与え ら れたページハン ド ルに関連付け ら れてい る カ レ ン ト テ キ ス ト 断片において、次のグ リ フへ進み (グ リ フ が も う ない と き は何 も 返 し ません) 、 そ し てそのグ リ フ についての詳 し い情報を提供 し ます。 テ キ ス ト 断片が論理キ ャ ラ ク タ を M 個持ち、 こ れについて こ の 関数への呼び出 し が N 回成功す る (すなわち グ リ フ が N 個あ る 。 N > 0) と す る と 、 N と M の関係は粒度に依存 し ます : > granularity=glyph の場合、 各テ キ ス ト 断片はそれぞれただ 1 個のグ リ フ に対応 し ます。 すなわち N=1 です。 1 個のグ リ フは多 く の場合、 1 個のキ ャ ラ ク タ に対応 し ます。 すな わち M=1 です。 ただ し 、 合字グ リ フ の場合には、 ただ 1 個のグ リ フ に対 し て複数の キ ャ ラ ク タ が対応 し ます。 すなわち M>1 であ り 、 TET_get_char_info( ) を複数回呼び出 す必要があ り ます。 > glyph 以外の粒度の場合には、 グ リ フ列はキ ャ ラ ク タ 列を生み出 し 、 こ こ で各グ リ フ が それぞれ生み出すキ ャ ラ ク タ は 0 個 ・ 1 個 ・ 複数のいずれで も あ り え ます。 こ のグ リ フ 列は、 Unicode キ ャ ラ ク タ 列の原料 と な る わけです。 言い換えれば、 N と M の間の関 係は事前にわか り ません。 N と M の間の関係は、 内容分析 (ハ イ フ ン除去処理でハ イ フ ンが除去 さ れ る な ど) や Unicode 後処理 (字形統合に よ っ て キ ャ ラ ク タ が追加 さ れ た り 削除 さ れた り す る な ど) に よ っ て影響を受け る 可能性があ り ます。 glyph 以外の粒度の場合には、 こ の関数は、 TET_get_text( ) への最近の呼び出 し が返 し た テ キ ス ト 断片を構成す る 次のグ リ フへ進みます。 こ れに よ っ て、 単語検出機能が有効な と き にグ リ フ メ ト リ ッ ク を取得す る こ と がで き 、 ま た、 1 個のテ キ ス ト 断片には複数のキ ャ ラ ク タ が含まれ る 場合があ り ます。カ レ ン ト テ キ ス ト 断片についてすべてのグ リ フ の詳細 を取得す る には、 こ の関数を、 情報を も う 返 さ な く な る ま で繰 り 返 し 呼び出す必要があ り ます。 構造ま たはプ ロ パテ ィ / フ ィ ール ド 内のグ リ フ詳細は、同 じ ページハン ド ルで次に TET_ get_char_info( ) か TET_close_page( ) を呼び出す (先に行な っ たほ う ) ま で有効です。 グ リ フ情報プ ロ パテ ィ / フ ィ ール ド のセ ッ ト は、TET オブジ ェ ク ト ご と にただ 1 個 し かあ り ま せんので、 同 じ ページについてであれ、 別のページについてであれ、 別の文書についてで あれ、 再び TET_get_char_info( ) を呼び出す前に ク ラ イ ア ン ト 側ですべてのグ リ フ情報を 取得 し てお く 必要があ り ます。 176 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス バインディング C ・ C++ 言語バ イ ンデ ィ ン グ : TET_get_text( ) が返 し た最近のテ キ ス ト 断片について、 グ リ フ が も う 得 ら れない と き は、 NULL ポ イ ン タ が返 さ れます。 そ う でない と き は、 1 個のグ リ フ に関す る 情報を内容 と し て持つ TET_char_info 構造へのポ イ ン タ が返 さ れます。 こ の デー タ 構造の メ ンバについては表 11.13 で説明 し ます。 COM ・ Java ・ .NET 言語バ イ ンデ ィ ン グ : TET_get_text( ) が返 し た最近のテ キ ス ト 断片につ いて、 グ リ フ が も う 得 ら れない と き は、 -1 が返 さ れます。 そ う でない と き は 1 が返 さ れ ます。 個々のグ リ フ情報は、 表 11.13 に従っ た TET プ ロ パテ ィ / パブ リ ッ ク フ ィ ール ド か ら 取得す る こ と がで き ます。 関数が -1 を返 し たに も かかわ ら ずプ ロ パテ ィ / フ ィ ール ド の値を見た場合には、いずれ も 値 -1 を と り ます(unknown フ ィ ール ド は false にな り ます)。 Perl ・ Python 言語バ イ ンデ ィ ン グ : get_text( ) が返 し た最近のテ キ ス ト 断片について、 グ リ フ が も う 得 ら れない と き は、0 が返 さ れます。そ う でない と き は、表 11.13 に挙げ る キー 群を含むハ ッ シ ュ が返 さ れます。 個々のグ リ フ情報は、 こ のハ ッ シ ュ 内のキーに よ っ て取 得す る こ と がで き ます。 REALbasic バ イ ンデ ィ ン グ : get_text( ) が返 し た最近のテ キ ス ト 断片について、 グ リ フ が も う 得 ら れない と き は、 nil が返 さ れます。 そ う でない と き は、 表 11.13 に挙げ る メ ンバ群 を含む TET_char_info オブジ ェ ク ト が返 さ れます。 個々のグ リ フ情報は、 こ のオブジ ェ ク ト 内の メ ンバに よ っ て取得す る こ と がで き ます。 PHP 言語バ イ ンデ ィ ン グ : get_text( ) が返 し た最近のテ キ ス ト 断片について、 グ リ フ が も う 得 ら れない と き は、 空 (ヌ ル) オブジ ェ ク ト が返 さ れます。 そ う でない と き は、 表 11.13 に挙げ る フ ィ ール ド 群を含むオブジ ェ ク ト が返 さ れます。 個々のグ リ フ情報は、 こ のオブ ジ ェ ク ト の メ ンバフ ィ ール ド か ら 取得す る こ と がで き ます。グ リ フ情報オブジ ェ ク ト 内の 整数フ ィ ール ド は、 PHP 言語バ イ ンデ ィ ン グでは long と し て実装 さ れてい ます。 表 11.13 TET_char_info 構造の メ ンバ (C ・ C++) と 、 同等のパブ リ ッ ク フ ィ ール ド (Java ・ PHP) ・ キー (Perl) ・ プ ロパテ ィ (COM ・ .NET)、 およびその型 と 意味の一覧。 詳 し く は ?Glyph metrics?, page 68 を参照。 プロパテ ィ / フ ィ ール ド 名 説明 uv (整数) カ レ ン ト グ リ フ に対する UTF-32 Unicode 値。 glyph 以外の粒度の場合、 こ れは、 最終テキ ス ト 断片 と はま っ た く 無関係な擬似または中間値を と る こ と があ り ます。 granularity=glyph の場 合、 グ リ フ に対する Unicode 値列は論理テキス ト に等 し いですが、 それ以外の粒度の場合には、 そ れは さ ま ざ ま な処理ス テ ッ プによ っ て変更 さ れている可能性があ り ます。 type (整数) キ ャ ラ ク タ の種別。 以下の種別は、 ページ上のグ リ フ に対応する本当のキ ャ ラ ク タ を記述 し ます。 こ れ以外のすべてのプ ロパテ ィ / フ ィ ール ド の値は、 対応するグ ラ フ に よ っ て決定 さ れ ます : 0 ち ょ う ど 1 個のグ リ フ に対応する通常のキ ャ ラ ク タ 1 キ ャ ラ ク タ 列 (合字な ど) の先頭 以下の種別は、 ページ上のグ リ フ には対応 し ない擬似キ ャ ラ ク タ を記述 し ます。 x ・ y フ ィ ール ド は、 最近の本当のキ ャ ラ ク タ の終了点を表 し 、 width フ ィ ール ド は 0 にな り 、 こ れ以外の uv を除 く すべてのフ ィ ール ド は、 最近の本当のキ ャ ラ ク タ に対応する値を と り ます : 10 キ ャ ラ ク タ 列 (合字な ど) のつづ き 11 (非推奨。 使われていません) 12 挿入 さ れた単語 ・ 行 ・ 区域区切 り キ ャ ラ ク タ 11.8 テキス ト ・ メ ト リ ク ス抽出関数 177 表 11.13 TET_char_info 構造の メ ンバ (C ・ C++) と 、 同等のパブ リ ッ ク フ ィ ール ド (Java ・ PHP) ・ キー (Perl) ・ プ ロパテ ィ (COM ・ .NET)、 およびその型 と 意味の一覧。 詳 し く は ?Glyph metrics?, page 68 を参照。 プロパテ ィ / フ ィ ール ド 名 説明 attributes (整数) グ リ フの属性を ビ ッ ト で表 し た もの。 組み合わせる こ と も で き ます : ビ ッ ト 0 視覚的または意味的な下付き ビ ッ ト 1 視覚的または意味的な上付き ビ ッ ト 2 ド ロ ッ プキ ャ ッ プキ ャ ラ ク タ (段落先頭の大き いキ ャ ラ ク タ ) ビ ッ ト 3 こ のグ リ フの、 グ リ フ または単語ベースの影重複は除去済 ビ ッ ト 4 グ リ フは、 ハイ フ ン区切 り 箇所直前のキ ャ ラ ク タ を表す ビ ッ ト 5 contentanalysis={keephyphenglyphs=true} が指定 さ れた場合以外除去 さ れたハイ フ ン区 切 り アーテ ィ フ ァ ク ト (すなわちハイ フ ンキ ャ ラ ク タ ) ビ ッ ト 6 グ リ フは、 ハイ フ ン区切 り 箇所直後のキ ャ ラ ク タ を表す unknown (論理値。 C ・ C++ では整数) 通常は false (0) ですが、 元のグ リ フが Unicode へマ ッ プ で きずに、 unknownchar と し て指定 さ れたキ ャ ラ ク タ へ置き換え られた場合には true ( 1 ) にな り ます。 x, y (double) グ リ フの参照点の位置。 こ の参照点は、 横書き ではグ リ フ 枠の左下隅であ り 、 縦書き で は上端中央の点です。 擬似キ ャ ラ ク タ については この x ・ y 座標は、 最近のキ ャ ラ ク タ の終了点の 座標にな り ます。 width (double) 対応するグ リ フの幅 (横書き で も縦書き で も )。 擬似キ ャ ラ ク タ については こ の幅は 0 に な り ます。 alpha (double) イ ン ラ イ ン テキス ト 進行の向き を度単位で反時計回 り に測 っ た も の。 横書きの場合には こ れはテキス ト のベース ラ イ ンの向き であ り 、 縦書きの場合には こ れは標準 -90°向き に対する角 度です。 この角度は範囲 -180°< alpha ≦ +180°内にな り ます。 標準的な横書き テキス ト で も、 縦書きの標準的テキス ト で も、 こ の角度は 0°にな り ます。 beta (double) テキス ト 斜形化角度を度単位で (反時計回 り )、 alpha の垂線に対 し て測 っ た も の。 こ の 角度は、 正立テキス ト については 0°にな り 、 斜体にな っ た (斜形化 さ れた) テキス ト については 負にな り ます。 この角度は範囲 -180°< beta ≦ +180°にな り ますが、 ただ し ± 90°以外の値を と り ます。 abs(beta) > 90°な ら、 そのテキス ト はベース ラ イ ン で反転 さ れています。 fontid (整数) fonts[ ] 擬似オブ ジ ェ ク ト 内における フ ォ ン ト の番号 (pCOS リ フ ァ レ ン ス参照)。 fontid が 負にな る こ と はあ り ません。 fontsize (double) 文字のサイ ズ (つねに正)。 こ の値 と 、 グ リ フの実際の高 さ と の比は固定ではな く 、 フ ォ ン ト デザイ ン によ っ て変動する可能性があ り ます。 多 く のフ ォ ン ト では、 文字サイ ズは、 すべて のアセ ン ダ (ア ク セ ン ト 付き キ ャ ラ ク タ も含め) と デ ィ セ ン ダ を包含する よ う に選ばれています。 textrendering (整数) テキス ト 表現モー ド : 0 テキス ト を塗る 1 テキス ト (輪郭) を描線 2 テキス ト を塗っ て描線 3 不可視テキス ト ( し ば し ば OCR の結果に対 し て用い ら れる) 4 テキス ト を塗っ て、 それを ク リ ッ ピ ングパスに追加 5 テキス ト を描線 し 、 それを ク リ ッ ピ ングパスに追加 6 テキス ト を塗っ て描線 し 、 それを ク リ ッ ピ ングパスに追加 7 テキス ト を ク リ ッ ピ ングパスに追加 178 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 11.9 画像抽出関数 C++ const TET_image_info *get_image_info(int page) C# Java int get_image_info(int page) Perl PHP object image_info TET_get_image_info(long page) VB RB Function get_image_info(int page) As Long C const TET_image_info *TET_get_image_info(TET *tet, int page) ページ上の、 次の画像に関する情報を取得 し ます (ただ し ピ ク セルデー タ 本体は取得 し ま せん)。 page TET_open_page( ) で得 ら れた有効なページハン ド ル。 戻り値 画像が も う 得 ら れない と き は、 バ イ ンデ ィ ン グ依存の値が返 さ れ ま す。 そ う でない と き は、 画像の詳細がバ イ ンデ ィ ン グ依存の形で利用で き ます。 詳 し く は、 後述のバイ ンデ ィ ングの項を参照 し て く だ さ い。 詳細 こ の関数は、 与え ら れたページハン ド ルに関連付け ら れてい る 次の画像へ進み (画像が も う ない と き は 0 か NULL を返 し ます)、 こ の画像についての詳 し い情報を提供 し ます。 こ の関数は、 画像連結機構に よ っ て生成 さ れた擬似画像を も 返 し ます。 し か し 、 擬似画像を 生成す る ために用い ら れた消費済画像は返 さ れません。 構造ま たはプ ロ パテ ィ / フ ィ ール ド 内の画像詳細は、 同 じ ページハン ド ルで次に TET_ get_image_info( ) か TET_close_page( ) を呼び出す (先に行な っ たほ う ) ま で有効です。 画 像情報プ ロ パテ ィ / フ ィ ール ド のセ ッ ト は、TET オブジ ェ ク ト ご と にただ 1 個 し かあ り ま せんので、 同 じ ページについてであれ、 別のページについてであれ、 別の文書についてで あれ、再び TET_get_image_info( ) を呼び出す前に ク ラ イ ア ン ト 側ですべての画像情報を取 得 し てお く 必要があ り ます。 バインディング C ・ C++ 言語バ イ ンデ ィ ン グ : ページ上で画像が も う 得 ら れない と き は、 NULL ポ イ ン タ が返 さ れ ま す。 そ う でない と き は、 画像に関す る 情報を内容 と し て持つ TET_image_info 構造へのポ イ ン タ が返 さ れます。 こ のデー タ 構造の メ ンバについては表 11.14 で説明 し ま す。 COM ・ Java ・ .NET 言語バ イ ンデ ィ ン グ : ページ上で画像が も う 得 ら れない と き は、 -1 が 返 さ れます。 そ う でない と き は 1 が返 さ れます。 個々の画像情報は、 表 11.14 に従っ た TET プ ロ パテ ィ / フ ィ ール ド か ら 取得す る こ と がで き ます。 関数が -1 を返 し たに も かか わ ら ずプ ロ パテ ィ / フ ィ ール ド の値を見た場合には、 いずれ も 値 -1 を と り ます。 Perl ・ Python 言語バ イ ンデ ィ ン グ : ページ上で画像が も う 得 ら れない と き は、 0 が返 さ れ ます。 そ う でない と き は、 表 11.14 に挙げ る キー群を含むハ ッ シ ュ が返 さ れます。 個々の 画像情報は、 こ のハ ッ シ ュ 内のキーに よ っ て取得す る こ と がで き ます。 REALbasic バ イ ンデ ィ ン グ : ページ上で画像が も う 得 ら れない と き は、 nil が返 さ れます。 そ う でない と き は、表 11.14 に挙げ る メ ンバ群を含む TET_image_info オブジ ェ ク ト が返 さ れます。 個々の画像情報は、 こ のオブジ ェ ク ト 内の メ ンバに よ っ て取得す る こ と がで き ま す。 PHP 言語バ イ ンデ ィ ン グ : ページ上で画像が も う 得 ら れない と き は、 空 (ヌ ル) オブジ ェ ク ト が返 さ れます。 そ う でない と き は、 型 TET_image_info のオブジ ェ ク ト が返 さ れます。 個々の画像情報は、 表 11.14 に従っ てその フ ィ ール ド か ら 取得する こ と がで き ます。 画像 11.9 画像抽出関数 179 情報オブジ ェ ク ト 内の整数フ ィ ール ド は、 PHP 言語バ イ ンデ ィ ン グでは long と し て実装 さ れてい ます。 表 11.14 TET_image_info 構造の メ ンバ (C ・ C++) と 、 同等のパブ リ ッ ク フ ィ ール ド (Java ・ PHP) ・ キー (Perl) ・ プ ロパテ ィ (COM ・ .NET)、 およびその型 と 意味の一覧。 詳 し く は ?Image Extraction Basics?, page 107 を参照。 プロパテ ィ / フ ィ ール ド 名 説明 x, y (double) 画像の参照点の位置。 参照点は画像の左下隅です。 width, height (double) ページ上の画像の幅 と 高 さ をポ イ ン ト 単位で、 画像の辺に沿っ て測っ た もの。 alpha (double) ピ ク セル行の向き。 この角度は範囲 -180°< alpha ≦ +180°内にな り ます。 正立画像に ついては alpha は 0°にな り ます。 beta (double) ピ ク セル列の向き を、 alpha の垂線に対 し て測っ た もの。 この角度は範囲 -180°< beta ≦ +180°にな り ますが、 ただ し ± 90°以外の値を と り ます。 正立画像については beta は -90°< beta < +90°にな り ます。 abs(beta) > 90°な ら 、 その画像はベース ラ イ ン で反転 さ れてい ます。 imageid (整数) pCOS 擬似オブ ジ ェ ク ト images[ ] 内における画像の番号。 この擬似オブ ジ ェ ク ト 内の項目 群を通 じ て、 詳細な画像プ ロパテ ィ を取得する こ と がで き ます (pCOS リ フ ァ レ ン ス参照)。 (Double) Width and height of the image on the page in points, measured along the image's edges C++ int write_image_file(int doc, int imageid, string optlist) C# Java int write_image_file(int doc, int imageid, String optlist) Perl PHP long write_image_file(long doc, long imageid, string optlist) VB RB Function write_image_file(doc As Long, imageid As Long, optlist As String) As Long C int TET_write_image_file(TET *tet, int doc, int imageid, const char *optlist) 画像デー タ をデ ィ ス クへ書き出 し ます。 doc TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 imageid 画像の pCOD ID。 こ の ID は、 TET_get_image_info( ) を呼び出 し て成功 し た後に imageid フ ィ ール ド か ら 、 あ る いは、 images 擬似オブジ ェ ク ト 内のすべての項目を なめ る ( こ の配列内には length:images 項目があ り ます) こ と に よ っ て取得す る こ と がで き ます。 optlist 表 11.15 に従っ て画像関連オプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト 。 右記のオ プシ ョ ンが使え ます : compression ・ filename ・ keepxmp ・ typeonly。 戻り値 エ ラ ー時には -1、 そ う でないな ら 0 よ り 大き な値。 -1 が返 さ れた場合には、 TET_get_ errmsg( ) を呼び出 し てエ ラ ーの詳細を知 る こ と を推奨 し ます。エ ラ ーの場合には何の画像 出力 も 生成 さ れません。 まれにあ る 非対応の形式の画像の場合 も 、 エ ラ ー と し て報告 さ れ ます。 戻 り 値が -1 以外の場合には、 その戻 り 値が示すフ ァ イ ル形式でその画像を抽出で き る こ と を示 し ます : > -1: エ ラ ー発生。 何の画像 も 抽出 さ れません > 10 : 画像は TIFF (.tif) と し て抽出 さ れた > 20 : 画像は JPEG (.jpg) と し て抽出 さ れた > 30 : 画像は JPEG 2000 (.jpx) と し て抽出 さ れた > 40 : 画像は raw ピ ク セルデー タ (.raw) と し て抽出 さ れた 180 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 詳細 こ の関数は、 指定 し た pCOS ID を持つ画像に対す る ピ ク セルデー タ を、 い く つかの画像 形式の 1 つへ変換 し 、 その結果をデ ィ ス ク フ ァ イ ルへ書 き 出 し ます。 typeonly オプシ ョ ン を与えた場合は、 画像の種別だけが返 さ れ、 画像フ ァ イ ルは生成 さ れません。 バインディング C ・ C++ : 戻 り 値のためのマ ク ロ が tetlib.h 内で得 ら れます。 表 11.15 TET_write_image_file( ) ・ TET_get_image_data( ) のオプ シ ョ ン一覧 オプ シ ョ ン 説明 compression (キーワー ド ) ピ ク セルデー タ を圧縮する ためのアルゴ リ ズム (デ フ ォ ル ト : auto) : auto 適切な圧縮アルゴ リ ズムを自動的に選択 し ます。 none (TIFF 画像の場合のみ意味を持ち ます) 可能な らば一切圧縮な し で ピ ク セルデー タ を書 き出 し ます。 filename1 (文字列。 typeonly も与え ていないかぎ り 必須) デ ィ ス ク 上の画像フ ァ イルの名前。 こ の filename に、 画像 フ ァ イル形式を示す接尾辞が追加 さ れます。 TETML 内の Image/@id attribute 属性にマ ッ チする ため、 下記の フ ァ イル名パ タ ーン を推奨 し ま す: I<imageid> こ こ で imageid は、 imageid 引数の 10 進表現です。 keepxmp (論理値) true の場合、 かつ、 その画像が PDF 内で関連付け られた XMP メ タ デー タ を持 っ ている 場合には、 抽出 さ れる TIFF ・ JPEG 画像内にその メ タ デー タ が埋め込まれます。 デ フ ォル ト : true typeonly1 (論理値) 与えたオプ シ ョ ンに従 っ て画像種別が決定 さ れますが、 画像 フ ァ イルは書き出 さ れませ ん。 TET_get_image_data( ) 自体は画像種別を返 さ ないので、 こ れは、 それが返 し た画像の種別を 決定する ために有用です。 デ フ ォル ト : false 1. TET_write_image_file( ) のみ C++ const char *get_image_data(int doc, size_t *length, int imageid, string optlist) C# Java final byte[ ] get_image_data(int doc, int imageid, String optlist) Perl PHP string get_image_data(long doc, long imageid, string optlist) VB RB Function get_image_data(doc As Long, imageid As Long, optlist As String) C const char * TET_get_image_data(TET *tet, int doc, size_t *length, int imageid, const char *optlist) 画像デー タ を メ モ リ か ら抽出 し ます。 doc TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 length (C ・ C++ 言語バ イ ンデ ィ ン グのみ) 返 さ れ る デー タ の長 さ がバ イ ト 単位で格納 さ れ る メ モ リ 位置への C ス タ イ ルポ イ ン タ 。 imageid 画像の pCOS ID。 こ の ID は、 TET_get_image_info( ) を呼び出 し て成功 し た後に imageid フ ィ ール ド か ら 、 あ る いは、 images pCOS 配列内のすべての項目を なめ る ( こ の 配列内には length:images 項目があ り ます) こ と に よ っ て取得する こ と がで き ます。 optlist 表 11.15 に従っ て画像関連オプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト 。 右記のオ プシ ョ ンが使え ます : compression ・ keepxmp。 戻り値 指定 し たオプシ ョ ン群に従っ て画像を表現 し たデー タ 。 エ ラ ーの場合には (画像が抽出で き ない場合 も 含め)、 C ・ C++ では NULL ポ イ ン タ が返 さ れ、 それ以外の言語バ イ ンデ ィ ン 11.9 画像抽出関数 181 グでは空デー タ が返 さ れます。 エ ラ ーが発生 し た場合には、 TET_get_errmsg( ) を呼び出 し てエ ラ ーの詳細を知 る こ と を推奨 し ます。 詳細 こ の関数は、 指定 し た pCOS ID を持つ画像に対す る ピ ク セルデー タ を、 い く つかの画像 形式の 1 つへ変換 し 、 そのデー タ を メ モ リ 内で利用可能に し ます。 バインディング COM : 多 く の ク ラ イ ア ン ト プ ロ グ ラ ムでは、 Variant 型を用いて画像デー タ を保持 し ます。 C ・ C++ 言語バ イ ンデ ィ ン グ : 返 さ れたデー タ バ ッ フ ァ は、 次に こ の関数を呼び出すま で 使え ます。 REALbasic : 結果は、 エン コ ーデ ィ ン グ -1 (バ イ ナ リ デー タ ) を持つ REALbasic 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 空文字列が返 さ れます。 182 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス 11.10 TET マー ク ア ッ プ言語 (TETML) 関数 C++ int process_page(int doc, int pagenumber, string optlist) C# Java int process_page(int doc, int pagenumber, String optlist) Perl PHP long process_page(long doc, long pagenumber, string optlist) VB RB Function process_page(doc As Long, pagenumber As Long, optlist As String) As Int C int TET_process_page(TET *tet, int doc, int pagenumber, const char *optlist) ページ を処理 し て TETML 出力を生成 し ます。 doc TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 pagenumber 処理 し たいページの物理的番号。 最初のページ をページ番号 1 と し ます。 総ペー ジ 数 は、 TET_pcos_get_number( ) と pCOS パ ス length:pages で 取得 で き ま す。 trailer=true の場合、 こ の pagenumber 引数は 0 にす る こ と も で き ます。 optlist 以下のグループ内のオプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト : > 表11.8 に従っ た一般的なページ関連オプシ ョ ン( こ れ ら は pagenumber=0 の場合には無 視 さ れます) : clippingarea ・ contentanalysis ・ excludebox ・ fontsizerange ・ granularity ・ ignoreinvisibletext ・ imageanalysis ・ includebox ・ layoutanalysis ・ skipengines > 表 11.16 に従っ た処理詳細を指定す る オプシ ョ ン : tetml 表 11.16 TET_process_page( ) の追加オプ シ ョ ン オプ シ ョ ン 説明 tetml (オプ シ ョ ン リ ス ト ) TETML の詳細を制御 し ます。 以下のオプ シ ョ ンが使え ます : elements (オプ シ ョ ン リ ス ト ) オプ シ ョ ナルな TETML 要素を指定 し ます : line (granularity=word の場合のみ) true の場合、 TETML 出力は、 Para レ ベル と Word レ ベルの間に Line 要素を含みます。 デ フ ォル ト : false glyphdetails (オプ シ ョ ン リ ス ト 。 granularity=glyph ・ word の場合のみ) 各 Glyph 要素に対 し て、 ど のグ リ フ 属性が報告 さ れるかを指定 し ます (すべてのサブオプ シ ョ ンのデ フ ォ ル ト : false) : all (論理値) すべての属性サブオプ シ ョ ン を有効に し ます dehyphenation (論理値) 属性 dehyphenation を出力する こ と に よ っ て、 ハイ フ ン区切 り さ れた単語を示 し ます。 dropcap (論理値) 属性 dropcap を出力する こ と に よ っ て、 単語の先頭の大き なキ ャ ラ ク タ を示 し ます。 geometry (論理値) 属性 x ・ y ・ width ・ alpha ・ beta を出力 し ます。 font (論理値) 属性 font ・ fontsize ・ textrendering ・ unknown を出力 し ます。 sub (論理値) 属性 sub を出力する こ と に よ っ て、 下付き を示 し ます。 sup (論理値) 属性 sup を出力する こ と に よ っ て、 上付き を示 し ます。 trailer (論理値) true の場合には、 文書 ト レー ラ デー タ が、 すなわち最終ページの後のデー タ が出力 さ れます ( こ れ以前に出力 さ れたページ固有デー タ に こ れを連結する必要があ り ます)。 こ のオプ シ ョ ンは、 ト レー ラ デー タ を出力する ために、 こ の関数を最後に呼び 出す際に必要です。 pagenumber=0 の場合には、 ト レー ラ デー タ のみが (ページ固有 デー タ な し で) 出力 さ れます。 trailer=true を与えた後は、 その同 じ 文書に対 し てはも う TET_process_page( ) を呼び出 し てはいけません。 デ フ ォル ト : false 11.10 TET マー ク ア ッ プ言語 (TETML) 関数 183 戻り値 エ ラ ー時には -1、そ う でないな ら 1。ただ し TETML モー ド では、問題は TETML の Exception 要素内で報告 さ れますので、 こ の関数はつねに成功 し ます。 詳細 こ の関数はページ を開 き 、 TET_open_document*( ) に与えた形式関連オプシ ョ ン群に従っ て出力を生成 し て、 ページ を閉 じ ます。 生成 さ れたデー タ は、 TET_get_xml_data( ) で取得 す る こ と がで き ます。 こ の関数は、 対応す る TET_open_document*( ) への呼び出 し でオプシ ョ ン tetml を与え た場合にのみ呼び出す必要があ り ます。 ヘ ッ ダデー タ は、 すなわち、 先頭ページの前の文 書固有デー タ は、 TET_open_document*( ) に よ っ て、 先頭ページデー タ の前に生成 さ れ ま す。 こ れは、 TET_process_page( ) を初めて呼び出す前に TET_get_xml_data( ) を呼び出す こ と に よ っ て別個に取得す る こ と も で き ます し 、ページ関連デー タ と 組み合わせて取得す る こ と も で き ます。 ト レー ラ デー タ 、 すなわち、 最終ページの後の文書固有デー タ は、 文書に対 し て こ の 関数を最後に呼び出す際に trailer サブオプシ ョ ン で要求す る 必要があ り ます。 ト レー ラ デー タ は、 最終ペー ジ の 後 に 別個 の 呼び出 し を 行 な っ て 生成す る こ と も で き ま す し (pagenumber=0)、最終ページ と 一緒に生成す る こ と も で き ます (pagenumber は 0 以外)。 ページ群は任意の順序で抽出す る こ と がで き 、 ま た、 文書のページ群の任意の部分集合を 抽出す る こ と がで き ます。 ト レー ラ を取得せずに TET_close_document( ) を呼び出す と エ ラ ーにな り ます。 ト レー ラ を取得 し た後に TET_process_page( ) を呼び出 し て も エ ラ ーにな り ます。 C++ const char *get_xml_data(int doc, size_t *length, string optlist) C# Java final byte[ ] get_xml_data(int doc, String optlist) Perl PHP string get_xml_data(long doc, string optlist) VB RB Function get_xml_data(doc As Long, optlist As String) C const char * TET_get_xml_data(TET *tet, int doc, size_t *length, const char *optlist) TETML デー タ を メ モ リ から取得 し ます。 doc TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 length (C ・ C++ 言語バ イ ンデ ィ ン グのみ) 返 さ れ る 文字列の長 さ をバ イ ト 単位で保持す る 変数へのポ イ ン タ 。 length は終端ヌ ルバ イ ト を勘定 し ません。 optlist (現在、 使え る オプシ ョ ンはあ り ません。) 戻り値 指定 し たオプシ ョ ン群に従っ た、 次のデー タ 断片を内容 と し て持つバ イ ト 配列。 バ ッ フ ァ が空の場合には、 空文字列が返 さ れます (C では NULL ポ イ ン タ かつ *len=0)。 詳細 184 こ の関数は、 TET_open_document*( ) と 、 1 回ない し 複数回の TET_process_page( ) への呼び 出 し に よ っ て生成 さ れた TETML デー タ を取得 し ます。 TETML デー タ は、 outputformat オプシ ョ ンにかかわ ら ず、 つねに UTF-8 で符号化 さ れてい ます。 内部バ ッ フ ァ は こ の呼 び出 し に よ っ て ク リ ア さ れ ま す。 TET_process_page( ) を 呼び出す た びに TET_get_xml_ data( ) を呼び出す必要はあ り ません。 ク ラ イ ア ン ト 側では、 1 個ない し 複数のページに対 す る 、 ない し 文書全体に対す る デー タ をバ ッ フ ァ 内に蓄積 し てお く こ と が可能です。 TETML モー ド では、 TET_close_document( ) の前に こ の関数を少な く と も 1 回呼び出す 必要があ り ます。 でない と デー タ は利用で き な く な っ て し ま い ます。 TET_get_xml_data( ) を ち ょ う ど 1 回だけ呼び出す場合には (その よ う な ただ 1 回呼び出 し は、 TET_process_ 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス page( ) への最後の呼び出 し と TET_close_document( ) と の間に行 う 必要があ り ます)、 バ ッ フ ァ は文書全体に対す る 整形式 TETML 文書を内容 と し て持っ てい る こ と が保証 さ れ ま す。 こ の関数は、 TET_open_document*( ) の tetml オプシ ョ ンに filename サブオプシ ョ ン を与えた場合には呼び出 し てはいけ ません。 バインディング C ・ C++ 言語バ イ ンデ ィ ン グ : 結果は、 ヌ ル終端 UTF-8 と し て提供 さ れます。 i5/iSeries ・ zSeries では、EBCDIC 符号化 さ れた UTF-8 が返 さ れます。返 さ れたデー タ バ ッ フ ァ は、次 に TET_get_xml_data( ) を呼び出す時ま で使え ます。 Java ・ .NET バ イ ンデ ィ ン グ : 結果は、 UTF-8 デー タ を内容 と し て持つバ イ ト 配列 と し て 提供 さ れます。 COM:多 く の ク ラ イ ア ン ト プ ロ グ ラ ムは、Variant 型を用いて UTF-8 デー タ を保持 し ます。 REALbasic : 結果は、 エン コ ーデ ィ ン グ UTF-8 の REALBasic String と し て返 さ れます。 PHP 言語バ イ ンデ ィ ン グ : 結果は、 UTF-8 文字列 と し て提供 さ れます。 Python : 結果は、 8 ビ ッ ト 文字列 と し て返 さ れます (Python 3 : bytes)。 RPG 言語バ イ ンデ ィ ン グ : 結果は、 ヌ ル終端 EBCDIC UTF-8 と し て返 さ れます。 11.10 TET マー ク ア ッ プ言語 (TETML) 関数 185 11.11 pCOS 関数 PDF か ら オブジ ェ ク ト デー タ を取得す る ための完全な pCOS 文法が使え ます。詳 し い説明 は、 別の文書 と し て あ る pCOS リ フ ァ レ ン ス を参照 し て く だ さ い。 C++ double pcos_get_number(int doc, string path) C# Java double pcos_get_number(int doc, String path) Perl PHP float pcos_get_number(int doc, String path) VB RB Function pcos_get_number(doc as Long, path As String) As Double C double TET_pcos_get_number(TET *tet, int doc, const char *path, ...) 数値型か論理型の pCOS パスの値を得ます。 Get the value of a pCOS path with type number or boolean. doc TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 path 数値ま たは論理値オブジ ェ ク ト への完全 pCOS パス。 追加引数 (C 言語バ イ ンデ ィ ン グのみ) 任意の数の追加引数を、 key 引数がそれに対応 す る プ レース ホルダ を含んでい る 場合には (文字列には %s、 整数には %d。 %% と す る と パーセ ン ト 記号 1 個)、 与え る こ と がで き ます。 こ れ ら の引数を利用すれば、 可変の数値 や文字列値を含む複雑なパ ス を明示的に組み立て る 手間が省け ます。プ レース ホルダの数 と 型が、 与え る 追加引数 と 一致す る よ う にする のは、 ク ラ イ ア ン ト 側の役割です。 戻り値 pCOS パス に よ っ て特定 さ れたオブジ ェ ク ト の数値。 論理値の場合は、 それが true な ら ば 1 が返 さ れ、 そ う でないな ら 0 が返 さ れます。 C++ string pcos_get_string(int doc, string path) C# Java String pcos_get_string(int doc, String path) Perl PHP String pcos_get_string(int doc, String path) VB RB Function pcos_get_string(doc as Long, path As String) As String C const char *TET_pcos_get_string(TET *tet, int doc, const char *path, ...) 名前型 ・ 文字列型 ・ 論理型のいずれかの pCOS パスの値を得ます。 doc path TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 文字列 ・ 名前 ・ 論理値のいずれかのオブジ ェ ク ト への完全 pCOS パス。 追加引数 (C 言語バ イ ンデ ィ ン グのみ) 任意の数の追加引数を、 key 引数がそれに対応 す る プ レース ホルダ を含んでい る 場合には (文字列には %s、 整数には %d。 %% と す る と パーセ ン ト 記号 1 個)、 与え る こ と がで き ます。 こ れ ら の引数を利用すれば、 可変の数値 や文字列値を含む複雑なパ ス を明示的に組み立て る 手間が省け ます。プ レース ホルダの数 と 型が、 与え る 追加引数 と 一致す る よ う にする のは、 ク ラ イ ア ン ト 側の役割です。 戻り値 pCOS パス に よ っ て特定 さ れたオブジ ェ ク ト の値を持つ文字列。 論理値の場合は、 文字列 true か false が返 さ れます。 詳細 186 こ の関数は、 pCOS が フルモー ド で動作 し てお ら ず、 かつオブジ ェ ク ト が文字列型の場合 には、 例外を発生 さ せます (pCOS リ フ ァ レ ン ス参照)。 例外 と し て、 オブジ ェ ク ト /Info/ 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス * (文書情報キー群) は制限 pCOS モー ド で も nocopy=false か plainmetadata=true な ら ば 取得す る こ と がで き 、 ま た、 bookmarks[...]/Title と pages[...]/Annots/Contents は制限 pCOS モー ド で も nocopy=false な ら ば取得で き ます。 こ の関数は、PDF 文書か ら 取得す る 文字列がテ キ ス ト 文字列であ る と 前提 し てい ます。 バ イ ナ リ デー タ を内容 と し て持つ文字列オブジ ェ ク ト は、 こ れに換え て、 デー タ にいかな る 変更を も 加え ない TET_pcos_get_stream( ) で取得する べき です。 バインディング C バ イ ンデ ィ ン グ :返 さ れ る 文字列は、最大 10 項目を持つ リ ン グバ ッ フ ァ 内に格納 さ れま す。 10 個を超え る 文字列が取得 さ れた と き には、 バ ッ フ ァ は再利用 さ れますので、 10 個 を超え る 文字列を同時に利用 し たい場合には、 ク ラ イ ア ン ト 側でその文字列を複製 し てお く 必要があ り ます。 た と えば、 printf( ) 文の引数では こ の関数を最大 10 回ま で呼び出す こ と がで き ます。 同時に 10 個を超え る 文字列が使用 さ れないな ら ば、 その戻 り 文字列は互 いに独立であ る こ と が保証 さ れてい る か ら です。 C ・ C++ 言語バ イ ンデ ィ ン グ : 文字列は、 BOM な し UTF-8 形式で返 さ れます。 COM : 結果は、 UTF-16 形式の Unicode 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 空文字列が返 さ れます。 Java ・ .NET ・ Python : 結果は、 Unicode 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 ヌ ルオブジ ェ ク ト が返 さ れます。 Perl ・ PHP 言語バ イ ンデ ィ ン グ : 結果は、 UTF-8 文字列 と し て提供 さ れます。 テ キ ス ト が も う 得 ら れない と き は、 ヌ ルオブジ ェ ク ト が返 さ れます。 RPG 言語バ イ ンデ ィ ン グ : 結果は、 UTF-8 文字列 と し て提供 さ れます。 C++ const unsigned char *pcos_get_stream(int doc, int *length, string optlist, string path) C# Java final byte[ ] pcos_get_stream(int doc, String optlist, String path) Perl PHP String pcos_get_stream(int doc, String optlist, String path) VB RB Function pcos_get_stream(doc as Long, optlist As String, path As String) C const unsigned char *TET_pcos_get_stream(TET *tet, int doc, int *length, const char *optlist, const char *path, ...) stream 型 ・ fstream 型 ・ 文字列型のいずれかの pCOS パスの値を得ます。 doc TET_open_document*( ) で得 ら れた有効な文書ハン ド ル。 length (C ・ C++ 言語バ イ ンデ ィ ン グのみ) 返 さ れ る ス ト リ ームデー タ の長 さ をバ イ ト 単 位で受け取 る 変数へのポ イ ン タ 。 optlist path 表 11.17 に従っ て ス ト リ ーム取得オプシ ョ ン群を指定 し たオプシ ョ ン リ ス ト 。 ス ト リ ーム ま たは文字列オブジ ェ ク ト への完全 pCOS パ ス。 追加引数 (C 言語バ イ ンデ ィ ン グのみ) 任意の数の追加引数を、 key 引数がそれに対応 す る プ レース ホルダ を含んでい る 場合には (文字列には %s、 整数には %d。 %% と す る と パーセ ン ト 記号 1 個)、 与え る こ と がで き ます。 こ れ ら の引数を利用すれば、 可変の数値 や文字列値を含む複雑なパ ス を明示的に組み立て る 手間が省け ます。プ レース ホルダの数 と 型が、 与え る 追加引数 と 一致す る よ う にす る のは、 ク ラ イ ア ン ト 側の役割です。 戻り値 ス ト リ ーム ま たは文字列の中に含まれた非暗号化デー タ 。 ス ト リ ーム ま たは文字列が空の 場合には、 返 さ れ る デー タ は空にな り ます (C ・ C++ では NULL)。 11.11 pCOS 関数 187 オブジ ェ ク ト が stream 型の場合には、 keepfilter=true でないかぎ り 、 すべての フ ィ ル タ が ス ト リ ーム内容か ら 除去 さ れます (すなわち、生デー タ 本体が返 さ れます)。オブジ ェ ク ト が fstream 型か文字列型の場合には、 PDF フ ァ イ ル内で見つかっ た と お り のデー タ が その ま ま届け ら れますが、ただ し 例外 と し て ASCII85・ASCIIHex フ ィ ル タ は除去 さ れます。 デー タ の解凍 と ASCII フ ィ ル タ の除去に加え て、 convert オプシ ョ ンに従っ てテ キ ス ト 変換が適用 さ れ る 場合 も あ り ます。 詳細 こ の関数は、 pCOS が フルモー ド で動作 し ていない と き には例外を発生 さ せます (pCOS リ フ ァ レ ン ス参照)。 例外 と し て、 オブジ ェ ク ト /Root/Metadata は制限 pCOS モー ド で も nocopy=false か plainmetadata=true な ら ば取得する こ と がで き ます。 パス が stream 型 ・ fstream 型 ・ 文字列型のいずれかのオブジ ェ ク ト を指 し 示 し ていない場合に も 、 例外が発 生 し ます。 こ の関数は、 その名前に も かかわ ら ず、 文字列型のオブジ ェ ク ト を取得す る ために使 う こ と も で き ます。 オブジ ェ ク ト を テ キ ス ト 文字列 と し て扱 う TET_pcos_get_string( ) と 違っ て、 こ の関数は、 返 さ れたデー タ に対 し ていかな る 変更を も 加え ません。 バ イ ナ リ 文 字列デー タ は PDF 内でめっ たに用い ら れませんので、 自動的には き ちん と 検出で き ませ ん。 文字列オブジ ェ ク ト をバ イ ナ リ デー タ と し て取得す る か、 それ と も テ キ ス ト と し て取 得す る のかを決め る のは、 し たがっ てユーザー側の役割です。 バインディング COM : 多 く の ク ラ イ ア ン ト プ ロ グ ラ ムは、 Variant 型を用いて ス ト リ ーム内容を保持 し ま す。 COM に よ る JavaScript は、 返 さ れたバ リ ア ン ト 配列の長 さ を取得す る こ と を許 し ま せん ( し か し こ れは他の言語 と COM では動作 し ます)。 C ・ C++ 言語バ イ ンデ ィ ン グ : 返 さ れたデー タ バ ッ フ ァ は、 次に こ の関数を呼び出すま で 使え ます。 Python : 結果は、 8 ビ ッ ト 文字列 と し て返 さ れます (Python 3 : bytes)。 注記 この関数を利用する と 、PDF に埋め込まれてい る フ ォ ン ト デー タ を取得する こ と がで き ま す。 ユーザーは、 フ ォ ン ト は各 フ ォ ン ト ベン ダの使用許諾の対象であ り 、 それぞれの知的 所有権保有者の明示的許諾な し では再利用 し てはな ら ない と い う 事実に留意 し て く だ さ い。 お使いの フ ォ ン ト ベン ダに連絡 し て、 関連する ラ イ セ ン ス契約を協議 し て く だ さ い。 表 11.17 TET_pcos_get_stream( ) のオプ シ ョ ン一覧 オプ シ ョ ン 説明 convert (キーワー ド 。 非対応フ ィ ル タ で圧縮 さ れている ス ト リ ームに対 し ては無視 さ れます) 文字列ま た はス ト リ ーム内容が変換 さ れるかど う かを制御 し ます (デ フ ォル ト : none) : none 内容をバイ ナ リ デー タ と し て扱い、 何の変換も 行いません。 unicode 内容を テキス ト デー タ と し て (すなわち、 TET_pcos_get_string( ) におけるの と 全 く 同 じ に) 扱い、 Unicode へ正規化 し ます。 非 Unicode 対応言語バイ ンデ ィ ングでは、 こ れは、 デー タ は BOM な し UTF-8 形式へ変換 さ れる こ と を意味 し ます。 こ のオプ シ ョ ンは、 め っ たに用い られない PDF 内のデー タ 型 「テキス ト ス ト リ ーム」 (た と えば こ れは JavaScript のために用い られる場合があ り ますが、 JavaScript のほ と んどはス ト リ ームオブ ジ ェ ク ト でな く 文字列オブ ジ ェ ク ト 内に入っ ています) のために 必要です。 keepfilter (論理値。 画像デー タ ス ト リ ームに対 し てのみ推奨 さ れます。 非対応フ ィ ル タ で圧縮 さ れている ス ト リ ームに対 し ては無視 さ れます) true の場合には、 ス ト リ ームデー タ は、 その画像の filterinfo 擬似オブ ジ ェ ク ト 内で指定 さ れている フ ィ ル タ で圧縮 さ れます (pCOS リ フ ァ レ ン ス参照)。 false の場合には、 ス ト リ ームデー タ は解凍 さ れます。 デ フ ォル ト : すべての非対応フ ィ ル タ に対 し て true、 それ以外には false 188 11 章 : TET ラ イ ブ ラ リ API リ フ ァ レ ン ス A TETラ イ ブ ラ リ ク イ ッ ク リ フ ァ レ ンス 以下の表に、 すべての TET API 関数の概観を示 し ます。 頭に (C) が付いてい る も のは、 関 数のC プ ロ ト タ イ プであ り 、Java言語バ イ ンデ ィ ン グでは利用で き ない こ と を意味 し ます。 セ ッ ト ア ッ プ関数 関数プ ロ ト タ イ プ (C) TET *TET_new(void) ページ 152 void delete( ) 152 PVF 関数 関数プ ロ ト タ イ プ void create_pvf(String filename, byte[] data, String optlist) ページ 152 int delete_pvf(String filename) 153 Unicode 変換関数 関数プ ロ ト タ イ プ ページ (C) const char *TET_utf8_to_utf16(TET *tet, const char *utf8string, const char *ordering, int *size) 154 (C) const char *TET_utf16_to_utf8(TET *tet, const char *utf16string, int len, int *size) 154 (C) const char *TET_utf32_to_utf16(TET *tet, const char *utf32string, int len, const char *ordering, int *size) 155 (C) const char *TET_utf8_to_utf32(TET *tet, const char *utf8string, const char *ordering, int *size) 155 (C) const char *TET_utf32_to_utf8(TET *tet, const char *utf32string, int len, int *size) 156 (C) const char *TET_utf16_to_utf32(TET *tet, const char *utf16string, int len, const char *ordering, int *size) 156 例外処理関数 関数プ ロ ト タ イ プ String get_apiname( ) ページ 157 String get_errmsg( ) 157 int get_errnum( ) 157 文書関数 関数プ ロ ト タ イ プ int open_document(String filename, String optlist) ページ 160 (C) int TET_open_document_callback(TET *tet, void *opaque, size_t filesize, size_t (*readproc)(void *opaque, void *buffer, size_t size), int (*seekproc)(void *opaque, long offset), const char *optlist) 166 void close_document(int doc) 166 A TET ラ イ ブ ラ リ ク イ ッ ク リ フ ァ レ ン ス 189 ページ関数 関数プ ロ ト タ イ プ int open_page(int doc, int pagenumber, String optlist) void close_page(int page) ページ 167 174 テキス ト ・ メ ト リ ッ ク 抽出関数 関数プ ロ ト タ イ プ String get_text(int page) int get_char_info(int page) ページ 175 176 画像抽出関数 関数プ ロ ト タ イ プ int get_image_info(int page) ページ 179 int write_image_file(int doc, int imageid, String optlist) 180 final byte[ ] get_image_data(int doc, int imageid, String optlist) 181 TET マー ク ア ッ プ言語 (TETML) 関数 関数プ ロ ト タ イ プ int process_page(int doc, int pagenumber, String optlist) final byte[ ] get_xml_data(int doc, String optlist) ページ 183 184 オ プ シ ョ ン処理 関数プ ロ ト タ イ プ void set_option(String optlist) ページ 150 pCOS 関数 関数プ ロ ト タ イ プ double pcos_get_number(int doc, String path) 190 ページ 186 String pcos_get_string(int doc, String path) 186 final byte[ ] pcos_get_stream(int doc, String optlist, String path) 187 A 章 : TET ラ イ ブ ラ リ ク イ ッ ク リ フ ァ レ ン ス B 更新履歴 本マニ ュ アルの更新履歴 日付 変更点 2010 年 7 月 27 日 > TET 4.0 に合わせて更新 2009 年 2 月 01 日 > TET 3.0 に合わせて更新 2008 年 1 月 16 日 > TET 2.3 に合わせてマニ ュ アル更新 2007 年 1 月 23 日 > TET 2.0 に合わせた小幅追補 2005 年 12 月 14 日 > TET 2.1.0 に合わせて追加 ・ 修正。 PHP ・ RPG 言語バイ ンデ ィ ングに関する記 2005 年 6 月 20 日 > TET 2.0.0 に合わせてマニ ュ アルを拡張 ・ 再構成 述を追加 2003 年 10 月 14 日 > TET 1.1 に合わせてマニ ュ アル更新 2002 年 11 月 23 日 > TET 1.0.2 に合わせて TET_open_doc_callback( ) の説明 と ページサイ ズ決定の 2002 年 4 月 4 日 > TET 1 に合わせて第 1 版 コ ー ド サン プルを追加 B 更新履歴 191 192 B 章 : 更新履歴 索引 A L API リ フ ァ レ ン ス 143 Lucene 検索エ ン ジ ン 47 B M BMP 92 BOM (Byte Order Mark) 92 MediaWiki 57 C C++ バイ ンデ ィ ング 31 codelist 108 COM バイ ンデ ィ ング 33 CSV 形式 139 C バイ ンデ ィ ング 29 D Dispose( ) 152 F float オプ シ ョ ン リ ス ト 内の 147 float ・ 整数値 オプ シ ョ ン リ ス ト 内の 148 FontReporter Plugin 13, 107 G glyphlist 110 glyphrule 111 granularity 83 H HTML コ ンバー タ (XSLT サン プル) 139 I IFilter Microsoft 製品用 54 J J2EE ア プ リ ケーシ ョ ンサーバ 34 Javadoc 35 Java バイ ンデ ィ ン グ 34 N .NET バイ ンデ ィ ング 36 O Oracle Text 51 P pCOS API 関数 186 イ ン タ フ ェ ース 141 ク ッ ク ブ ッ ク 17 PDF のバージ ョ ン 13 Perl バイ ンデ ィ ング 37 PHP バイ ンデ ィ ング 38 PUA 92 Python バイ ンデ ィ ング 40 R REALbasic バイ ンデ ィ ング 41 resourcefile パラ メ タ 63 RPG バイ ンデ ィ ング 42 S searchpath 62 Solr 検索サーバ 50 T tet.upr 63 TET_CATCH( ) 157 TET_close_document( ) 166 TET_close_page( ) 174 TET_create_pvf() 152 TET_delete( ) 152 TET_delete_pvf() 153 TET_EXIT_TRY( ) 29, 157 TET_get_apiname() 157 TET_get_char_info( ) 176 TET_get_errmsg( ) 157 索引 193 TET_get_errnum( ) 157 TET_get_image_data( ) 181 TET_get_image_info( ) 179 TET_get_text( ) 175 TET_get_xml_data( ) 184 TET_new( ) 152 TET_open_document( ) 160 TET_open_document_callback( ) 166 TET_open_page( ) 167 TET_pcos_get_number( ) 186 TET_pcos_get_stream( ) 187 TET_pcos_get_string( ) 186 TET_RETHROW( ) 157 TET_set_option( ) 150 TET_TRY( ) 157 TET_utf16_to_utf32() 156 TET_utf16_to_utf8( ) 154 TET_utf32_to_utf16() 155 TET_utf32_to_utf8() 156 TET_utf8_to_utf16( ) 154 TET_utf8_to_utf16() 155 TET_write_image_file( ) 180 TETML 123 TETML スキーマ 131 TETRESOURCEFILE 環境変数 63 TET コ ネ ク タ Lucene 用 47 MediaWiki 用 57 Microsoft 製品用 54 Oracle 用 51 Solr 用 50 TET コ マ ン ド ラ イ ン ツール 19 TET の機能 13 TET ク ッ ク ブ ッ ク 17 TET プ ラ グ イ ン Adobe Acrobat 用 45 TeX 文書 68 ToUnicode CMap 109 U Unichar 値 オプ シ ョ ン リ ス ト 内の 146 Unicode BOM 92 後処理 96 オプ シ ョ ン リ ス ト 内の 146 概念 91 正規化 103 符号化形式 92 符号化スキーム 92 分解 99 前処理 94 前処理 ・ 後処理 94 Unicode 字形統合 96 UPR フ ァ イル形式 61 194 索引 UTF-32 105 UTF 形式 92 X XMP メ タ デー タ 70 XSLT サン プル 139 画像の 114 XSD スキーマ TETML の 131 XSLT 134 サン プル 137, 16 x ハイ ト 76 あ 後処理 94 ア ラ ビ ア文字 81 暗号化文書 59 入れ子のオプ シ ョ ン リ ス ト 144 イ ン ス ト ール TET の 7 イ ン チ 73 オプ シ ョ ン リ ス ト 143 オプ シ ョ ン リ ス ト 文法 143 か 回転済みグ リ フ 79 影付き除去 85 画像 XMP メ タ デー タ 114 色再現性 121 解像度 119 視覚情報 119 小画像除去 116 抽出 113 デ ィ ス ク または メ モ リ へ抽出 113 配置画像 117 非対応の種別 121 文書内の画像数 116 ページベースの抽出ループ 118 リ ソ ース 117 リ ソ ースベースの抽出ループ 118 連結 115 キーワー ド オプ シ ョ ン リ ス ト 内の 147 基本多言語面 92 キ ャ ラ ク タ と グ リ フ 91 キ ャ ラ ク タ 列 93 擬似太字除去 85 矩形 オプ シ ョ ン リ ス ト 内の 149 組文字 93 グ リ フ 91 グ リ フ規則 111 グ リ フ メ ト リ ッ ク 74 グ リ フ リ ス ト 110 コ マ ン ド ラ イ ン ツール 19 コ ン コ ーダ ン ス (XSLT サン プル) 137 合字 93 互換分解 100 さ 最適化 速度の 65 索引 (XSLT サン プル) 139 作成例 XSLT 137 座標系 73 シーケ ン ス 93 し お り 71 視覚情報 画像の 119 終了点 グ リ フ と 単語の 77 シ ュ ラ ッ グ機能 59 小画像除去 116 私用領域 92 字形統合 96 数値 オプ シ ョ ン リ ス ト 内の 147 スキーマ 131 正規化 103 正準分解 99 双方向テキス ト 81 速度を最適化 65 た 縦書き 79 単位 73 単語境界検出 84 単語検出機能 84 注釈 71 テキス ト 抽出状態 59 な 内容分析 83 生テキス ト 抽出 (XSLT サン プル) 140 日中韓 (日本語 ・ 中国語 ・ 韓国語) 14 互換形 79 設定 7 日中韓 (日本語 ・ 中国語 ・ 韓国語) テキス ト 79 は 配置画像 117 ハイ フ ン除去 85 評価版 7 表組検出 89 表組抽出 (XSLT サン プル) 139 フ ァ イル検索 62 フ ァ イル添付 71 フ ォ ン ト 統計 (XSLT サン プル) 138 フ ォ ン ト の使用箇所を検索 (XSLT サン プル) 138 フ ォ ン ト フ ィ ル タ リ ン グ (XSLT サン プル) 137 分解 99 文書情報項目 69 文書ス タ イル 87 文書領域 69 文法 オプ シ ョ ン リ ス ト の 143 ヘブ ラ イ文字 81 ページベースの画像抽出ループ 118 ポ イ ン ト 73 ま 前処理 94 マ ッ プ不能グ リ フ 106 ミ リ メ ー ト ル 73 文字列 オプ シ ョ ン リ ス ト 内の 146 ら ラ イ セ ン スキー 9 リ ガチ ャ 93 リスト値 オプ シ ョ ン リ ス ト 内の 144 リ ソ ース カ テ ゴ リ 61 リ ソ ースの コ ン フ ィ ギ ュ レーシ ョ ン 61 リ ソ ースベースの画像抽出ループ 118 粒度 83 領域 テキス ト 抽出の 73 例 テキス ト 抽出状態 59 例外処理 27 C の場合 29 ロ グ記録 158 論理値 オプ シ ョ ン リ ス ト 内の 147 わ アセ ン ダ 76 キ ャ ッ プハイ ト 76 サーブ レ ッ ト 34 サロゲー ト 92 テキス ト フ ィ ル タ リ ン グ 94 索引 195 デ ィ セ ン ダ 76 ハイ ラ イ ト 77 パ ッ ケージ 72 フ ォ ーム フ ィ ール ド 71 ポー ト フ ォ リ オ 72 ミ ニサン プル 16 レ スポン ス フ ァ イル 22 196 索引 索引 197 ABC PDFlib GmbH Franziska-Bilek-Weg 9 80339 München, Germany www.pdflib.com 電話 +49 • 89 • 452 33 84-0 fax +49 • 89 • 452 33 84-99 疑問がおあ り の際は、 PDF メ ー リ ング リ ス ト と 、 tech.groups.yahoo.com/group/pdflib のアー カ イ ブ を チ ェ ッ ク し て く だ さ い ラ イ セ ン スに関するお問い合わせ sales@pdflib.com サポー ト support@pdflib.com (お使いのラ イ セ ン ス番号をお書き く だ さ い)
© Copyright 2024 Paperzz