How to create PDF file

仕事柄、いろいろな定型的な資料を作成しています。ここで、印刷物、配布物としては環境依存性が低いPDFを使いたいと考えているのですが、Acrobat のような高価なツールを用意しなくても、簡単にPDFを作成する方法がないかと探しています。

まっさきに思いつくのは、ps2pdfです。PostScriptファイルがあれば後はコマンドで変換ができます。Windowsでドキュメントをプリントするにあたり、PostScriptプリンタを使って、ファイルへ出力すればPostScriptファイルは簡単に入手できます。これを、Webインタフェースでアップロードすると、ps2pdfコマンドが実行されて、PostScriptファイルからPDFへ変換するアプリケーションをPHPなどで作成するということが考えられます。たぶん、PHPについて勉強しながらでも、4時間あればできてしまうのではないでしょうか。

帳票などは、ExcelやOpenOffice Calcのテンプレートを用意して、そこへ値を適用してPDFを出力するという方法が考えられます。OpenOffice.orgとJooReportsを利用すると、JavaからPDFを出力することができるようです。この組み合わせの場合は、対象ファイルはWordやPowerPointまで拡張できるので、応用性が非常に高くなります。OpenOffice.org SDK + UNO は使い方が若干難しいので、ライブラリをうまく利用してプログラムは効率よく開発したいところです。

CodeZine:OpenOffice.orgとJooReportsを利用してJavaからPDFを出力する(java, PDF, サーブレット, 帳票)
http://codezine.jp/a/article/aid/131.aspx

こうやってできあがったPDFファイルを複数の人へ配布したいのですが、どんな方法があるでしょうか。メールでファイルが生成されてダウンロードできるようになったことを通知するということが考えられます。認証情報が必要になることもありますが、.htaccessファイルの生成をすればそれほど難しくはないはずです。

こういうちょっとしたプログラムを作成するのは、案外楽しい物です。

KisoJava 5

改訂版基礎Javaを執筆するにあたって意識した事 その5

KisoJava 4」ではPart 1のサンプルについて考えた事を述べました。今回は、数値の表現や文字の表現について説明した理由について述べます。

プログラミングを意識するまでは、なぜ2進数しか扱えないコンピュータが文字を表示することができるのかを考えた事もない人が多いはずです。そのせいか、コンピュータ画面に表示される「1」は、内部でも1の値だと勘違いしてしまう人が多いようです。何を言っているのか難しいですね。説明がしにくいのですが、文字としての「1」と数値としての「1」は違うものなのですが、それがなかなか理解できないのです。

プログラミングを理解するにあたり、このことについて理解することは、実は必須ではありません。計算ができればいいということなら、JavaであればIntegerなどを使って計算すれば何の問題もなく計算できますから、わざわざコンピュータ内で数値や文字がどのように表現されているのかというのは知らなくても、とりあえず、こう書けばいい、と覚えてしまえば、なんとかなるのです。

では、なぜわざわざ書いたのかというと、日本語を扱うにあたっては必ず文字の表現方法については理解が必要となる場面に会いますし、そのときに文字コードの原理だけでも知っておけばずいぶんと違うだろうと思ったのと、整数や小数点数もどうやって2進数で表現しているのかを原理的に知っておけば応用がききますから、避けて通るべきではないと考えたのです。こういった表現方法がいろいろあるということを理解できると、データ型がなぜ存在しているのかも理由がわかるはずです。データ型を導入することにより、メモリをどうやって使うのか、どの領域に文字をいれるのか、数値をいるのか、といった計算を人間がしなくても済むようになりました。こういった計算は、ソースコードをコンパイラがコンパイルするときに行って、問題がないかチェックしてくれるようになったのです。

また、単純なプログラムを使う事で、2進数の世界を簡単に表現できるのも、ぱっと見は地味なのですが奥が深くて良い例題だと思っています。「ファイルにどんな値が入っているのかをバイナリデータとして表示するプログラム」というのは、ファイルを生成するプログラムなどで文字化けが発生していた時に確認のために使えたりします。もちろん便利な既存のツールを使ってチェックすることもできますが、そういったツールがどうやって実装されているのか想像できるようになるという点が重要だと考えています。

