2010年10月24日日曜日

FDKを使用してアラートの取得2

前回の続き

自作のFDKからマスターページの適用のfcodeを送っても、表示されるアラートを消すことができない。
どうやらnotificationが送られていないのが原因らしい。

結局はhWndを取得してキーコードを送るしかない。

2010年10月6日水曜日

FDKを使用してアラートの取得

FrameMaker Developer's Forumで面白い投稿があったのでメモ。
画像が表示できませんやマスターページを適用しますかといったアラートをFDKで取得し、自動ではいを押すプログラムです。
ここで使用されているFP_ActiveAlertはリファレンスにも載っていない実験的なプロパティみたいです。

#include "fapi.h"
#include "fdetypes.h"
#include "futils.h"

VoidT F_ApiInitialize(IntT init)
{
    if (init == FA_Init_First)
    {
        F_ApiNotification(FA_Note_Alert, True);
        F_ApiBailOut();
    }
}

VoidT F_ApiNotify(IntT notification, F_ObjHandleT docId, StringT filename, IntT iparm)
{
    F_ObjHandleT alertId;
    IntT uniq;

    switch (notification)
    {
    case FA_Note_Alert:
        // Get the id of the alert.
        alertId = F_ApiGetId(0, FV_SessionId, FP_ActiveAlert);
        uniq = F_ApiGetInt(FV_SessionId, alertId, FP_Unique);

        // If the alert is "Cannot display some imported graphics...", supppress it.
        switch(uniq)
        {
        case 40086: //"Cannot display some imported graphics..."
        case 40090: //"Cannot display some imported graphics..."
        case 46001: //Suppress ApplyMasterpages message
            F_ApiReturnValue(FR_YesOperation);
            break ;
        case 0:
            //Unfortunately no ID for "The font information changed..."
            if (F_StrCmp(filename, (StringT)"The font information for your system has changed. This change may affect the format and output of your document(s)."))
                F_ApiReturnValue(FR_YesOperation);
            if (F_StrCmp(filename, (StringT)"Die Schriftinformation für Ihr System hat sich geändert. Diese Änderung kann sich auf Formatierung und Ausgabe Ihrer Dokumente auswirken."))
                F_ApiReturnValue(FR_YesOperation);
            break;
        default:
            break;
        }
        break;

    default:
        break;
    }
    F_ApiBailOut();
}

2010年9月5日日曜日

iTextを使ってPDFの拡大縮小配置

iTextを使ってPDFの縮小、移動などの方法は調べても書かれていそうで意外にもなかったりする。
チュートリアルを見てもアフィン変換を使ってうんぬん・・・と書かれていてさっぱり。(高校の数学で習うらしい)

しかし、JAVAや.netだとそのものずばりのクラスが用意されているので移動、拡大縮小、回転の計算が簡単にできたりします。

