Index > ブック内の fm ファイルを mif 形式で保存する(Adobe FrameMaker8 FDK Client)
Thu, July 2, 2009

ブック内の 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(&params, FS_AlertUserAboutFailure);
    params.val[i].propVal.u.ival = True;
    i = F_ApiGetPropIndex(&params, 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(&params, FS_SaveMode);
    params.val[i].propVal.u.ival = FV_ModeSaveAs;

    F_ApiSave(docId, docnamemif, &params, &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】を選択します。

 Twitter
follow me on Twitter
 Categories