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 J | CS5 J | CS4 E | CS5 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 Composer | HL Composer Optyca |
Adobe 多言語対応単数行コンポーザ | Adobe 多言語対応単数行コンポーザー | Adobe World-Ready Single-line Composer | HL 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で説明だけど、ほかのバージョンでも大丈夫のはず。
- 新しいプロジェクトから「Win32 コンソール アプリケーション」を選択。
- アプリケーションの設定の項目を下記のように変更。
アプリケーションの種類を「DLL」を選択。 - プロジェクトのプロパティを開き、下記のように設定。
- 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」を追加
- C/C++→全般→追加のインクルード ディレクトリ にFDKのインクルードフォルダにパスを通す
- ProjectName.cppを開いて#include "stdafx.h"の次の行に「#define PROJECTNAME_EXPORTS」を追加
- 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を作成してみる
ちなみに 7.2はVS2003、8.0以上は2005しか公式サポートはしてないはずです。
昔はうん万円出して開発ソフトを購入しないといけなかったのだが、FDKくらいなら無償で十分。どうせろくにデバッグできないし・・・。
では、起動時にアラートが表示されるFDKを作成してみます。
- FDKとVisual C++ 2008 Expressをインストールします。
- FDKのサンプルデータをコンパイルします。FDKをインストールしたフォルダの「.\sample\hello」の読み取り属性を解除して、フォルダ内のhello.slnを実行します。(必要であればhelloフォルダをバックアップ)
- Visual Studio 変換ウィザードが出るので「完了」を選択する。
問題なければ下のような画像が拝めるはずです。
- (FM7.2の場合のみ)プロジェクトのリンカの入力設定の特定のライブラリの無視に「LIBC.lib」を追加します。
- ビルド>hello のビルドを選択します。
エラーがなければ.\debug\hello.dllが作成されます。 - maker.iniに作成したDLLを登録します。[APIClients]セクションに下記の項目を追加する。
hello=Standard, Greets user at startup,*fdk_install_dir\samples\hello\debug\hello.dll, all
- FrameMakerを実行します。下図のアラートが出れば完成です。
FrameMakerの開発環境
- FrameMaker Developer Kit (C/C++)
- FrameScript (独自言語)
- FrameAC (VisualBasic/VBScript)
FrameScriptは独自のスクリプト言語で、(FDKよりは)簡単に作成できるサードパーティーのプラグインです。
日本国内でもバージョン2.0くらいまでは代理店が販売してましたが今は行っていないみたいです。
FrameACはActiveXを使ってFrameMakerを操作させることができるらしい・・・ということしか知りません。
あと、Pythonで使ったやつとかあったような?でも開発終了のはず。