次のソースはPDF A4->B5に中央に縮小する例です。(ソースはC#)

using System;
using System.Drawing;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace ConsoleApplication1
{
    class Program
    {
        const float pt2mm = 72f / 25.4f;

        static void Main(string[] args)
        {
            string savePdf = "hogehoge.pdf";
            string loadPdf = "fugafuga.pdf";

            // 新しいPDFファイルの作成
            Document pDoc = new Document(PageSize.A4);
            PdfWriter pw = PdfWriter.GetInstance(pDoc, new System.IO.FileStream(savePdf, System.IO.FileMode.Create));
            pDoc.Open();
            PdfContentByte pcb = pw.DirectContent;
            pDoc.NewPage();

            // 既存PDF読み込む
            PdfReader pr = new PdfReader(loadPdf);
            PdfImportedPage page = pw.GetImportedPage(pr, 1);

            // B5サイズへ縮小
            System.Drawing.Drawing2D.Matrix mtx = new System.Drawing.Drawing2D.Matrix();
            mtx.Scale(0.84f, 0.84f);

            // 用紙中央に移動
            mtx.Translate(14 * pt2mm, 20 * pt2mm, System.Drawing.Drawing2D.MatrixOrder.Append);

            // 新しいPDFに貼り付け
            pcb.AddTemplate(page, mtx);

            pr.Close();
            pDoc.Close();
            pw.Close();
        }
    }
}

JAVAだとAffineTransformという命令を使えばいいらしい。

2010年8月10日火曜日

CS4、CS5の段落コンポーザ名

InDesignは言語ごとにUIから操作できないように機能が隠してあったりします。

スクリプトのオブジェクトを見ればだいたいは分かるのだがString型だとわからない。
しかも、言語に依存してしまうのがどうにかならないものかな。

CS4とCS5で使える段落コンポーザ名のメモです。たぶんあっているはず。

CS4 JCS5 JCS4 ECS5 E
Adobe 欧文段落コンポーザAdobe 欧文段落コンポーザーHL Composer
Adobe 日本語段落コンポーザAdobe 日本語段落コンポーザーHL Composer J
Adobe 欧文単数行コンポーザAdobe 欧文単数行コンポーザーHL Single
Adobe 日本語単数行コンポーザAdobe 日本語単数行コンポーザーHL Single J
Adobe 多言語対応段落コンポーザAdobe 多言語対応段落コンポーザーAdobe World-Ready Paragraph ComposerHL Composer Optyca
Adobe 多言語対応単数行コンポーザAdobe 多言語対応単数行コンポーザーAdobe World-Ready Single-line ComposerHL Single Optyca
Linnaeus コンポーザLinnaeus コンポーザーHL Linnaeus

多言語対応段落~を使用するとRTL組版、タイ語、ヒンディ・・・(ここを見て)などが可能になるそうです。
Linnaeusは情報がないので全く不明です。

2010年8月5日木曜日

段落の行と行数を取得するWordVBA

WordのVBAには段落の行と行数を取得する項目がないみたいなので作ってみた。
先頭行から最終行(Endキー)を選択して、選択範囲を取得するというだけです。
何か問題あったら教えてください。

Dim wd_pgfObj As Word.Paragraph
Dim wd_lineObj As Word.Range
Dim LineCount As Long
Dim LineStart As Long
    
Set wd_pgfObj = Selection.Paragraphs(1)
LineCount = 0
LineStart = wd_pgfObj.Range.Start
Do
    Selection.Start = LineStart
    Selection.End = LineStart
    Call Selection.EndKey(Unit:=wdLine, Extend:=wdExtend)
        
    Set wd_lineObj = Selection.Range
    LineCount = LineCount + 1
        
    If Selection.End = wd_pgfObj.Range.End Then
        Exit Do
    End If
    LineStart = Selection.End
Loop
    
Call MsgBox("選択した行:" & LineCount & "行")

2010年7月27日火曜日

FDK使ってマスターページの適用

文書にFDKを使用してマスターページの適用を行いたいがここにアクセスするためのAPIがbookファイルからしか用意されていない。
fcodeからのアクセス方法を調べてもないです。

しかし、ESC、M、Pと順番に入力するとマスターページの適用が実行されることが判ったので(ヘルプにすら書いていない)、キーコードを送信すれば・・・

static IntT fcodes[] = {FC_ESC, 'M', 'P'};
F_ApiFcodes(sizeof(fcodes)/sizeof(IntT), fcodes);

実行されますが、ダイアログが出てしまいます。

このダイアログは消せないので、Win32APIのSendMessage使って、OKボタンを押してやってください。

2010年7月4日日曜日

OpenTypeフォントの文字欠け

Windows NT系でOpenTypeフォントを使用していると、時々文字欠けをしてしまいます。(欠ける文字もランダムだから困っちゃう)

原因はOSのバグでHotFixが公開されています。XPはSP4、VistaはSP2で同梱されているらしいです。

http://support.microsoft.com/?id=952909 (HotFix詳細)
http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=952909&kbln=en-us (直リンク)
Hotfix for FrameMaker

FDKプロジェクトの新規作成

FDKを新規作成方法です。VC2008Expressで説明だけど、ほかのバージョンでも大丈夫のはず。

  1. 新しいプロジェクトから「Win32 コンソール アプリケーション」を選択。
  2. アプリケーションの設定の項目を下記のように変更。
    アプリケーションの種類を「DLL」を選択。
  3. プロジェクトのプロパティを開き、下記のように設定。
    • C/C++→全般→追加のインクルード ディレクトリ にFDKのインクルードフォルダにパスを通す
      [例] C:\Program Files\Adobe\FDK7.2\include
    • C/C++→コード生成→構造体メンバのアライメントを「8 バイト」に変更
    • C/C++→プリプロセッサ→プリプロセッサの定義から「PROJECTNAME_EXPORTS」を削除
    • リンカ→全般→追加のライブラリ ディレクトリ にFDKのライブラリフォルダにパスを通す
      [例] C:\Program Files\Adobe\FDK7.2\lib
    • リンカ→入力→追加の依存ファイルに「fdk.lib api.lib fmdbms32.lib」を追加
    • (VC2005以降のみ)リンカ→入力→特定のライブラリの無視に「LIBC.lib」を追加
  4. ProjectName.cppを開いて#include "stdafx.h"の次の行に「#define PROJECTNAME_EXPORTS」を追加
  5. stdafx.hを開いて下記のコードを追加する。
    // for FDK
    #define DONT_REDEFINE // Console app needs native types
    #define WBUFLEN 512
     
    #include "fapi.h"
    #include "fdetypes.h"
    #include "futils.h"
    #include "fstrings.h"
    

2010年6月27日日曜日

FDKを作成してみる

無償で使用できるVisual C++2008 Expressで作成してみます。
ちなみに 7.2はVS2003、8.0以上は2005しか公式サポートはしてないはずです。
昔はうん万円出して開発ソフトを購入しないといけなかったのだが、FDKくらいなら無償で十分。どうせろくにデバッグできないし・・・。

では、起動時にアラートが表示されるFDKを作成してみます。
  1. FDKとVisual C++ 2008 Expressをインストールします。
  2. FDKのサンプルデータをコンパイルします。FDKをインストールしたフォルダの「.\sample\hello」の読み取り属性を解除して、フォルダ内のhello.slnを実行します。(必要であればhelloフォルダをバックアップ)
  3. Visual Studio 変換ウィザードが出るので「完了」を選択する。
    問題なければ下のような画像が拝めるはずです。

  4. (FM7.2の場合のみ)プロジェクトのリンカの入力設定の特定のライブラリの無視に「LIBC.lib」を追加します。

  5. ビルド>hello のビルドを選択します。
    エラーがなければ.\debug\hello.dllが作成されます。
  6. maker.iniに作成したDLLを登録します。[APIClients]セクションに下記の項目を追加する。
    hello=Standard, Greets user at startup,*fdk_install_dir\samples\hello\debug\hello.dll, all
  7. FrameMakerを実行します。下図のアラートが出れば完成です。

FrameMakerの開発環境

FrameMakerで追加プラグイン等の開発するソフトは3つぐらい有ります。
  • FrameMaker Developer Kit (C/C++)
  • FrameScript (独自言語)
  • FrameAC (VisualBasic/VBScript)
FrameMaker Developer Kitは公式の開発環境です。作成するにはC/C++の知識が必要です。
FrameScriptは独自のスクリプト言語で、(FDKよりは)簡単に作成できるサードパーティーのプラグインです。
日本国内でもバージョン2.0くらいまでは代理店が販売してましたが今は行っていないみたいです。
FrameACはActiveXを使ってFrameMakerを操作させることができるらしい・・・ということしか知りません。
あと、Pythonで使ったやつとかあったような?でも開発終了のはず。

てすとてすと

てすと。
テンプレートに関してはbtemplatesとかいう便利なサイトがあるんだね。
昔はたいしていじれなかったような・・・っていつの話だ?