問題解決のためにダンプデータをとるといった作業を、学習の最初の方で経験しておけば、次にそれが必要な場面に出会ったときに、それほど難しい作業だとは思わないのではないでしょうか。そういったプログラムはプログラミング学習とは別の機会に勉強すればいいのかもしれませんが、せっかくプログラムを作るのだから、後でも役に立つプログラムをと思ったのです。もちろん、プログラム自体よりは、アイデアというか、考え方が後でも役に立つというのが重要だと思っています。そういう意味で、地味ですがいいプログラムをサンプルとして提示できていると自負しています。

ところで、残念だったのは、画像ファイルを解析するプログラムも提示したかったのですが、都合により採用にいたらなかったという点です。ここのブログで、BMPファイルを解析するためのCで書かれたプログラムを紹介しているのですが、それのJava版も紹介したかったのです。ところが、そこまで気力がでなかったり、紙面の都合もあったりで、ボツとなりました。画像ファイルのフォーマットは、それはそれで面白いので、また機会があったら紹介してみたいところです。

KisoJava 4

改訂版基礎Javaを執筆するにあたって意識した事 その4

KisoJava 3」ではIDEを採用しなかった理由について説明をしました。今回はPart 1のサンプルプログラムについて考えた事を整理してみます。

実際にプログラミングができるようになるためには、興味深いテーマを扱うのが一番なのですが、これは読者にとって様々であるため、これ、と決めるのは難しいものです。できるだけ色々な文法事項を説明できるもので、しかもシンプルな題材ということで、「テキストファイルを読み込んで、行番号つきで表示するプログラム」というものにしました。

Part 1では、「逐次処理」、「繰り返し処理」、「条件分岐処理」といった処理を基本単位として、これらの「基本となる処理」を組み合わせることにより、プログラムが作成できることを説明しています。ゴールとなるプログラムを完成するためには、こういった処理が必要、そのために、こういった文法が用意されている、といった形で説明をするように意識しています。厳密な文法の説明をしているわけではありませんし、ステップ方式で説明をしているので、それほど難しいと思うことなく、学習を進める事ができるはずです。ですから、順に読んでいけば、本書に書いてある通りのプログラムを作る事はできるようになるはずです。

本書のPart 1の内容を理解できれば、基本的には好きなプログラムが作れるようになるはずですが、そうなれる読者は一般的には多くはないと思います。本書で紹介してあるプログラムを真似して動かすだけではなく、自分で考えてプログラムを創り出すことができるようになるためには、壁があるのです。この壁を乗り越えるのは難しいのですが、こればっかりは自分で乗り越えてもらうしかありません。野球で言ったら、「ボールの投げ方は教えた」という段階であり、この後、自分で何度もボールを投げる練習をすることによって、はじめてボールを投げられるようになるというのと同じです。

話をサンプルプログラムに戻します。扱っている題材や、実際に行っている処理は、きわめてシンプルなものなので、サンプルプログラムを実行するところまでやってみても、大きな達成感はないかもしれません。読者としては苦労して達成感のあるプログラムを作成してみたいと思うかもしれませんが、執筆者としては、初心者が苦労することもなく、サンプルプログラムを実行できてPart 1を終わる事ができるなら、その方がいいと考えています。一番心配なのは、「ファイルを読んで行番号をつけて表示するプログラム」の有用性がよくわからないまま読み進んでしまうことです。そうすると、サンプルで提示しているプログラム全体が文法事項を説明するためだけのサンプルのように感じてしまい、内容的につまらないプログラムだ、と感じてしまうはずだからです。

「ファイルを読んで行番号をつけて表示するプログラム」が有用だと思う理由は、プログラムの仕様は「入力、出力、処理内容」で定義することができ、それを実現しているからです。このサンプルは、テキストデータについて、「データを読み込んで、加工処理をして、データを出力する」という基本的なデータ処理プログラムであり、処理内容自体は難しくありませんが、考えれば考えるほど味がでてくる例なのです。これを理解できれば、テキスト処理のプログラムを作成する事は、それほど難しくありません。

サンプルプログラムの題材については、厳選したつもりですが、ゲームを題材にしたり、GUIアプリケーションを題材にしたりした方が面白いはずだ、といった意見もあるでしょう。機会があれば、そういったテーマを使った書籍も執筆してみたいところですが、今回は比較的固めのテーマを採用しました。

KisoJava 3

改訂版基礎Javaを執筆するにあたって意識した事 その3

