前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pdf.js分片加载、分段加载golang beego

pdf.js分片加载、分段加载golang beego

作者头像
hotqin888
发布2021-12-06 15:27:32
20.2K2
发布2021-12-06 15:27:32
举报
文章被收录于专栏:hotqin888的专栏hotqin888的专栏

走了不少弯路,把问题搞复杂了。开始以为文件流就是分片下载,其实不是。

旧版的pdf.js好像不需要设置,自动就是支持分片加载的。

1 服务端golang beego

http.serverfile本身自动支持分片下载的,不用操心。

代码语言:javascript
复制
// @Title dowload standardpdf
// @Description get standardpdf by id
// @Param id path string  true "The id of standardpdf"
// @Success 200 {object} models.GetAttachbyId
// @Failure 400 Invalid page supplied
// @Failure 404 pdf not found
// @router /downloadstandard/:id [get]
// 下载pdf
func (c *StandardController) DownloadStandard() {
	id := c.Ctx.Input.Param(":id")
	//pid转成64为
	idNum, err := strconv.ParseInt(id, 10, 64)
	if err != nil {
		beego.Error(err)
	}
	//根据id取得规范的路径
	standard, err := models.GetStandard(idNum)
	if err != nil {
		beego.Error(err)
	}

	fileurl := strings.Replace(standard.Route, "/attachment/", "attachment/", -1)

	filename := path.Base(fileurl)
	fileext := path.Ext(filename)

	filepath := strings.Replace(standard.Route, "/attachment/", "./attachment/", -1)
	http.ServeFile(c.Ctx.ResponseWriter, c.Ctx.Request, filepath)//这个自动支持分片下载
}

2 前端

viewer.html页面不需要修改。如果需要,则修改viewer.js和pdf.js等引用文件位置

修改一下web\viewer.js

代码语言:javascript
复制
  disableAutoFetch: {
    value: true,//false,
    kind: OptionKind.API + OptionKind.PREFERENCE
  },

修改引用位置,如果没问题,则不需要修改

代码语言:javascript
复制
  workerSrc: {
    value: "/static/pdf/build/pdf.worker.js",
    kind: OptionKind.WORKER
  }

修改引用位置,如果没问题,则不需要修改

代码语言:javascript
复制
  defaultOptions.sandboxBundleSrc = {
    value: "/static/pdf/build/pdf.sandbox.js",
    kind: OptionKind.VIEWER
  };

修改build\pdf.js 中分片大小

代码语言:javascript
复制
const DEFAULT_RANGE_CHUNK_SIZE = 65536*16;//*16即分片为1M

修改引用位置,如果没有问题,则不需修改

代码语言:javascript
复制
if (_is_node.isNodeJS && typeof require === "function") {
    isWorkerDisabled = true;
    fallbackWorkerSrc = "/static/pdf/build/pdf.worker.js";
  } else if (typeof document === "object" && "currentScript" in document) {

用一个40M的文件测试一下,效果如下:

相关知识:

实现过pdf.js默认一次性加载所有page,加载整个pdf - 53BK报刊网

pdf.js的一些参数:

initialData TypedArray 带有第一部分或全部pdf数据的类型化数组。由扩展使用,因为在切换到范围请求之前已经加载了一些数据。

disableRange 布尔 (可选)禁用PDF文件的范围请求加载。启用后,如果服务器支持部分内容请求,则将以块的形式提取PDF。默认值为“false”。

disableStream 布尔 (可选)禁用PDF文件数据的流式传输。默认情况下,PDF.js会尝试以块的形式加载PDF。默认值为“false”。

disableAutoFetch 布尔 (可选)禁用PDF文件数据的预取。启用范围请求后,即使不需要显示当前页面,PDF.js也会自动继续获取更多数据。默认值为“false”。注意:还必须禁用流式传输,请参阅上文,以便禁用预取功能以使其正常工作。

实现过pdf.js默认一次性加载所有page,加载整个pdf

disableRange设为 true 即可

这样可以pdf.js可以实现pdf文件页码的自动选择(不重复加载pdf文件)

pdfjs优化,实现按需加载,节省流量和内存 - 小黑电脑

3.3 pdfjs关闭自动获取

  在pdfjs发行包的web/viewer.js文件中,找到配置项disableAutoFetch,可以看到它的默认值是false,意味着会自动获取所有分片。

  将它改为true,意味着关闭自动获取,它仅仅会下载所需要的分片,实现了按需加载。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-11-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 3.3 pdfjs关闭自动获取
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档