PDF Extract(PDF情報取出) C++サンプル
「PDF Extract」ソフトは、PDF文書から様々な情報を取り出します。
情報取り出し用のI/F
PDF文書の様々な情報をハンドルします。
PDF文書の様々な情報をハンドルします。
- Document Interface - PDF文書の基本的な情報
- Page Interface - ページの情報
- Content Interface - 文書内容
- Image Interface - 画像の情報
- Text Interface - テキスト情報
- Graphic State - 色や線種などの情報
- Font Interface - フォント情報
- ClorSpace Interface - 色空間情報
- TransformMatrix Interface - 変換行列情報
- Alternate Image Interface - 代替画像情報
- Annotation Interface - 注釈情報(添付ファイル、リンク他)
- OutlineItem Interface - しおり情報
- Destination Interface - デスティネーション情報
- Ocg Interface - レイヤー情報
- PDFObject Interface - Object(PDFの構成要素)情報
- EmbeddedFile Interface - 埋め込みファイル情報
他のC++のサンプル
C#のサンプルはこちらです。
無償評価版のダウンロードとインストール
ライブラリ(評価版API)は無償でダウンロードできます。
ファイルをダウンロードしてから、インストールもしくは適当なフォルダーに解凍します。以下のようなフォルダーができますので、適宜ご利用ください。
無償評価版と共にダウンロードしたライセンスキーをbin/LicenseManager.exeを使って登録してください。
ファイルをダウンロードしてから、インストールもしくは適当なフォルダーに解凍します。以下のようなフォルダーができますので、適宜ご利用ください。
bin | ライブラリやライセンスマネージャーなど |
doc | 使用説明書やjavadocなど |
include | C/C++用のヘッダー(.h)ファイル |
jar | EXPA.jar(Javaのラッパー) |
lib | C/C++用のlibファイル |
samples | 各種開発言語のサンプル |
C++のサンプルと解説
PDF文書からテキスト文字列を抽出するサンプルです。
#include <stdio.h> #include <fcntl.h> #include <io.h> #include "expa_c.h" #pragma comment(lib,"PDFParser.lib") void print(const wchar_t *wzStr, FILE *out); int main(int argc, char *argv[]) { TExpaDocument pDocument; TExpaContent pContent; TExpaText pText; int iPage; const wchar_t *sText; wchar_t szW[100]; FILE *out; float y; // 初期化 ExpaInitialize(); // インスタンス生成 pDocument = ExpaCreateObject(); // ライセンス・キー // ライセンスマネージャを使わない場合は、以下を有効にする //ExpaSetLicenseKey("ライセンスキー"); //適切なライセンスキーに替えてください。 // PDFファイル if(!ExpaDocOpen(pDocument, "input.pdf", "")){ printf("エラー PDFファイル input.pdfを開けません\n"); printf("Error: 0x%X (%s)\n", ExpaDocGetLastError(pDocument), ExpaDocGetLastErrorMessageA(pDocument)); return 1; } // 出力用のUnicodeファイル生成 if(fopen_s(&out, "output.txt", "wb")){ fprintf(stderr, "出力ファイル output.txt を生成できません\n"); return 2; } _setmode(_fileno(stdout), _O_BINARY); fprintf(out, "\377\376"); //BOM // すべてのページを対象とする。 for(iPage = 1; iPage <= ExpaDocGetPageCount(pDocument); iPage++){ //ページ番号 ExpaDocSetPageNo(pDocument, iPage); // 指定されたページのContentを抽出 pContent = ExpaPageGetContent(ExpaDocGetPage(pDocument)); // テキストを単一の空白で区切って抽出する ExpaContentResetContent(pContent, 1); ExpaContentSetTextExtConfiguration(pContent, eTECBreakTextState | eTECPosMergeSingleSpace); ExpaContentSetExpandLigatures(pContent, 1); y = -1.0f; while(pText = ExpaContentGetNextText(pContent)){ int nLength = ExpaTextGetStringLength(pText); if(nLength){ TPDFVector *pos; int wmode; // テキスト出力 // 横書きを前提として、Y座標の変化で改行を加える pos = ExpaTextGetPosition(pText); if(pos[0].y != y){ print(L"\n", out); // // 行ごとの追加情報 // // ページ番号 swprintf(szW, sizeof(szW)/sizeof(szW[0]), L"%d, ", iPage); print(szW, out); // 位置情報 swprintf(szW, sizeof(szW)/sizeof(szW[0]), L"%f(%f), ", pos[0].x, pos[1].x); print(szW, out); swprintf(szW, sizeof(szW)/sizeof(szW[0]), L"%f(%f), ", pos[0].y, pos[1].y); print(szW, out); // フォント情報 swprintf(szW, sizeof(szW)/sizeof(szW[0]), L"%S, ", ExpaFontGetBaseName(ExpaGSGetFont(ExpaContentGetGraphicsState(pContent)))); print(szW, out); swprintf(szW, sizeof(szW)/sizeof(szW[0]), L"%f, ", ExpaTextGetFontSize(pText)); print(szW, out); swprintf(szW, sizeof(szW)/sizeof(szW[0]), L"%f, ", ExpaTextGetWidth(pText)); print(szW, out); swprintf(szW, sizeof(szW)/sizeof(szW[0]), L"%d, ", (wmode = ExpaFontGetWMode(ExpaGSGetFont(ExpaContentGetGraphicsState(pContent))))); print(szW, out); // テキスト if(wmode == 1){ wchar_t *sText; //テキストは、Unicode sText = (wchar_t *)ExpaTextGetUnicodeString(pText); swprintf(szW, sizeof(szW)/sizeof(szW[0]), L"[%X %X], ", ((unsigned char *)sText)[0], ((unsigned char *)sText)[1]); print(szW, out); } // テキスト トークン sText = ExpaTextGetUnicodeString(pText); if(sText) print(sText, out); // 空白追加 print(L" ", out); // 現在のY座標を記憶する y = pos[0].y; } } } } // 後始末 fclose(out); //テキストファイル終了 ExpaDocClose(pDocument); //PDFファイル終了 ExpaDestroyObject(pDocument); //インスタンス開放 ExpaUnInitialize(); //ライブラリ開放 return 0; } void print(const wchar_t *wzStr, FILE *out) { while(*wzStr) { if(*wzStr == '\n'){ fputc('\r', out); fputc(0, out); } fputc(*wzStr % 256, out); fputc(*wzStr / 256, out); wzStr++; } }
ExpaInitialize() | 初期化 |
ExpaSetLicenseKey() | ライセンスキーを指定します。 ライセンスマネージャでライセンスキーを登録した場合は、この指定は不要です。 |
ExpaCreateObject | PDF文書を扱うインスタンスを生成します。戻り値がハンドルとなります。 |
ExpaDocOpen() | PDF文書を開きます。 第一引数に、ハンドル 第二引数に、PDFファイル名 Web上のPDFファイルを指定する場合 第三引数に、パスワード(暗号化されていない場合は、NULLまたは""を指定) を指定します。 |
ExpaDocGetPageCount() | 開いたPDF文書の総ページ数を取得します。 |
ExpaDocGetPage() | 抽出の対象とするPDF文書のページ番号を指定 第二引数にページ番号(先頭のページは"1"です)を指定します。 |
ExpaDocGetPage() | 現在抽出の対象としているPDF文書のページ番号を取得します。 |
ExpaPageGetContent() | PDF文書の現在ページからContent(記述内容)のオブジェクトを取得します。 |
ExpaContentGetNextText() | Contentオブジェクトから文字情報オブジェクトを抽出 |
ExpaTextGetStringLength() | 抽出した文字情報の長さ(文字数)を取得 |
ExpaTextGetPosition() | 抽出した文字列の先頭の位置を取得 |
ExpaTextGetUnicodeString() | 文字オブジェクト内の文字列をUnicodeで取得 |
インターネット(Web)上のPDFファイルを開く方法
入力のPDFファイル指定では以下の形式で指定すると、インターネット上のPDFファイルを直接変換できます。
http://[username:password@]domain[:port][/resource]"username"および"password"は基本認証(Basic Authentication)のユーザー名とパスワード指定です。
先のサンプルで"ExpaDocOpen( )"のコードを以下のように変更すると、Web上のPDFを開き指定した情報を抽出します。
//PDF文書を開く if (!ExpaDocOpen(pDocument, L"http://www.pdf-tools.trustss.jp/data/Receipt2.pdf", NULL)) { ... }
ご質問、お問い合わせ
(記載の会社名および製品名は、各社の登録商標および商標です。)