PDF Tools ホーム > PDF Tools ライト > PDF Viewer-L > C++サンプル > しおり表示

PDF Viewer-L 画面表示のために開くサンプルと解説 C++

「PDFViewer-L」は、PDF文書を表示するためのライブラリです。

PDF Viewer-L Package
機能を制限することでお求め安くしました。PDF Viewer-Lは、ライト(軽量)ではありますがPDFのもつ文書内リンクやWebリンクの情報はイベントを介して取得でき、サムネールやしおり情報もメソッドを介して取得できます。これらの情報を利用して独自のPDF表示アプリケーションを構築できます。

PDF Viewer-L 購入(価格)

C# によるPDFしおり表示サンプルは、こちらです。

無償評価版のダウンロードとインストール

PDF Viewer-Lライブラリは、無償でダウンロードして試用できます。以下のリンクをクリックしてダウンロードしてください。なお、試用に際しては評価用のライセンスキーが必要ですので必ずダウンロードしてください。
評価用ライセンスキーには利用期限がありますが、何度ダウンロードしてもかまいません。

インストール

ダウンロードしたファイルは、適当なフォルダーに解凍します。以下のようなフォルダーができあがりますので、適宜利用します。

binライブラリ
doc使用説明書やライセンス契約書
includeC/C++用のヘッダー(.h)ファイル
samples各種開発言語によるサンプルコード

サンプルの実行前にライブラリ(OCX)を以下の手順に従って登録します。

  1. 「コマンド プロンプト」を管理者権限で起動します。
  2. ファイルを解凍したフォルダー内のbinフォルダーに移動します。
  3. "regsvr32 vwl.ocx"を実行して登録します。成功を示すダイアログが表示されます。
  4. Visual Studioを起動します。
  5. Visual Studioのツールボックス内で、右クリックしてコンテキストメニューの「アイテムの選択(I)...」を選択してツールボックス アイテムの選択ダイアログを表示させます。
  6. 表示したダイアログの「COMコンポーネント」タグをクリックして、コンポーネントの「PdfViewerL Control」をチェックします。これによって、PDF Viewer-Lツールがツールボックスに現れます。

PDFのしおり(outline)を表示するMFCサンプル

PDF文書をそのしおり(outline)とともに表示するMFCのアプリケーションのサンプルを記します。
サンプルでは、ダイアログ ベースのMFCアプリケーションを使用します。あらかじめウィザードなどで作成し、フォームに“PdfViewerL Control”を貼り付けておきます。貼り付けたコントロールには、m_Viewerという変数名を追加しておきます。

ダイアログクラスのOnInitDialog()に以下のコードを追加します。

BOOL CopenDocDlg::OnInitDialog()
{
    ...
    // TODO: 初期化をここに追加します。
    m_Viewer.InitCtrl(_T("ライセンスキー"));
    m_Viewer.Open(_T("PDF Viewer-L.pdf"), _T(""), _T(""));

    return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}

アプリケーションを起動すると、PDF Viewer-Lコントロールを初期化し、指定されたPDFファイルを表示します。使用するメソッドは以下のとおりです。

InitCtrlコントロールを指定のライセンス・キーで初期化します。
引数にライセンスキー文字列を指定します。ライセンスキーは、こちらからダウンロードしてください。
Open指定のPDFをコントロールに表示します。
以下の引数を指定します。
第一引数表示するPDFのファイルパスを指定します。
第二引数PDFがパスワードで暗号化されている場合にオーナーパスワードを指定します。
暗号化されていない場合は、NULL文字を指定します。
第三引数PDFがパスワードで暗号化されている場合にオーナーパスワードを指定します。
暗号化されていない場合は、NULL文字を指定します。
暗号化されている場合で、多くの場合はオーナーパスワードのみの指定で復号できます。
暗号化されたPDFに正しいパスワードを指定しなかった場合は、エラーになりPDFは表示されません。このような場合は、暗号化したPDFを開くのようにしてください。

PDF文書に記載されたしおり(Outline)情報は、PDFが完全に読み込まれた後でなければ取得できません。そのため、PDFのオープン処理終了のイベントのハンドラーを登録します。しおり情報の取得は、このハンドラーで取得します。

ファイルのオープン処理終了イベントを捕捉する

PDF Viewer-Lコントロールは、PDFファイルのオープンの後にイベントを発火させます。
このイベントは、以下のように登録されたイベントハンドラーで処理できます。

BEGIN_EVENTSINK_MAP(CopenDocDlg, CDialog)
  ON_EVENT(CopenDocDlg, IDC_PDFVIEWERLCTRL1, 101, CopenDocDlg::OnOpenPdfviewerlctrl1, VTS_I4 VTS_R4 VTS_I4)
END_EVENTSINK_MAP()

このイベント ハンドラーで、しおり情報を取得します。
なお他にも、総ページ数やサムネール画像など、PDFを開いた後でなければ取得できない属性情報はこのハンドラーで取得します。

しおり情報を取得し、表示する

PDF文書に格納されたしおり情報を取得し、それをMFCのツリービュー(CTreeCtrl)で表示します。
あらかじめ、“CTreeCtrl”を貼り付けておき、それに変数名“m_OutlineTree”を追加しておきます。

