pdf.js移动端展示预览打开pdf-pdfh5.js

pdfh5.js

null null null null null null null

有问题可以加Q群咨询,技术交流群,也可以探讨技术,另有开发技术讨论微信群可以问群主拉入微信群

null

更新信息

  • 2025.10.19 更新: v3.0.0大版本更新,支持官方pdf.js v5.4.296,移除svg渲染模式,恢复懒加载模式,新增分段加载模式,新增沙箱集成(防止JavaScript注入等),新增密码pdf文件预览,优化手势缩放(后续会继续优化,目前还是有问题)。

  • 根据需求选择加载模式:小文件直接全部加载,中等文件用懒加载,大文件用分段加载。如果同时配置多个模式,按优先级:分段加载 > 懒加载 > 传统加载。

pdfh5在线预览

https://pdfh5.gjtool.cn/pdfh5/password.pdf 密码 123456zxcv..

快速开始(有两种方式)

一、script标签引入方式

  • 1.创建div容器
<div id="demo"></div>
  • 2.引入pdfh5.js(插件会自动检测并加载PDF.js资源)
<script src="js/pdfh5.js"></script>
  • 3.实例化
var pdfh5 = new Pdfh5(document.querySelector("#demo"), {
    pdfurl: "./default.pdf"
});

二、npm安装方式(适应于vue), react使用方法类似vue(example/react-test是react使用示例)

  • 1.安装
npm install pdfh5
  • 2.静态资源引用

    将pdfh5文件夹下的cmaps、iccs、standard_fonts、wasm、js/pdf.worker.min.js都放置到public静态资源目录下

  • 3.使用

<script setup lang="ts">
import Pdfh5 from "pdfh5"
import { ref, onMounted, onUnmounted } from 'vue'

const container = ref<HTMLElement>()
let pdfViewer: any = null

onMounted(async () => {
  try {
    
    console.log('Pdfh5构造函数:', Pdfh5);

    // 创建PDF查看器
    pdfViewer = new Pdfh5(container.value!, {
      pdfurl: "/git.pdf",
      textLayer: true,
      workerSrc:"./pdf.worker.min.js",
      cMapUrl: './cmaps/',
      standardFontDataUrl: './standard_fonts/',
      iccUrl: './iccs/',
      wasmUrl: './wasm/'
    });
    console.log('PDF查看器创建成功:', pdfViewer);

  } catch (error) {
    console.error('PDF初始化失败:', error);
  }
})

onUnmounted(() => {
  if (pdfViewer && typeof pdfViewer.destroy === 'function') {
    pdfViewer.destroy()
  }
})
</script>

<template>
  <div class="pdf-container" ref="container"></div>
</template>

<style scoped>
.pdf-container {
  width: 100%;
  height: 100vh;
}
</style>

API接口方法

实例化

  • pdfh5实例化的时候传两个参数,selector选择器,options配置项参数,会返回一个pdfh5实例对象,可以用来操作pdf,监听相关事件
var pdfh5 = new Pdfh5(selector, options);
参数名称 类型 取值 是否必须 作用
selector HTMLElement - pdfh5的容器,html DOM元素对象
options Object - × pdfh5的配置项参数

options配置项参数列表

  • 示例: 配置项参数 pdfurl
var pdfh5 = new Pdfh5(document.querySelector("#demo"), {
    pdfurl: "./default.pdf"
});

基础配置

参数名称 类型 取值 默认值 作用
pdfurl String PDF文件地址 - pdf地址
data Array(arraybuffer) PDF文件流数据 - pdf文件流 ,与pdfurl二选一(二进制PDF数据。使用类型化数组(Uint8Array)可以提高内存使用率。如果PDF数据是BASE64编码的,请先使用atob()将其转换为二进制字符串。)
password String PDF密码 null PDF密码(如果有密码保护)
goto Number 页码数字 0 加载pdf跳转到第几页(0表示不跳转)

渲染配置

