Index > アクティブブックドキュメント中のfmファイル名を順番に取得する方法(Adobe FrameMaker8 FDK)
Tue, June 23, 2009

アクティブブックドキュメント中のfmファイル名を順番に取得する方法(Adobe FrameMaker8 FDK)

前回 は fmファイルを開いているときにそのファイル名(パス)を 得る方法を調べた。

その応用で今度は book形式のファイルを開いているときに、 そのbook内に含まれるすべてのfmファイルのファイル名(パス)を順に取得してみる。

さらにfm拡張子をmifに変換

コード

#include "fapi.h"
#include "futils.h"
#define TestMenu 1


VoidT F_ApiInitialize(IntT initialization) {

    F_ObjHandleT menuBarId, menuId;

    menuBarId = F_ApiGetNamedObject(FV_SessionId,FO_Menu,"!BookMainMenu");
    menuId = F_ApiDefineAndAddMenu(menuBarId,"APIMenu","API");
    F_ApiDefineAndAddCommand(TestMenu, menuId,"TestMenuCmd","TestMenu","");

}

VoidT F_ApiCommand(IntT command) {

    F_ObjHandleT docId,fmDocId;
    StringT docname;

    docId = F_ApiGetId(0,FV_SessionId,FP_ActiveBook);

    if(!docId){
        return ;
    }

    docname = F_ApiGetString(docId, docId, FP_Name);
    F_Printf(NULL,(StringT)"CHK BOOK= %s",docname );



    fmDocId= F_ApiGetId(FV_SessionId, docId,FP_FirstComponentInBook);

    while(fmDocId){
        docname = F_ApiGetString(docId, fmDocId, FP_Name);
        F_Printf(NULL,(StringT)"CHK FM= %s",docname );

        fmDocId= F_ApiGetId(FV_SessionId, fmDocId,FP_NextComponentInBook);
    }

}

前回と ほとんど同じだが、

1)メニューをつくるときに !BookMainMenu を使用する点

menuBarId = F_ApiGetNamedObject(FV_SessionId,FO_Menu,"!BookMainMenu");

2)docIdを取得するときに FP_ActiveDooc ではなく、FP_ActiveBook を使う点

docId = F_ApiGetId(0,FV_SessionId,FP_ActiveBook);

が異なる。

一旦bookのdocIdが取得できれば後は、 FP_FirstComponentInBookを使って、book中の最初の fm ファイルのfmDocIdを取得...

fmDocId= F_ApiGetId(FV_SessionId, docId,FP_FirstComponentInBook);

さらに、FP_FirstComponentInBook を使って取得した fmDocId と FP_NextComponentInBook を 使って、次の fm ファイルのfmDocIdを取得...

fmDocId= F_ApiGetId(FV_SessionId, fmDocId,FP_NextComponentInBook);

あとはこれを繰り返す。

文字列 foo.fm を foo.mif に変える方法

取り出した fmファイルを mif 形式で保存するつもりなので、 拡張子だけを mif に変更したい。

FDKに含まれているヘッダファイル lib/fstring.h を使って、以下のようにすればOK.

#include "fapi.h"
#include "futils.h"
#include "fstrings.h"

StringT MIF_SUFFIX = ".mif";

F_ObjHandleT bookId,fmId;
StringT docname;
//StringT docnamemif = malloc(256);
StringT docnamemif = F_StrNew((IntT)256);
IntT len;

// ファイル名(パス)を取得
bookId = F_ApiGetId(0,FV_SessionId,FP_ActiveBook);
fmId= F_ApiGetId(FV_SessionId, bookId,FP_FirstComponentInBook);
docname = F_ApiGetString(docId, fmDocId, FP_Name);

// foo.fm を foo.mif に変換
len=F_StrLen(docname);
F_StrCpyN(docnamemif,docname,len-2);
F_StrCat(docnamemif,MIF_SUFFIX);

// 結果をコンソールへ出力
F_Printf(NULL,(StringT)"MIF= %s",docnamemif );


//メモリを解放
F_Free(docnamemif);
 Twitter
follow me on Twitter
 Categories