PDF.js 定制化 viewer.html 处理

之前介绍了前端 pdf 在线预览的几种方式,其中 PDF.js 中的 viewer.html 是可以自定义的。这篇文章就介绍了 viewer.html 是如何自定义的,例如多语言,工具条,自定义按钮等等

1. 多语言化处理

public/web/viewer.html 中有一个语言配置

直接改成中文locale/zh-CN/viewer.properties

其他语言的文件就可以删除了,没必要

因为目前项目是不用考虑多语言的

js 复制代码
// 更改前
<link rel="resource" type="application/l10n" href="locale/locale.properties" />

// 更改后,直接用中文
<link
  rel="resource"
  type="application/l10n"
  href="locale/zh-CN/viewer.properties"
/>

2. 移除文本、绘图、添加或编辑图像功能

如图所示,右上角功能分别为"文本"、"绘图"、"添加或编辑图像"功能

先在locale/zh-CN/viewer.properties找到对应的文件标签的中文对应

然后在 viewer.html 中根据标签名全局找到对应的元素按钮。

如下所示:

  • editor_free_text2_label=文本 -> id="editorFreeText"
  • editor_ink2_label=绘图 -> id="editorInk"
  • editor_stamp1_label=添加或编辑图像 -> id="editorStamp"

注意:不能直接删掉对应元素或者注释掉,会影响其他元素的展示,导致整体功能异常。

我使用了比较简单粗暴的方式,直接设置属性display: none

当然也可以改 viewer.js 代码实现,前提是要熟悉代码

实现方式肯定不止一种

3. 工具按钮功能自定义

按照上面同样的方式找到"工具"按钮对应的位置id="secondaryToolbarToggle"

这里面有很多功能,但是项目中只想保留"打印"和"保存"功能。

  • 打印:id="secondaryPrint"
  • 保存:id="secondaryDownload"

要去掉其他功能,直接设置属性display: none就太麻烦了,要一个一个处理,太多了。

最终解决方法:隐藏整体"工具"按钮,将"打印"和"保存"功能移动到之前的"文本、绘图"那块。

html 复制代码
<!-- 隐藏工具按钮:也是设置style="display: none" -->
<button
  id="secondaryToolbarToggle"
  tabindex="48"
  data-l10n-id="tools"
  aria-expanded="false"
  aria-controls="secondaryToolbar"
  style="display: none"
>
  <span data-l10n-id="tools_label">Tools</span>
</button>
<!-- 新增下载按钮:直接拷过来的,之前的代码需要删注释 -->
<!-- 不然会有两个id="secondaryDownload"的元素 -->
<button
  id="secondaryDownload"
  class="secondaryToolbarButton visibleMediumView"
  title="Save"
  tabindex="53"
  data-l10n-id="save"
>
  <span data-l10n-id="save_label">Save</span>
</button>

当然也可以不用将之前的按钮拷贝过来,直接自己写一个"下载"按钮事件即可。

js 复制代码
function handleDownload(o) {
  const a = document.createElement("a");
  // pdfPath = "合卷5-6.pdf"
  a.href = "../pdf/" + curMenu.pdfPath;
  a.download = curMenu.pdfPath;
  document.body.appendChild(a);
  a.target = "_blank";
  a.click();
  a.remove();
}

"下载"按钮事件表现形式:

  1. 在谷歌浏览器中,直接下载了,默认下载到定义的文件夹中了,没有提示
  2. 在 electron 中,会弹出一个下载框,用户可以更改下载的文件名和存储地址,如图所示:

4. 冗余代码删除

最后,根据需要的功能,在不影响功能的前提下,删除其他冗余代码。

删除后,仅剩的代码如下所示:

相关推荐
天天扭码几秒前
一分钟吃透一道面试算法题——字母异位词分组(最优解)
前端·javascript·算法
天天扭码12 分钟前
JavaScript 中字符串转字符数组的两种优雅方式
前端·javascript·代码规范
何遇er14 分钟前
在 AI 编程的热潮下对低代码的思考
前端·低代码·ai编程
何遇er17 分钟前
一句 Prompt 自动生成表单:我在低代码平台里是怎么接入生成式 AI 的
前端·低代码·ai编程
_一条咸鱼_19 分钟前
Vue 指令模块深度剖析:从基础应用到源码级解析(十二)
前端·javascript·面试
薯条不要番茄酱27 分钟前
【JavaEE初阶】多线程重点知识以及常考的面试题-多线程进阶(一)
java·前端·java-ee
只会安静敲代码的 小周1 小时前
uniapp上传图片时(可选微信头像、相册、拍照)
前端·微信·uni-app
kovlistudio1 小时前
红宝书第四十六讲:Node.js基础与API设计解析
前端·javascript·node.js
陈哥聊测试1 小时前
这款自研底层框架,你说不定已经用上了
前端·后端·开源
m0_zj1 小时前
41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5
开发语言·javascript·es6