トラスト・ソフトウェア・システム
トラスト・ソフトウェア・システム

PDF Extract(PDF情報取出) C++サンプル

「PDF Extract」ソフトは、PDF文書から様々な情報を取り出します。
PDF Extract 情報取り出し用のI/F
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ライブラリやライセンスマネージャーなど
doc使用説明書やjavadocなど
includeC/C++用のヘッダー(.h)ファイル
jarEXPA.jar(Javaのラッパー)
libC/C++用のlibファイル
samples各種開発言語のサンプル
無償評価版と共にダウンロードしたライセンスキーをbin/LicenseManager.exeを使って登録してください。

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))
{
 ...
}

ご質問、お問い合わせ

 メールで support@TrustSS.co.jp 宛てにお送りください。
または、質問のページからお送りいただくようお願いします。ご要望も承っております。(匿名で送れます。)

(記載の会社名および製品名は、各社の登録商標および商標です。)
PDF製品 C++サンプル
PDF Security
PDF Validator
PDF to PDF/A Converter
PDF to Image Converter
PDF Imager-LP
Image to PDF Converter
PDF Printer
PDF Prep Tool Suite
PDF Optimizer
PDF Command Line Suite
PDF Extract