scalaJs对pdfJS的封装

封装代码,如下:

import scala.scalajs.js
import scala.scalajs.js.annotation._
package object pdfJS {

import org.scalajs.dom.CanvasRenderingContext2D

@JSGlobal("PDFJS")
@js.native
object PDFJS extends js.Object {
var workerSrc: String = js.native

def getDocument(url: String): PDFDocumentLoadingTask = js.native
}

@js.native
class PageViewport extends js.Object {
  val height: Double= js.native

  val width: Double = js.native
}


@js.native
class PDFPageProxy extends js.Object {
  def getViewport(scale: Double): PageViewport = js.native

  def render(params: js.Object): js.Promise[RenderTask] = js.native
}

@ScalaJSDefined
trait RenderContext extends js.Object {
  val canvasContext: CanvasRenderingContext2D
  val viewport: PageViewport
}


 @js.native
class RenderTask extends js.Object {

}

@js.native
class PDFDocumentProxy extends js.Object {
  def getPage(pageNumber: Int ): js.Promise[PDFPageProxy] = js.native

  val numPages: Int = js.native
}

@js.native
class PDFDocumentLoadingTask extends js.Object {
  def promise: js.Promise[PDFDocumentProxy] = js.native
  def onProgress:js.Object=js.native
}
}

这只是封装了一部分代码,还有好多东西由于没有用到就没有封装进去。目前PDFDocumentLoadingTask 中的onProgress的值一直为null 还没有理解,别的都可以正常使用。
下面是使用的代码:

object DrawPDF {

def draw(area: HTMLElement, url: String) = {

//1.8.618
PDFJS.workerSrc = "/zhishiku/static/js/pdf.worker.min.js"
val loadingTask = PDFJS.getDocument(url)

println(JSON.stringify(loadingTask))

println(loadingTask.onProgress)

loadingTask.promise.toFuture.map {
  rsp =>

    area.textContent = ""
    println(url + "PDF loaded")

    for (i <- 1 to rsp.numPages) {

      rsp.getPage(i).toFuture.onComplete {
        case Success(rsp1) =>
          println("Page loaded")


          val viewportDiv = rsp1.getViewport(1.5)

          val pdfArea = canvas("Your browser does not support the canvas element.").render

          area.appendChild(pdfArea)
          val context = pdfArea.getContext("2d").asInstanceOf[CanvasRenderingContext2D]


          pdfArea.height = viewportDiv.height.toInt+1
          pdfArea.width = viewportDiv.width.toInt+1

          val renderContext = new RenderContext {
            override val canvasContext = context
            override val viewport = viewportDiv
          }

          println(renderContext)
          println("2")

          val renderTask =
            try {
              rsp1.render(renderContext)
            }
            catch {
              case error: Exception =>
                error.printStackTrace()
                throw error
            }
          renderTask.toFuture.onComplete {
            case Success(rsp2) =>
              println("Page rendered")
            case Failure(error) =>
              println("rsp.render" + error)
          }
        case Failure(error) =>
          println("rsp.getPage()" + error)
        }
      }
    }
  }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,476评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 一 如果不是有人推荐,我永远不会去看这本《奇门遁甲》,甚至不会知道这个作家。周德东的书,不用说看了,听都没听说过。...
    丁若柯阅读 1,823评论 2 1
  • 君立河西牧, 妾坐河东织。 君常托鹊儿, 问我何不思? 非我不相思, 彻夜难入眠。 只为早相见, 披星弄机梭。
    帝都奇妙物语阅读 690评论 0 2
  • 母亲是一位被岁月搪塞了大半辈子的女人,这些年活得艰难,过得朴素,没什么事业,若非要说有,那大概就是养育了我兄弟俩。...
    一颗浮萍阅读 1,911评论 18 57