参数名称 类型 取值 默认值 作用
scale Number 渲染比例 1 pdf渲染的比例
textLayer Boolean true、false false 是否开启textLayer,可以复制文本
enableHWA Boolean true、false true 是否启用硬件加速,对图片渲染很重要
cMapUrl String 字体映射文件路径 智能检测 解析pdf时,特殊情况下显示完整字体的cmaps文件夹路径
standardFontDataUrl String 标准字体路径 智能检测 标准字体文件路径
iccUrl String 颜色配置文件路径 智能检测 颜色管理配置文件路径
wasmUrl String WebAssembly文件路径 智能检测 高性能PDF渲染的WebAssembly文件路径
workerSrc String PDF.js Worker路径 智能检测 PDF.js Worker文件路径

交互配置

参数名称 类型 取值 默认值 作用
scrollEnable Boolean true、false true 是否允许pdf滚动
zoomEnable Boolean true、false true 是否允许pdf手势缩放
resize Boolean true、false true 是否允许窗口大小变化时重新渲染

懒加载配置

参数名称 类型 取值 默认值 作用
lazyLoad Boolean true、false false 启用懒加载模式,只渲染可见页面

分段加载配置

参数名称 类型 取值 默认值 作用
progressiveLoading Boolean true、false false 启用分段加载模式,PDF.js官方流式加载+智能内存管理
chunkSize Number 数字,单位字节 65536 分块大小,默认64KB
maxMemoryPages Number 数字 5 最大内存页面数,超过会自动清理远距离页面
maxImageSize Number 数字,单位字节 8388608 最大图片大小,8388608,兼容iOS Safari
canvasMaxAreaInBytes Number 数字,单位字节 8388608 最大canvas面积,iOS Safari浏览器canvas限制约为16777216

UI组件配置

参数名称 类型 取值 默认值 作用
loadingBar Boolean true、false true 是否显示加载进度条
pageNum Boolean true、false true 是否显示左上角页码
backTop Boolean true、false true 是否显示右下角回到顶部按钮

其他配置

参数名称 类型 取值 默认值 作用
goto Number 页码数字 0 加载pdf跳转到第几页
enableHWA Boolean true、false true 是否启用硬件加速,对图片渲染很重要

手势缩放配置

参数名称 类型 取值 默认值 作用
tapZoomFactor Number 数字 2 双击缩放倍数
zoomOutFactor Number 数字 1.2 缩放回弹因子
animationDuration Number 数字,单位毫秒 300 缩放动画持续时间
maxZoom Number 数字 4 最大缩放倍数
minZoom Number 数字 0.5 最小缩放倍数
dampingFactor Number 数字 0.85 阻尼因子

注释编辑器配置

参数名称 类型 取值 默认值 作用
annotationEditorMode String “NONE”、”FREETEXT”、”HIGHLIGHT”、”INK”、”STAMP”、”SIGNATURE” “NONE” 注释编辑器模式
editorParams Object 编辑器参数对象 {} 注释编辑器参数配置

沙箱安全配置

参数名称 类型 取值 默认值 作用
sandboxEnabled Boolean true、false true 是否启用沙箱模式,防止JavaScript注入和XSS攻击

沙箱配置选项(sandboxOptions)

参数名称 类型 取值 默认值 作用
allowScripts Boolean true、false false 是否允许JavaScript执行
allowForms Boolean true、false true 是否允许表单交互
allowPopups Boolean true、false false 是否允许弹窗
allowSameOrigin Boolean true、false true 是否允许同源访问
sandbox String HTML sandbox属性值 “allow-same-origin allow-scripts” HTML sandbox属性,控制沙箱行为
referrerPolicy String referrer策略值 “strict-origin-when-cross-origin” 引用策略,控制referrer信息

沙箱配置示例

var pdfh5 = new Pdfh5(document.querySelector("#demo"), {
    pdfurl: "./document.pdf",
    sandboxEnabled: true,
    sandboxOptions: {
        allowScripts: false,        // 禁止JavaScript执行
        allowForms: true,           // 允许表单交互
        allowPopups: false,         // 禁止弹窗
        allowSameOrigin: true,       // 允许同源访问
        sandbox: "allow-same-origin allow-scripts",
        referrerPolicy: "strict-origin-when-cross-origin"
    }
});

资源路径配置说明

