FPDFを使った場合のHeader出力

PHPでPDFを出力する際、FPDFクラスを使用する場合、(FPDF1.52 Japanese.php適応)Headerがうまく出力されなくて困った。

通常、FPDFクラスを継承してクラスを作成し、Headerメンバの内容をオーバーライドして使用する。その場合、Fontをセットしておかないと1ページ目のデータが出力されない。


※これでは1ページ目のデータが出ない。

 function Header()
 {
  //右へ移動
  $this->Cell(80);
  //境界線に囲まれたタイトル
  $this->Cell(30,10,'Title',1,0,'C');
  //改行
  $this->Ln(20);
 }


※これは正常に出力

 function Header()
 {
  //Arial bold 15のフォントを指定する
  $this->SetFont('Arial','B',15);
  //右へ移動
  $this->Cell(80);
  //境界線に囲まれたタイトル
  $this->Cell(30,10,'Title',1,0,'C');
  //改行
  $this->Ln(20);
 }

次ページへのPOST

ボタンクリックで次ページへフォームの内容をPOSTする方法についてメモ。

・送信元
ボタンのPostBackUrlプロパティに、送信先URLを指定。

送信先
Page_Loadイベント内で、PreviousPageクラスから情報を取得

  Protected Sub Page_Load(ByVal sender As Object, _
              ByVal e As System.EventArgs)
    If Not Me.Page.PreviousPage Is Nothing Then
      Dim text1 As TextBox _
        = CType(Me.Page.PreviousPage.FindControl("TextBox1"), _
            TextBox)
      If Not text1 Is Nothing Then
        Me.resultLabel.Text = text1.Text
      End If
    End If
  End Sub

ググってもなかなか出てこなかった。
結構陥りやすいと思うのだが・・・。
ASP.NETでは、基本自画面にPostBackだからか?

XMLのValidateおかわり

先日、XMLのValidateをやったのだけれど、
どうもあの方法は上手くない。
つーか、サーバ上での操作であれば、あれでいいのだけれど、
Validateをたとえば、アプレットのようなクライアントツールで動かす場合、
一時ファイルをクライアント側に作らせるわけにはいくまい。

・・・ということで、以下のように直してみた。
つーか、こっちが普通なんだろうけれどね。


やりたいことは、
任意のXMLドキュメントに対して、任意のDTD(またはXMLSchema)のValidateチェックを行うというもの。

とりあえず、XMLドキュメントをtrancefoamerオブジェクトで変換。
このときに、dtdの場合はDOCTYPEを指定する。

   //ドキュメントを変換して出力
   TransformerFactory transFactory = TransformerFactory.newInstance();
   Transformer transformer = transFactory.newTransformer();
   transformer.setOutputProperty(OutputKeys.ENCODING, XML_ENCODING);
   transformer.setOutputProperty(OutputKeys.INDENT, "yes");
   transformer.setOutputProperty(OutputKeys.METHOD, "xml");
   transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, "dtdのURL");

その後、変換したオブジェクトを一旦ストリームに吐き出す。
ストリームは、バイトストリームを使用。

   out = new ByteArrayOutputStream();
   StreamResult result = new StreamResult(out);
   
   transformer.transform(source, result);
   byte[] bt = out.toByteArray();
   
   
   //生成先となるXMLドキュメントを作成
   DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
   dbf.setValidating(true);
   dbf.setNamespaceAware(true);
   DocumentBuilder db = null;

出力したバイトストリームの変換結果が、resultに保持されているので、
その結果を、入力ストリームに変換し、XMLドキュメントを生成。

   Document doc = null;   
   in = new ByteArrayInputStream(bt);   
   try {
    doc = db.parse(in);
   
   } catch (IOException ex) {

   } catch (SAXException ex ) { 
     errMessage = ex.getMessage();
   }catch(Exception e){
    throw e;
   }

かなりはしょったけれど、とりあえず順序的にはそういう感じ。
Javaのストリームがよく分からないので、まだまだ試行錯誤だな。

JFileChooserなんかをWindowsライクにする

アプレットクラスに所属する、UIManagerにWindowsLookAndFeelをセット。

try {
   UIManager.setLookAndFeel(
     "com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception e) {

}

JFileChooserだけWindowsライクにしたいなら、Chooserインスタンスを生成している部分で呼び出せばOK(多分)

アプレットに慣れていないと忘れやすいのでメモ。

XMLのValidate

XMLにSchemaのパスを指定していることを前提にしていれば、
ドキュメントを作成するときに、validate値をtrueにすればエラーは取れるのだけど、
XMLにDocumentTypeやxsdを指定していないものに対して、
別途Schemaファイルを使ってValidateしたいというときは、この方法が取れない。


そういうときにどういう方法をとれば一番手っ取り早いのか悩みちゅ。


ひとまず動かしているのは、
xmlをドキュメントに取込→Schemaを指定してtransform→一旦ファイルにOutputしてドキュメントに出力→Outputしたファイルを削除。


なんかダサイけど・・・。
いい方法ないかな。



実装はこちらのページを参照しました。
http://www.ki.rim.or.jp/~kuro/XML/index.html


上記ページのやり方と違うのはで、ドキュメントを取り込む前に、
XMLDTDを指定(XMLSchemaの場合はxsdの指定)をして、
通常通りtransformします。
指定するSchemaファイルのパスは、絶対指定で(別に相対指定でもOKだけど)


パスの指定の時、フォルダ名にスペースが入っていたら通らなかったのは内緒の方向で。

EclipseでJRE1.4とJRE1.5の共存。

プロジェクトごとに代替JREの指定でビルドJVMを指定することは可能なんだけど、同じサイト内に違うJREを使っているプロジェクトが存在するのはキモチワルイので。
JRE1.4系と1.5系で、別々のワークスペースを使って開発を行うことにしました。

Eclipse.exeのショートカットを作成し、引数に、

C:\eclipse\eclipse.exe -vm [参照JREのjavaw.exeパスを指定] -date [ワークスペースのパス]

同じワークスペース内で違うJREを参照しなくても済むようにってことで、こういう感じにしたんだけど、普通はプロジェクト毎に代替JREを指定しているのかな?それとも違うのかな?
一応Eclipseは3.1ですが、どちらも問題なく使用できてます。