Lift で PDF を出力する [2]

今回は、前回サーバ上にファイルとして生成していたPDFをブラウザからクライアントがダウンロードするように修正してみたいと思います.

今回は前回のソースコードを修正し実行しますので、前回までの手順はあらかじめ実施しておいて下さい.

本Webアプリは、始めの画面は次のようなものになります.

トップ画面

《 トップ画面 》

左側にあるDownload PDFをクリックするとPDFのダウンロードを開始します.

前回の Snippet ソースコードは次のように修正して下さい.

《 src/main/scala/code/snippet/GeneratePDF.scala 》
package code.snippet

import scala.xml.{NodeSeq, Text}

import net.liftweb.util._
import net.liftweb.common._
import net.liftweb.http.{InMemoryResponse, LiftResponse}
import net.liftweb.http.SHtml._
import net.liftweb.http.js.JsCmds._
import net.liftweb.util.Helpers._

import java.io.{StringReader, ByteArrayOutputStream}
import java.util.Hashtable
import javax.xml.parsers.DocumentBuilderFactory
import org.xml.sax.InputSource

import com.brainsellers.xml.JaxpXML
import com.brainsellers.xml.page.PDFEngine
import com.brainsellers.xml.datatypes.{HashtableType, RecordType}

import code.lib._
import code.model._

object GeneratePDF {

  val layoutXml =
  <Layout width="210mm" height="297mm">
      <Star Radius="70mm" FillColor="#99ccff" X="105mm" Y="148.5mm"/>
    <watermark fit="horizon" align="vertical" text-align="center" rate="80" line-align="center">
      <watermark-text name="watermarkText1" font-color="red" text-rendering="stroke"></watermark-text>
    </watermark>
  </Layout>

  def nodeSeqToDocument(xml: NodeSeq) =
    DocumentBuilderFactory.newInstance.newDocumentBuilder.parse(
      new InputSource(new StringReader(xml.toString)))

  def makePDF: Array[Byte] = {
    val name = User.currentUser.dmap("Guest") {_.niceName}
    val ht = new Hashtable[String, String]
    ht.put("watermarkText1", name)
    val outputStream = new ByteArrayOutputStream
    val pdfEngine = new PDFEngine(outputStream)
    val bizLib = new JaxpXML(nodeSeqToDocument(layoutXml), pdfEngine)
    bizLib.parse
    bizLib.calcDataSize
    bizLib.toPDF(ht)
    bizLib.close
    outputStream.toByteArray.asInstanceOf[Array[Byte]]
  }

  def downloadPDF: Box[LiftResponse] = {
    Full(InMemoryResponse(makePDF,
      ("Content-Type" -> "application/pdf") :: Nil, Nil, 200))
  }
}
  • 24行: GenetatePDFクラスをGeneratePDFオブジェクトに変更します.
  • 38行: 前回のgetPDFメソッドをmakePDFメソッドへ変更しています.makePDFメソッドではPDFファイルデータのByte配列を生成します.
  • 52行: makePDFメソッドで生成したデータをブラウザへレスポンスとして返信します.

Liftの起動時に実行されるBootクラスに次の文を追加します.

《 src/main/scala/bootstrap/liftweb/Boot.scala 》
...
class Boot {
  def boot {
    ...
    val entries =
      ...
      List(Menu("Download PDF") / "downloadPDF") :::
      ...
      Nil
    ...
    LiftRules.dispatch.append {
       case Req(List("downloadPDF"), _, _) => () => GeneratePDF.downloadPDF
     }
    ...
}
  • 7行: サイトマップ(左側に出ているメニューのこと)に"Download PDF"を追加しています.
  • 11行: /downloadPDFへリクエストがきたときにGeneratePDFオブジェクトのdownloadPDFメソッドを呼びます.
biz-Stream詳細情報  biz-Stream資料請求

超高速!!高機能!! Web帳票ソリューション biz-Stream

オンデマンドかつリアルタイムにビジネスドキュメントを生成する帳票ソリューション