ブック内の fm ファイルを mif 形式で保存する(Adobe FrameMaker8 FDK Client)
仕上げ処理で、mif ファイルに対して一括処理をほどこすことがよくあります。
(小口に配置するツメの位置を章ごとに移動させる、など)
構造化FrameMakerでは、仕上げ段階では、XML文書からブックを生成しますが、
こうしてできた個々のファイルの形式は fm です。
この fm ファイルをひとつずつ開いて mif 保存しているのは苦痛なので
自動化しました。
処理内容は、ブックファイル中の fm ファイルを列挙して、 mif 拡張子を持つファイル名文字列を生成してから、 mif 形式で保存しているだけです。
保存形式の指定で FV_SaveFmtInterchange80 を使うのがポイントです。 もし、FV_SaveFmtInterchange を使うと、FrameMaker7 形式の mif になるようです。 FM8のfm形式ファイルを FM7 mif 形式に保存すると、 ユニコード関係で一部文字が化けることがあります。
tomif.c
#include "fapi.h"
#include "futils.h"
#include "fstrings.h"
#include "fstrlist.h"
#define SaveAsMif 1
StringT MIF_SUFFIX = ".mif";
VoidT F_ApiInitialize(IntT initialization) {
F_ObjHandleT menuBarId, menuId;
menuBarId = F_ApiGetNamedObject(FV_SessionId,FO_Menu,"!BookMainMenu");
menuId = F_ApiDefineAndAddMenu(menuBarId,"APIMenu1","API");
F_ApiDefineAndAddCommand(SaveAsMif, menuId,"SaveAsMifCmd","Save all fm files in book as mif", "");
}
StringT ConvFmToMif(const StringT docname,StringT docnamemif){
IntT len;
len=F_StrLen(docname);
//F_Printf(NULL,(StringT)"CHK2 len= %d",len );
F_StrCpyN(docnamemif,docname,len-2);
F_StrCat(docnamemif,MIF_SUFFIX);
F_Printf(NULL,(StringT)"CHK3 MIF= %s",docnamemif );
return docnamemif;
}
VoidT DoSave(const F_ObjHandleT docId,const StringT docnamemif){
IntT i;
UCharT msg[1024];
F_PropValsT params, *returnParamsp = NULL;
params = F_ApiGetSaveDefaultParams();
i = F_ApiGetPropIndex(¶ms, FS_AlertUserAboutFailure);
params.val[i].propVal.u.ival = True;
i = F_ApiGetPropIndex(¶ms, FS_FileType);
//params.val[i].propVal.u.ival = FV_SaveFmtInterchange;
params.val[i].propVal.u.ival = FV_SaveFmtInterchange80; // This is point for fm8.0 format.
i = F_ApiGetPropIndex(¶ms, FS_SaveMode);
params.val[i].propVal.u.ival = FV_ModeSaveAs;
F_ApiSave(docId, docnamemif, ¶ms, &returnParamsp);
// display confirm dialog.
/*
i = F_ApiGetPropIndex(returnParamsp, FS_SavedFileName);
F_Sprintf(msg, "Saved: %s",returnParamsp->val[i].propVal.u.sval);
F_ApiAlert(msg, FF_ALERT_CONTINUE_NOTE);
*/
}
VoidT DoSaveAllAsMif() {
F_ObjHandleT docId,fmDocId;
StringT docname;
StringT docnamemif = F_StrNew((IntT)256);
IntT i;
StringListT list = F_StrListNew((UIntT)1,(UIntT)1);
//F_Printf(NULL,(StringT)"Called 7 !");
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_StrListAppend(list,docname);
fmDocId= F_ApiGetId(FV_SessionId, fmDocId,FP_NextComponentInBook);
}
for(i=0; i < F_StrListLen(list); i++){
docname = F_StrListGet(list, i);
ConvFmToMif(docname,docnamemif);
F_Printf(NULL,(StringT)"CHK FM= %s",docname );
F_Printf(NULL,(StringT)"CHK MIF= %s",docnamemif );
// 1) Open
fmDocId = F_ApiSimpleOpen(docname,False);
// 2) Save
DoSave(fmDocId,docnamemif);
// 3) Close
F_ApiClose(fmDocId, FF_CLOSE_MODIFIED);
}
F_StrListFree(list);
F_Free(docnamemif);
}
VoidT F_ApiCommand(IntT command) {
switch (command) {
case SaveAsMif:
DoSaveAllAsMif();
break;
}
}
補足
docId = F_ApiGetId(0,FV_SessionId,FP_ActiveBook);
とあるように、 処理対象となるブックをFrameMakerで開いていて、かつアクティブな状態で、 メニュー【API - Save all fm files in book as mif】を選択します。