void CopenDocDlg::OnOpenPdfviewerlctrl1(
    long  pageIndex,   // 表示したページのインデックス
    float zoomVal,     // 表示の倍率
    long  err)         // エラー コード
{
    int outlineCount = m_Viewer.GetOutlineCount();
    if(outlineCount <= 0){
        //しおりが存在しない
        m_OutlineTree.DeleteAllItems();
        return;
    }

    std::vector<Outline_t> outlines; //Outline_tは、しおり情報を格納するための構造体です。
    BSTR                   title;
    Outline_t              o;
    HTREEITEM              *hItem;

    outlines.clear();
    outlines.resize(m_OutlineCount);
    outlineTree.DeleteAllItems();
    hItem = new HTREEITEM [outlineCount];
    for(int i = 0; i < outlineCount; i++){
        m_Viewer.GetOutline(i, (long*)&o.parentIndex, &title, (long*)&o.flag, &o.x0, &o.y0, &o.x1, &o.y1, (long*)&o.count);
        o.title = title;
        outlines[i] = o;

        //ツリーに項目を追加
        if(o.count > 0){
            //項目を展開する
            hItem[i] = m_OutlineTree.InsertItem(TVIF_TEXT|TVIF_STATE|TVIF_HANDLE|TVIF_PARAM, o.title, 0, 0, TVIS_EXPANDED, TVIS_EXPANDED, (LPARAM)i, (o.parentIndex < 0) ? TVI_ROOT : hItem[o.parentIndex], TVI_LAST);
        }else{
            //項目を閉じておく
            hItem[i] = m_OutlineTree.InsertItem(TVIF_TEXT|TVIF_PARAM, o.title, 0, 0, 0, 0, (LPARAM)i, (o.parentIndex < 0) ? TVI_ROOT : hItem[o.parentIndex], TVI_LAST);
        }
    }
    delete hItem;
}
GetOutline指定インデックスのしおりを取得します。
以下の引数を指定します。
第一引数取得するしおりのインデックス番号を指定します。
第二引数しおりツリーの親のインデックス番号が戻ります。
第三引数しおりの文字列が戻ります。
第四引数しおりに関連付けられたページを表示する方法を示すフラグが戻ります。
PDFのDestinationsで示された表示方法と同様のものです。
第五~八引数フラグに関連した位置や表示倍率を示す値が戻ります。
第九引数このしおりの子しおりの数が戻ります。

以下のようなウインドウが表示されます。
PDF Viewer-L Outline Sample

しおりのフラグ情報

しおり(outline)情報の取得で戻るフラグは、PDF Reference(PDFの仕様)で説明されているDestinationsと同じで、以下のとおりです。

下記の表において、第五~八引数をx0, y0, x1, y1と記し、PDFの表示領域を“ウィンドウ”と記します。

フラグPDFのname構文意味
eFlag_XYZ/XYZx1倍に拡大されたページの領域をウィンドウの左上から座標(X=x0,Y=y0)に表示
eFlag_Fit/Fitウインドウにフィットするように表示
eFlag_FitH/FitHウインドウの上端からx0の位置に表示
eFlag_FitV/FitVウインドウの左端からx0の位置に表示
eFlag_FitR/FitRウインドウ内の位置(x0,y0)を左上、位置(x1,y1)を右下とする領域に表示
eFlag_FitB/FitBウインドウのバンディング領域にフィットするように表示
eFlag_FitBH/FitBHウインドウ上端からのx0位置でウインドウのバンディング幅にフィットするように表示
eFlag_FitBV/FitBVウインドウ左端からのx0位置でウインドウのバンディング高さにフィットするように表示

ただし、GotoOutlineメソッドを使って表示した場合に、上記のとおりに表示されない場合があります。

しおりの示すページを表示

しおりの情報は、PDF Viewer-Lコントロール内部でインデックス番号によって管理されています。そのため、しおりツリーがクリックされた場合に、ツリーのインデックス番号を指定するだけで表示を変更させることができます。
CTreeCtrlのSelChangedイベントハンドラに以下のようなコードを追加すれば、クリックされたツリーの項目のコンテンツを表示するようにできます。

void CoutlineDlg::OnTvnSelchangedOutlineTr(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    // TODO: ここにコントロール通知ハンドラ コードを追加します。
    if(m_OutlineTree.GetSelectedItem()){
        long index = pNMTreeView->itemNew.lParam;
        m_Viewer.GotoOutline(index);
    }
    *pResult = 0;
}
GotoOutlineコントロール内部で管理されているしおりに移動します。
引数には、インデックスを指定します。
しおり情報は、PDF文書で定義された順に0,1,2,3...とインデックス番号が振付けられて管理されています。

なお、指定ページの表示指定でインデックスではなく、outlines構造体に格納されたフラグと位置情報を使う場合は、GoToメソッドを使います。
GoToメソッドを使うと、フラグを読み替えての表示など、より多彩な実装ができます。

サンプル ソースコード

PDF Viewer-Lのサンプル ソースコードは、以下からダウンロードしてください。

   ソースコード: vwlSample_2_3.zip

ご質問、お問い合わせ

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