var pdfh5 = new Pdfh5(document.querySelector("#demo"), {
    pdfurl: "./document.pdf",
    workerSrc: "./pdf.worker.min.js",
    cMapUrl: "../cmaps/",
    standardFontDataUrl: "../standard_fonts/",
    iccUrl: "../iccs/",
    wasmUrl: "../wasm/"
});

资源文件说明

插件需要以下PDF.js资源文件:

  • cmaps/ - 字体映射文件(用于正确显示中文字体)
  • standard_fonts/ - 标准字体文件(用于PDF标准字体渲染)
  • iccs/ - 颜色配置文件(用于颜色管理和色彩空间转换)
  • wasm/ - WebAssembly文件(用于高性能PDF渲染和图像解码)
  • pdf.worker.min.js - PDF.js Worker文件(用于后台PDF处理)

pdf请求示例

1、文件地址

new Pdfh5(document.querySelector("#demo"), {
    pdfurl: "git.pdf"
});

2、pdf文件流或者arraybuffer已经得到,如何渲染

 new Pdfh5(document.querySelector("#demo"), {
     data: blob,  //blob arraybuffer
 });

methods 方法列表

基础控制方法

方法名 传参 传参取值 作用
show Function 带一个回调函数 pdfh5显示
hide Function 带一个回调函数 pdfh5隐藏
destroy Function 带一个回调函数 pdfh5销毁

交互控制方法

方法名 传参 传参取值 作用
setScrollEnabled Boolean true、false 启用/禁用PDF滚动
setZoomEnabled Boolean true、false 启用/禁用PDF手势缩放
isScrollEnabled - 无参数 获取滚动状态
isZoomEnabled - 无参数 获取缩放状态
setProgressiveLoading Boolean, Object Boolean:是否启用, Object:配置选项{chunkSize, maxMemoryPages} 设置分段加载配置
getProgressiveLoadingStatus - 无参数 获取分段加载状态
getMemoryUsage - 无参数 获取内存使用情况

页面导航方法

方法名 传参 传参取值 作用
goToPage Number Number:要跳转的pdf页数 pdf跳转到第几页(pdf加载完成后使用)
nextPage - 无参数 跳转到下一页
prevPage - 无参数 跳转到上一页
scrollToTop - 无参数 滚动到顶部

缩放控制方法

方法名 传参 传参取值 作用
zoomIn - 无参数 放大PDF
zoomOut - 无参数 缩小PDF
setScale Number Number:缩放比例 设置缩放比例
setZoomEnabled Boolean true、false 启用/禁用缩放手势
isZoomEnabled Boolean 无参数 获取缩放状态
setZoomConstraints Object {minScale, maxScale, step} 设置缩放约束
getZoomConstraints - 无参数 获取缩放约束
isZooming - 无参数 检查是否正在缩放

搜索功能方法

方法名 传参 传参取值 作用
searchText String String:搜索关键词 搜索文本
findNext - 无参数 查找下一个匹配项
findPrevious - 无参数 查找上一个匹配项
clearSearch - 无参数 清除搜索高亮

下载和打印方法

方法名 传参 传参取值 作用
downloadPDF String String:下载文件名,默认”document.pdf” 下载PDF
printPDF - 无参数 打印PDF(渲染所有页面到打印容器)

分段加载方法

方法名 传参 传参取值 作用
setProgressiveLoading Boolean, Object Boolean:是否启用, Object:配置选项{chunkSize, maxMemoryPages} 设置分段加载配置
getProgressiveLoadingStatus - 无参数 获取分段加载状态
getMemoryUsage - 无参数 获取内存使用情况

注释编辑器方法

方法名 传参 传参取值 作用
setAnnotationEditorMode String String:编辑器模式(”NONE”、”FREETEXT”、”HIGHLIGHT”、”INK”、”STAMP”、”SIGNATURE”) 设置注释编辑器模式
getAnnotationEditorMode - 无参数 获取当前注释编辑器模式
addAnnotation Object Object:注释数据对象 添加注释
removeAnnotation String String:注释ID 删除注释
updateAnnotation String, Object String:注释ID, Object:更新数据 更新注释
getAnnotations - 无参数 获取所有注释
clearAnnotations - 无参数 清除所有注释

