package controllers
import play.api._
import play.api.mvc._
import java.io._
import org.apache.batik.dom.svg._
import org.apache.batik.transcoder._
import org.apache.batik.transcoder.image._
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.Document
import java.awt.Rectangle
import org.apache.fop.svg.PDFTranscoder
import play.api.libs.iteratee._
import play.api.data._
import play.api.data.Forms._
case class Image(
filename:String,
scale:Int,
imagetype:String,
svg:String
)
object Application extends Controller {
val imageDataForm = Form(
mapping(
"filename"->text,
"scale"->number,
"type"->text,
"svg"->text
)(Image.apply)(Image.unapply)
)
def index()=Action{implicit request =>
Ok(views.html.index())
}
def makeImage()=Action{implicit request =>
val image=imageDataForm.bindFromRequest.get
val is=new ByteArrayInputStream(image.svg.getBytes())
import scala.concurrent.ExecutionContext.Implicits._
Ok.chunked(Enumerator.outputStream { os =>
val tin=new TranscoderInput(is)
val tot=new TranscoderOutput(os)
getTranscoder(image.imagetype, 0.7f) match{
case Some(x) =>{
println("transcode:x="+x)
x.transcode(tin,tot)
}
case _ => None
}
os.flush
os.close
println("flush")
} >>> Enumerator.eof).withHeaders(
"Content-Type" -> (image.imagetype),
"Content-Disposition"->("attachment; filename="+image.filename)
)
}
def getParameter(request:play.api.mvc.Request[play.api.mvc.AnyContent],str:String) = {
request.queryString.get(str).flatMap(_.headOption) match {
case Some(x) => x
case None => ""
}
}
def getDocument(is:InputStream):Document ={
val parser = XMLResourceDescriptor.getXMLParserClassName()
val f = new SAXSVGDocumentFactory(parser)
val doc = f.createDocument("http://www.w3.org/2000/svg",is)
return doc
}
def getTranscoder( transcoderType:String, keyQuality:Float ) :Option[Transcoder]={
println("getTranscoder:"+transcoderType)
transcoderType match{
case "image/jpeg" =>Option(getJPEGTranscoder(keyQuality))
case "image/png" => Option(getPNGTranscoder())
case "application/pdf" => Option(new PDFTranscoder())
case _ => None
}
}
def getJPEGTranscoder( keyQuality:Float):JPEGTranscoder= {
val jpeg = new JPEGTranscoder()
jpeg.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, keyQuality)
return jpeg
}
def getPNGTranscoder() :PNGTranscoder={
return new PNGTranscoder();
}
}