ひよっこ。

I want to…

Posts Tagged ‘Air’

Tracの任意のWikiページをPDF出力するスクリプトを作ったよ(暫定版)

Posted by hikaruworld : 2010 1月 7

TracのPDF出力する方法は、以前の記事でも述べたようにいくつかあります。
が、その中で唯一日本語に対応しているTracWikiExportプラグインは、
残念な事にテーブル内に日本語構成が含まれていた場合にテーブル構造が崩れたり、

{{{#!html}}}

を正しく解釈できないという微妙な問題を含んでいます。

それで困っていたので、簡単にJavaのPDF出力ライブラリのiText5を利用して作ってみました。
サラッと作っただけでまだバグバグですが、コアとなるJavaの部分だけ晒しておきます。
launchpad.netにあげているので、ここからダウンロードできます。
目標としてはAdobeAirを利用したプレビュー機能&ダウンロード機能をつけたいですね。

ちなみに、プラグインとして作らずにAPIを利用して別アプリとして作ったのは、
PDF出力する状況を考えるとTrac上にプラグインとして存在する必要もないかなと思ったので。
むしろ、管理者レベルがある特定のタイミング(納期や外部との打ち合わせ)で利用するだけかなと。

使い方

実行可能jar形式なのでjava -jar で実行してください。
その際引数に、TracのXML-RPCプラグインのURL(認証には未対応),出力先,対象Wikiページ,の指定が必要になります。
以下サンプルです。

java -jar TracPDFConvertor.jar http://localhost:8080/trac/sample/xmlrpc /Output TracGuide,WikiFormatting,Hoge/HelloWorld,Piyo/*

いくつか補足します。
第一引数ではxmlrpcで接続先を指定するのでxmlrpcプラグインが必須です。
ただし、現状では認証に対応していませんので注意してください。

第三引数は、出力したいWikiページをカンマ区切りで指定します。
その際、サブディレクトリ構造を持つWikiページはそのまま指定してください(Hoge/HelloWorld)。
任意のサブディレクトリ構造以下を指定したい場合は*指定が使えます。上記のサンプル(Piyo/*)ではPiyo以下のすべてのWikiページを出力します。

出力結果は以下の通りです。

/Output/TracGuide.pdf
/Output/WikiFormatting.pdf
/Output/Hoge/HelloWorld.pdf
/Output/Piyo/1.pdf
/Output/Piyo/2.pdf

Wikiページ名+.pdfファイル名で出力が行われます。
また、サブディレクトリ指定の場合はサブディレクトリ単位でディレクトリが生成されます。

WikiFormattingの出力結果のファイルを添付しておきます。

TODO

  • AdobeAirのアプリケーションでラップする(JWSとかじゃないのは単なる趣味)
  • Wordへの出力
  • 出力形式の整形
  • Imageなどでリンク先のファイルが存在しない場合にIOExceptionで落ちる
  • スタイルシート及びフォントの設定などをプロパティから読み込めるようにする
  • 接続先Tracのスタイルシート設定の解析

ソースコードはここにあります。

xmlrpcclientで通信して、対象ページのHTMLを取得した後、iTextで書き出しているだけです。
また、外部ライブラリとして、iText5及びApacheXmlRpc、日本語フォントとしてIPAモナーフォントを利用しています。感謝。

以上です。

Posted in program | タグ: , , , , | Leave a Comment »

Air2.0(ベータ版)でネイティブプロセスでjarファイルを実行する方法(泥臭い編)

Posted by hikaruworld : 2009 12月 13

Air2.0(現時点ではβ1版)での新機能の一つとして、ネイティブプロセスを実行することができるようになっています。

詳細はこのあたりが参考になります。

  1. AIR 2.0 ではじめるコミュニケーションツール Comm On AIR 2.0

この新機能を用いてjarファイルを実行したかったのですが、
ちょっと面倒な実装になってしまったのでメモしておきます。

ちなみに環境はMacOSX(雪豹)です。
winだとjarファイルを直接渡しても実行してくれるのかなぁ(javaw -jar hoge.jar)。

結論としては、jarファイル単体実行が結局うまくいかずshのラッパーを用意しました。

  • bin/exec.jar
  • bin/wrapper.sh

という感じでアプリケーションに実行ファイルを含めておきます。

exec.jarはマニュフェストファイルが存在する実行可能jarファイルで固めてあります。
wrapper.shの中身はこんな感じです。

#!/bin/sh

# 単純にjava -jarで第一引数に実行対象のjarファイルを渡す。
# jarファイルにパスが通っている前提
$(java -jar $1)

java -jarコマンドを実行時に$1でwrapper.shに渡された
引数(これが実行対象のjarファイルになります)をそのまま指定しています。

Air2.0側では、以下のような実装を書きました。

var info:NativeProcessStartupInfo = new NativeProcessStartupInfo();
// 実行対象のファイル(ラッパー)を指定
var file:File = File.applicationDirectory.resolvePath("bin/wrapper.sh");
info.executable = file;

// wrapper.shに渡す引数を指定
var args:Vector.<String> = new Vector.<String>();
// 相対指定だとAirのランタイムからの指定になってしまうので、
// 実際にjava -jarコマンドに渡したいファイルの絶対パスを解決する。
var jarFile:File = File.applicationDirectory.resolvePath("bin/exec.jar");
args.push(jarFile.nativePath);
info.arguments = args;

// 実行
this.process = new NativeProcess();
process.start(info);

ソースコード上のコメントにもありますが、
ネイティブプロセスによって実行されたファイルのカレントディレクトリ(pwd)が、
AirのRuntimeになってしまうようで、アプリ内に存在するファイルの
絶対パスを解決して渡しているとう微妙な実装をしています。

以上。

めちゃめちゃ泥臭い実装なんですが、
よりより方法があれば誰か教えてください。

Posted in program | タグ: , , , | 1 Comment »

Air2.0β版のruntimeがぶっ壊れた

Posted by hikaruworld : 2009 11月 20

Air2.0のβ版を触っていたんですが、とあるアプリケーションをインストールしようとしたらエラーに。

bfa表_The application could not be installed because the installer file is damaged. Try obtaining a new installer file from the application author.

なんだか、他のところでも発生している事を@shoitoに教えてもらいました。

回避策は、AdobeAirのruntimeの再インストールで発生しなくなりました。
…MacのUninstallerを探すのが大変でした。

ちなみに、FlashBuilderでデバッグしようとするとこんなエラーになります。

Error: Error #0
	at flash.filesystem::FileStream/close()
	at com.adobe.air.logging::FileTarget/write()[/Users/mesh/src/as3corelib/src/com/adobe/air/logging/FileTarget.as:86]
	at com.adobe.air.logging::FileTarget/http://www.adobe.com/2006/flex/mx/internal::internalLog()[/Users/mesh/src/as3corelib/src/com/adobe/air/logging/FileTarget.as:78]
	at mx.logging.targets::LineFormattedTarget/logEvent()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\logging\targets\LineFormattedTarget.as:163]
	at mx.logging::AbstractTarget/logHandler()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\logging\AbstractTarget.as:332]
	at flash.events::EventDispatcher/dispatchEventFunction()
	at flash.events::EventDispatcher/dispatchEvent()
	at mx.logging::LogLogger/info()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\logging\LogLogger.as:182]
	at net.fxug.hokuriku.chocolat.helper::SORAAIHelper/checkForUpdate()[/Users/morizou/Documents/Adobe Flash Builder Beta 2/soraai/src/net/fxug/hokuriku/chocolat/helper/SORAAIHelper.as:70]
	at net.fxug.hokuriku.chocolat.helper::SORAAIHelper/creationCompleteHandler()[/Users/morizou/Documents/Adobe Flash Builder Beta 2/soraai/src/net/fxug/hokuriku/chocolat/helper/SORAAIHelper.as:65]
	at flash.events::EventDispatcher/dispatchEventFunction()
	at flash.events::EventDispatcher/dispatchEvent()
	at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9408]
	at mx.core::UIComponent/set initialized()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\core\UIComponent.as:1169]
	at mx.managers::LayoutManager/doPhasedInstantiation()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:718]
	at Function/http://adobe.com/AS3/2006/builtin::apply()
	at mx.core::UIComponent/callLaterDispatcher2()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\core\UIComponent.as:8733]
	at mx.core::UIComponent/callLaterDispatcher()[C:\autobuild\3.4.0\frameworks\projects\framework\src\mx\core\UIComponent.as:8673]

今回のAir2.0では、ネイティブアクセスが部分が強化されているので
何かしら影響が出てるのかもしませんね。

Posted in program | タグ: , | Leave a Comment »