分段加载需要的服务端配置说明

1. Nginx配置(推荐)

分段加载需要服务端支持HTTP范围请求(Range Requests),Nginx默认支持静态文件的范围请求,但需要正确配置:

# 基础配置 - 支持PDF文件的范围请求
location ~* \.(pdf)$ {
    # 启用范围请求支持
    add_header Accept-Ranges bytes;
    
    # 设置正确的MIME类型
    add_header Content-Type application/pdf;
    
    # 缓存控制(可选)
    expires 1h;
    add_header Cache-Control "public, immutable";
    
    # CORS支持(如果需要跨域)
    add_header Access-Control-Allow-Origin "*";
    add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS";
    add_header Access-Control-Allow-Headers "Range, Content-Range";
    
    # 处理OPTIONS请求
    if ($request_method = 'OPTIONS') {
        add_header Access-Control-Allow-Origin "*";
        add_header Access-Control-Allow-Methods "GET, HEAD, OPTIONS";
        add_header Access-Control-Allow-Headers "Range, Content-Range";
        add_header Access-Control-Max-Age 86400;
        return 204;
    }
}

2. 反向代理配置

如果使用Nginx作为反向代理,需要额外配置:

location /api/pdf/ {
    proxy_pass http://backend_server;
    
    # 禁用缓冲,支持流式传输
    proxy_buffering off;
    proxy_request_buffering off;
    
    # 设置超时时间
    proxy_read_timeout 300s;
    proxy_connect_timeout 60s;
    
    # 使用HTTP/1.1
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    
    # 传递原始请求头
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
    # 支持范围请求
    proxy_set_header Range $http_range;
    proxy_set_header If-Range $http_if_range;
}

3. Apache配置

如果使用Apache服务器:

# 启用mod_rewrite和mod_headers
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule headers_module modules/mod_headers.so

# 配置PDF文件处理
<LocationMatch "\.pdf$">
    # 启用范围请求
    Header set Accept-Ranges bytes
    
    # 设置MIME类型
    Header set Content-Type "application/pdf"
    
    # CORS支持
    Header set Access-Control-Allow-Origin "*"
    Header set Access-Control-Allow-Methods "GET, HEAD, OPTIONS"
    Header set Access-Control-Allow-Headers "Range, Content-Range"
    
    # 缓存控制
    Header set Cache-Control "public, max-age=3600"
</LocationMatch>

4. Node.js Express配置

如果使用Node.js作为后端:

const express = require('express');
const app = express();

// 支持范围请求的中间件
app.use('/pdf', (req, res, next) => {
    // 设置CORS头
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Range, Content-Range');
    
    // 处理OPTIONS请求
    if (req.method === 'OPTIONS') {
        res.status(204).end();
        return;
    }
    
    next();
});

// 静态文件服务,支持范围请求
app.use('/pdf', express.static('pdf-files', {
    setHeaders: (res, path) => {
        if (path.endsWith('.pdf')) {
            res.setHeader('Content-Type', 'application/pdf');
            res.setHeader('Accept-Ranges', 'bytes');
        }
    }
}));

5. PHP配置

如果使用PHP作为后端:

<?php
// 设置CORS头
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, HEAD, OPTIONS');
header('Access-Control-Allow-Headers: Range, Content-Range');

// 处理OPTIONS请求
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(204);
    exit;
}

// 支持范围请求的PDF文件服务
$file = $_GET['file'];
$filePath = 'pdf-files/' . $file;

if (file_exists($filePath)) {
    $fileSize = filesize($filePath);
    $range = $_SERVER['HTTP_RANGE'] ?? '';
    
    if ($range) {
        // 处理范围请求
        $ranges = explode('=', $range);
        $offset = explode('-', $ranges[1]);
        $start = intval($offset[0]);
        $end = isset($offset[1]) ? intval($offset[1]) : $fileSize - 1;
        
        header('HTTP/1.1 206 Partial Content');
        header('Content-Range: bytes ' . $start . '-' . $end . '/' . $fileSize);
        header('Content-Length: ' . ($end - $start + 1));
        header('Content-Type: application/pdf');
        header('Accept-Ranges: bytes');
        
        $fp = fopen($filePath, 'rb');
        fseek($fp, $start);
        echo fread($fp, $end - $start + 1);
        fclose($fp);
    } else {
        // 完整文件请求
        header('Content-Type: application/pdf');
        header('Content-Length: ' . $fileSize);
        header('Accept-Ranges: bytes');
        readfile($filePath);
    }
}
?>

