今回は、前回サーバ上にファイルとして生成していた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メソッドを呼びます.