BeanShellを使う事についてのメリットを「KisoJava 2」で書きましたが、実は統合開発環境(IDE)と言われるEclipseやNetBeansを使うと言う選択肢もありました。しかし、今回はそれらを採用しませんでした。編集部さんが別途Webサイトにページを用意してくださり、そこにIDEを使う場合の解説をしてくれています。(改訂新版 基礎Java−統合開発環境。ちなみに、impress Direct:改訂新版 基礎Javaでは立ち読みもできると書いてありますね。iBookのFirefoxではうまく動作しませんでしたが…)

IDEを使ったJavaプログラミングの入門としては、Eclipseを使ったものを@ITで記事(@IT:Eclipseではじめるプログラミング)として執筆した事があります。そのときに、意外とEclipseについての説明が多くなってしまうため、プログラミングについての説明が減ってしまうと思いました。また、学校などでは、いろいろな開発環境を使って教えているので、Eclipse、NetBeansを使うと絞ってしまうと、Javaプログラミングの参考書として推薦されにくいという事情があります。また、IDEは結構頻繁にバージョンアップされるため、それに依存するような入門書にしてしまうと、学校のように毎年のカリキュラムが決まっていて、毎年大体同じように教えているところでは使いにくいということになりそうです。とはいえ、最近またJDKがバージョンアップされた事からもわかるように、JDK自体も頻繁にバージョンアップされるので、書籍についているもので完結しておく、という割り切りも必要なのかもしれません。

いずれにせよ、使っているIDEに強く依存していると、読者が限定されてしまいますので、本書のようなスタイルになりました。とはいえ、本書ではPart1はBeanShellに依存しているので、この部分の評価が大きく影響しそうです。そのことを考えると、「BeanShellで学ぶプログラミングの常識」、「Javaで学ぶプログラミング入門」、「Javaで学ぶオブジェクト指向プログラミング」という3分冊にすることにより、BeanShellに依存する部分を切り離すことも考えられたのですが、分冊形式は読者にとっては割高感がありますし、3冊持ち歩くことになるのも嫌だろうと思って、Part1、Part2、Part3構成の1冊にまとめたのでした。

BeanShellは、クラスの説明やメソッドの説明をすることなく、Javaの文法を使ってプログラミングの常識を理解してもらえるベストソリューションだと、個人的には思っています。学校で参考書指定をもられると一番良いのですが、本屋さんで独習のために良い本がないかと探す読者も多いはずですから、そういう人が地道に理解を深めるためには、コンパイラ方式よりもインタプリタ方式で確認できた方がいいはずです。

もちろん、プログラミング経験がどれくらいあるのか、コンピュータをどれくらい使ったことがあるのか、そういった点が影響してくるので、他の方法と比較してこれがいい、と断言するのは難しいものです。実際のところ、Visual C++などを使った事がある人は、EclipseやNetBeansから入った方が効率的でしょうし、実際に使用するIDEが仕事場などで決まっているなら、それを使う入門書を読んだ方がいいかもしれません。ただし、個人的には、Javaプログラミングの入門については本書のような学習用参考書を、Eclipseについて知りたい場合はEclipse解説本を、それぞれ購入することを推薦します。つまり、目的に応じて選ぶということです。その結果、Eclipseを使ったプログラミング入門書を1冊購入すればいいという結論になることもあるでしょう。

KisoJava 2

改訂版基礎Javaを執筆するにあたって意識した事 その2

しばらく、このネタでいこうと思っています。今日、東京駅の近くにある丸善に行ったところ、嬉しい事に目立つところに置いてもらってありました。帯が見えるように置いてもらえると、やはり嬉しいものです。

さて、本書はJavaプログラム初心者のために、Javaプログラムを実行するところから説明を始めています。なぜそうしたのかは、「KisoJava 1」で説明しましたが、実はBeanShellというJavaプログラムをここで紹介しておきたかったというのもあります。本書で詳しく説明していますが、これはJavaプログラムをインタプリタ実行するアプリケーションです。これを使う事により、プログラムを入力したらすぐに実行することができるようになりました。初心者にとっては、入力した命令がすぐに実行されて結果が出るという事がわかりやすいだろうと考えて採用したのです。