6. 配置验证

验证服务端是否正确支持范围请求:

# 测试范围请求
curl -H "Range: bytes=0-1023" -I http://your-server.com/path/to/file.pdf

# 应该返回:
# HTTP/1.1 206 Partial Content
# Accept-Ranges: bytes
# Content-Range: bytes 0-1023/1048576
# Content-Length: 1024

事件监听方法

方法名 传参 传参取值 作用
on (String, Function) String:监听的事件名,Function:监听的事件回调 监听事件
off String String:要移除的事件名 移除事件监听
trigger (String, Object) String:事件名,Object:事件数据 触发事件

状态获取方法

方法名 传参 传参取值 作用
getStatus - 无参数 获取当前状态信息

on方法监听所有事件-事件名列表

  • 示例: 监听pdf准备开始渲染,此时可以拿到pdf总页数
pdfh5.on("ready", function () {
    console.log("总页数:" + this.totalNum)
})

生命周期事件

事件名 回调参数 作用
init Function 监听pdfh5开始初始化
ready Function 监听pdf准备开始渲染,此时可以拿到pdf总页数
error Function(msg,time) 监听加载失败,msg信息,time耗时
success Function(msg,time) 监听pdf渲染成功,msg信息,time耗时
complete Function(status, msg, time) 监听pdf加载完成事件,加载失败、渲染成功都会触发。status有两种状态success和error
render Function(currentNum, pageTime, totalTime, currentPageDom) 监听pdf渲染过程,currentNum当前页码,pageTime单页耗时,totalTime总耗时,currentPageDom当前页面DOM

交互事件

事件名 回调参数 作用
zoom Function(scale) 监听pdf缩放,scale缩放比例
zoomStart Function(data) 监听缩放开始,data包含scale和startTime
zoomEnd Function(data) 监听缩放结束,data包含scale、startScale、scaleChange、duration等
pageLoaded Function(data) 监听页面加载完成(分段加载),data包含pageNum和memoryUsage
pageCleaned Function(data) 监听页面清理完成(分段加载),data包含pageNum
scroll Function(data) 监听pdf滚动,data包含scrollTop滚动条高度和currentNum当前页码
backTop Function 监听回到顶部按钮的点击事件回调

控制事件

事件名 回调参数 作用
zoomEnabled Function(flag) 监听缩放启用状态变化,flag:true,false
scrollEnabled Function(flag) 监听滚动启用状态变化,flag:true,false
show Function 监听pdfh5显示
hide Function 监听pdfh5隐藏
destroy Function 监听pdfh5销毁

注释编辑器事件

事件名 回调参数 作用
annotationAdded Function(data) 监听注释添加,data包含注释信息
annotationRemoved Function(data) 监听注释删除,data包含注释信息
annotationUpdated Function(data) 监听注释更新,data包含注释信息
annotationModeChanged Function(mode) 监听注释模式变化,mode为新的模式
annotationSelected Function(data) 监听注释选择,data包含选中的注释信息

事件监听示例

// 监听PDF加载完成事件
pdfh5.on("complete", function (status, msg, time) {
    console.log("状态:" + status + ",总耗时:" + time + "毫秒,总页数:" + this.totalNum, msg);
});

// 监听滚动事件
pdfh5.on("scroll", function (data) {
    console.log("scrollTop:" + data.scrollTop, "currentNum:" + data.currentNum);
});

// 监听注释编辑器事件
pdfh5.on("annotationAdded", function (data) {
    console.log("注释已添加:", data);
});

pdfh5.on("annotationModeChanged", function (mode) {
    console.log("注释模式已切换为:", mode);
});

完整使用示例

基础使用

