Tue, June 23, 2009
アクティブブックドキュメント中のfmファイル名を順番に取得する方法(Adobe FrameMaker8 FDK)
前回 は fmファイルを開いているときにそのファイル名(パス)を 得る方法を調べた。
その応用で今度は book形式のファイルを開いているときに、 そのbook内に含まれるすべてのfmファイルのファイル名(パス)を順に取得してみる。
コード
#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);