当前位置: 首页 > news >正文

H5页面在线预览pdf

H5页面预览pdf

一般的做法是在浏览器中打开pdf文件,但是这种方式会导致浏览器的工具栏和地址栏也一起显示出来,影响用户体验。因此,我们需要在H5页面中实现一个预览pdf的功能,例如在网页或微信小程序中嵌入 PDF 文档,方便用户直接预览文件

一. 使用PDF.js 和 pdf.worker.js

pdf.jspdf.worker.js:PDF.js 的核心文件和 Worker 脚本文件。
有需要的可以从gitcode中获取

HTML 和样式设计

在 HTML 中,创建一个全屏的容器 pdf-container 用于展示 PDF 页面,并通过 CSS 设置其宽高为 100vw 和 100vh,确保容器充满屏幕。样式代码如下:

<!DOCTYPE html>
<html>
<head><title>移动端 PDF 预览</title><style>* {margin: 0;padding: 0;}.pdf_box, #pdf-container {width: 100vw;height: 100vh;overflow: scroll;}canvas {width: 100vw;}</style>
</head>
<body><div id="pdf-container"></div>
</body>
</html>

操作js部分

<script src="./js/pdf.js"></script>
<script>pdfjsLib.GlobalWorkerOptions.workerSrc = "./js/pdf.worker.js";const pdfUrl = "13409.pdf";const targetDom = "pdf-container";pdfjsLib.getDocument(pdfUrl).promise.then(async (doc) => {for (let pageNum = 1; pageNum <= doc.numPages; pageNum++) {await renderPage(doc, pageNum, targetDom);}});function renderPage(pdfDoc, pageNumber, containerId) {return new Promise((resolve) => {pdfDoc.getPage(pageNumber).then((page) => {const scale = 1;const viewport = page.getViewport({ scale });const canvas = document.createElement("canvas");const context = canvas.getContext("2d");canvas.width = viewport.width;canvas.height = viewport.height;document.getElementById(containerId).appendChild(canvas);const renderContext = {canvasContext: context,viewport: viewport,};page.render(renderContext).promise.then(resolve);});});}
</script>
  1. 设置 Worker 路径:pdfjsLib.GlobalWorkerOptions.workerSrc 用于指定 pdf.worker.js的路径,提升加载效率。
  2. 加载 PDF 文件:pdfjsLib.getDocument(pdfUrl).promise 以异步方式加载 PDF 文件,返回 PDF 文档对象 doc。
  3. 遍历渲染每一页:通过 for 循环遍历文档的每一页,调用 renderPage 函数将页面内容渲染到 canvas 上,并插入到 pdf-container 中。
  4. 页面缩放和适配:page.getViewport({ scale }) 设置页面的缩放比例,从而控制页面的显示尺寸。
    其实就是把pdf通过canvas转换成图片生成出来,然后通过css设置成全屏,这样就可以实现pdf的预览了

存在的问题:图片显示模糊

由于 PDF.js 默认使用 1 倍的缩放比例,导致生成的图片在移动端显示模糊。为了解决这个问题,我们可以通过设置 scale 参数来调整缩放比例,使其适应移动端屏幕的分辨率。

const scale = window.devicePixelRatio; // 获取设备的像素比

scale 参数设置为 window.devicePixelRatio,即可根据设备的像素比来调整缩放比例,从而提高图片的清晰度。


http://www.mrgr.cn/news/65272.html

相关文章:

  • Visitor 访问者模式
  • 存储数据库的传输效率提升-ETLCloud结合HBASE
  • Android中View.post的用法
  • 【时间之外】IT人求职和创业应知【26】
  • opencv - py_imgproc - py_canny Canny边缘检测
  • 不基于Gin手撸一个RPC服务
  • 照明灯十大知名品牌有哪些?2024灯具十大公认品牌排行榜出炉!
  • SpringMVC课时2
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十. 多线程控制帧率。循环播放,QT connect 细节,
  • SpringBoot新闻稿件管理系统:开发与实践
  • 亚马逊营销邮件:高效策略提升邮件转化率!
  • 前端项目配置文件的各种配置
  • STM32HAL-最简单的长、短、多击按键框架(多按键)
  • 百度社招内推
  • ‌RS485是什么?
  • 拼多多2025秋招多模态大模型搜广推面试题
  • 基于MySQL的企业专利数据高效查询与统计实现
  • 城市防洪新篇章:城市内涝一维二维耦合模拟;水动力模型;水质模拟;海绵城市关键控制指标计算;城市排水系统,SWMM模型;慧天内涝软件
  • Chrome 130 版本新特性 Chrome 130 版本发行说明
  • 嵌入式调试手段(一):使用串口工具
  • PHP单商户多门店会员管理系统小程序源码
  • RDD转换算子:【map】
  • 群控系统服务端开发模式-应用开发-文件上传功能开发
  • 小白也能微调大模型:LLaMA-Factory使用心得
  • 小华一级 代理商 HC32F005C6PA-TSSOP20 HC32F005系列
  • Harbor实战:一步步构建Docker私有镜像仓库的权威指南