var pdfh5 = new Pdfh5(document.querySelector("#demo"), {
    pdfurl: "./document.pdf",
    scale: 1.5,
    textLayer: true,
    zoomEnable: true,
    scrollEnable: true
});

高级配置示例

var pdfh5 = new Pdfh5(document.querySelector("#demo"), {
    // 基础配置
    pdfurl: "./large-document.pdf",
    password: "123456", // 如果有密码保护
    
    // 渲染配置
    scale: 1.0,
    textLayer: true,
    enableHWA: true,
    
    // 交互配置
    zoomEnable: true,
    scrollEnable: true,
    backTop: true,
    pageNum: true,
    loadingBar: true,
    
    // 手势缩放配置
    tapZoomFactor: 2,
    maxZoom: 4,
    minZoom: 0.5,
    
    // 分段加载配置(大文件推荐)
    progressiveLoading: true,
    chunkSize: 65536,
    maxMemoryPages: 5,
    
    // 注释编辑器配置
    annotationEditorMode: "FREETEXT",
    editorParams: {
        freeTextColor: "#000000",
        freeTextSize: 12,
        inkColor: "#000000",
        inkThickness: 1
    },
    
    // 沙箱安全配置
    sandboxEnabled: true,
    sandboxOptions: {
        allowScripts: false,
        allowForms: true,
        allowPopups: false,
        allowSameOrigin: true
    },
    
    // 资源路径配置
    workerSrc: "./pdf.worker.min.js",
    cMapUrl: "../cmaps/",
    standardFontDataUrl: "../standard_fonts/",
    iccUrl: "../iccs/",
    wasmUrl: "../wasm/"
});

// 事件监听
pdfh5.on("ready", function() {
    console.log("PDF加载完成,总页数:", this.totalNum);
});

pdfh5.on("annotationAdded", function(data) {
    console.log("新注释已添加:", data);
});

// 方法调用
pdfh5.setAnnotationEditorMode("HIGHLIGHT");
pdfh5.setProgressiveLoading(true, {chunkSize: 32768});

打赏榜单

  • JayLin ¥6.66
  • 靓仔城 ¥6.67
  • 南蓝 ¥8.80
  • 我是太阳 ¥29.99
  • *小波 ¥1.00
  • *鑫 ¥9.99
  • *手 ¥9.99
  • *勇 ¥19.99
  • *爷 ¥5.00
  • *超 ¥20.00
  • 3*Y ¥5.00
  • *阳 ¥5.00
  • **雄 ¥5.00
  • A*r ¥1.23
  • *客 ¥5.00
  • *运 ¥66.66
  • *辰 ¥30.00
  • *黎 ¥6.66+¥5.00
  • **福 ¥6.66
  • *🏀 ¥6.66+¥1.00
  • *阳 ¥10.00
  • 自闭中 ¥16.66+¥16.00
  • *焕 ¥6.66
  • *人 ¥5.00
  • *。 ¥5.20
  • 半*) ¥5.00
  • *1 ¥15.00
  • *蕾 ¥16.66+¥8.80
  • *军 ¥10.00
  • **强 ¥58.88
  • E*y ¥6.60
  • J*u ¥13.00
  • A*a ¥50.00
  • *东 ¥8.80
  • j*y ¥9.99
  • *宇 ¥6.66
  • *涛 ¥1.00
  • *. ¥10.00
  • *☺ ¥6.66
  • *霸 ¥6.66
  • a*r ¥20.00
  • 木槿(**耀) ¥50.00

如果您觉得上面的内容对您有帮助,可以打赏支持一下!

打赏

网友留言(4 条)

  1. 访客
    访客  [ 北京] 回复Ta
    在小米系统和华为系统会出现一些特殊字符,您遇到过这种问题吗
    1. gjTool
      gjTool  [ 湖北省武汉市] 回复Ta
      试试最新版
  1. 访客
    访客  [ 广东省深圳市] 回复Ta
    基于的PDF.js版本太低了,有安全漏洞,建议把PDF.js版本升级到4.2.67之后
    1. gjTool
      gjTool  [ 湖北省武汉市] 回复Ta
      升级到5.4.296了

发表评论

验证码