オブジェクト指向プログラミングを理解するまでには、「プログラミングの常識」とも言えるいくつかの事項を先に理解する必要があるので、それをインタプリタを使って説明したいと考えました。インタプリタを採用するメリットとしては、すでに説明をした「入力後にすぐ実行できる」ということの他にも、「入力するコードが短くて済む」ということもあります。Javaプログラムはクラスというものを基本単位とするので、例えば「class A { public static void main(String[] args) { System.out.println(0); }」と書かないと動作させることができません。しかし、プログラミングの常識を学習するにあたって、ここで実行したいのは「System.out.println(0); 」のプログラムの部分だけなのです。キーボード入力がなかなかうまくできないうちは、入力が必要なコードが多いと大変です。そんな人にとっては、入力をしたらプログラムを動作させることができるわけではなく、コンパイルしてからでないと動作させることができない、というのはかなり辛いことでしょう。さらに、コンパイル中にエラーがでたときには、サンプルとにらめっこしながら、どこがおかしいのかと文字の比較をしないといけません。こういった作業はもちろんプロフェッショナルになるなら乗り越えないといけませんから、避けることはできませんが、本書ではこの作業はずっと先にいってからになります。

ということで、Javaの文法を使って書いたプログラムを実行できるインタプリタを探したところ、ちょうどBeanShellという素晴らしいJavaアプリケーションがあったので使わせてもらう事にしたのです。このアプリケーションのおかげで「1行から実行」を実現する事ができました。感謝、感謝です。また、知る人ぞ知る、ですが、BeanShellはJDK6から導入されたScriptingFrameworkにも対応しているはずなので、これを知っていて損をする事はありません。もっと有名になってもおかしくないJavaプログラムのうちの1つだと個人的には思っています。とはいえ、このあたり、Eclipseがいい、NetBeansがいい、JDKだけでいい、BlueJがいい、と色々な意見があると思いますので、好みで分かれるのだと思います。

KisoJava 1

改訂版基礎Javaを執筆するにあたって意識した事 その1

プログラミングについて理解する前に、まずはコンピュータがどういうものなのか、どう使うことができるのか、どれくらい便利なものなのか、といったことを知らないと、興味がわかないのではないか、と考えています。最近は、学校でパーソナルコンピュータを使ったり、携帯ゲーム機や携帯電話などで使っているので日常的にコンピュータを使っていますから、コンピュータがあるとどれくらい便利なのか、ソフトウェアとはどういうものか、といった基本的な部分については知っている人が多いはずです。そういう意味では、自分がプログラミングについて勉強をしたころに比べると、遥かに良い環境なのだと思います。

そんなことを思いながら、Javaを使ったプログラミングを勉強しようと思った人がまず理解した方がいい事は何か、と考えたところ、Javaのプログラムを実行する方法だと思いました。これから勉強しようとしているプログラム言語で、いったいどういったプログラムを作成することができるのか、作ったプログラムはどうやって実行することになるのか、こういった部分はプログラミングには直接関係ありませんが、重要な事です。プログラムを動かすためには、まず自分でプログラムを作成することから始める、という順番でもいいのですが、先にどういうものが実現できるのかを知った方が興味を持てるのではないかと思ったのです。

ということで、Javaプログラムの例としてBeanShellとRobocodeを持ってきて紹介しています。これらを実行するためには、JREが必要なので、それをインストールすればJavaプログラムが動く事を説明し、どうやってJavaプログラムを実行することができるのかも説明しています。

コンピュータを使い慣れていない人が、プログラムを勉強するということはないと思いますが、JavaプログラムはWindowsアプリケーションの中ではちょっと特殊ですから、やはり、こういった常識的な部分から入って行くのがいいのではないか、と考えた結果なのです。

JREのインストール、Javaプログラムを実行してみる、というプログラミング以前のことを導入に持ってきているJavaの入門書籍はあまり見かけないのですが、皆さんの評判はどうなのでしょう。気になります。:)

How to execute JBoss Seam booking sample

C:\applicaition へ、jboss-4.2.2.GA と jboss-seam-2.0.1.GA をインストールしたとします。なお、Apache Antがサンプルのデプロイ時に必要です。

build.properties に下記を追加
jboss.home=C:/application/jboss-4.2.2.GA

デプロイは簡単で、C:\applicaition\jboss-seam-2.0.1.GA\examples\booking をカレントディレクトリとしてantを実行するだけです。

JBossの実行は C:\applicaition\jboss-4.2.2.GA\bin\run.bat です。停止はC:\applicaition\jboss-4.2.2.GA\bin\shutdown.bat -S となります。

その後、http://localhost:8080/seam-booking/ へアクセスするとサンプルが稼動しています。

カテゴリー: Java