PDF.js访问远程服务器报file origin does not match viewer's

本文介绍如何使用PDF.js在网页上预览PDF文件,包括加载本地和远程服务器的PDF文件流。通过修改viewer.js中的默认PDF路径和注释掉跨域检查代码,实现远程PDF文件的无缝加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下载PDF.js(会附带下载资源)

后面会附带下载地址,其中包含两个文件夹build和web文件夹,build文件夹是PDF.js核心文件,web下为展示PDF的视图界面viewer.html;

在项目中要在线预览PDF,进行以下步骤:

方法1:

新建一个html页面,在页面中使用iframe标签,通过iframe标签嵌套viewer.html,如果是只加载本地文件,在viewer.js修改默认的pdf文件路径(DEFAULT_URL字段)即可。

<iframe src="web/viewer.html" width="100%" height="800px" id="Iframe"></iframe>

修改viewer.js的默认的pdf的文件路径

var DEFAULT_URL = 'test.pdf';

方法2:

但是我们的需求往往不是加载一张静止的PDF文件,所以我们通常用的比较多的是第二种方法加载远程服务器返回pdf文件流,然后在viewer.html的url后面添加file=http://127.0.0.1:8088/PDF/test.pdf;

我在js代码中是这样使用的:

$("#Iframe").attr("src","../www/assets/third/pdfjs/web/viewer.html?file="+originUrl+"");

这样就实现了预览远程服务器的文件流,但是pdf.js不支持跨域请求,所以会报错:file origin does not match viewer’s,试了很多种方法仍然报错,所以简单粗暴的方法就是把viewer.js的判断远程地址的代码注释掉即可。

需要在viewer.js中注释的代码如下:

  // if (origin !== viewerOrigin && protocol !== 'blob:') {
      //   throw new Error('file origin does not match viewer\'s');
      // }

然后重新加载发现可以完美的加载出来了。

pdf.js下载地址:https://download.youkuaiyun.com/download/fuzhongbin/10754996

 

 

### 实现 PDF.js 的文本高亮功能 要在 PDF.js 中实现文本高亮功能,可以利用其内置的 `findController` 和 `PDFViewerApplication.findBar` 功能来完成搜索并标记关键字的功能。以下是具体的方法: #### 使用 findController 进行搜索和高亮 PDF.js 提供了一个名为 `findController` 的对象,该对象允许开发者通过编程的方式执行查找操作并将找到的结果高亮显示[^2]。 ```javascript // 获取当前的 PDF 查找控制器实例 const findController = PDFViewerApplication.pdfViewer.findController; if (findController !== null) { const query = '目标关键词'; // 替换为目标关键词 const caseSensitive = false; // 是否区分大小写 const highlightAll = true; // 高亮所有匹配项 const phraseSearch = true; // 启用短语搜索模式 // 调用 executeCommand 方法触发搜索 findController.executeCommand('find', { query, caseSensitive, highlightAll, phraseSearch }); } ``` 上述代码会自动在 PDF 文件中寻找指定的关键字,并将其高亮显示。需要注意的是,这里的 `query` 参数应替换为你希望搜索的具体字符串[^3]。 --- #### 修改默认行为以支持多关键词高亮 为了支持多个不同关键词的同时高亮,可以通过自定义正则表达式逻辑覆盖原有的 `convertToRegExpString` 方法。这一步骤通常需要修改 PDF.js 的核心文件或扩展其功能。 ```javascript function convertToRegExpString(query, phraseSearch, caseSensitive) { let regexStr; if (!phraseSearch && Array.isArray(query)) { regexStr = '(' + query.map(escapeRegex).join('|') + ')'; } else { regexStr = escapeRegex(query); } const flags = caseSensitive ? '' : 'i'; try { return new RegExp(regexStr, flags); // 返回新的正则表达式用于匹配 } catch (e) { console.error(e.message || e); return null; } } function escapeRegex(str) { return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } ``` 这段代码重新定义了 `convertToRegExpString` 函数的行为,使其能够接受数组形式的输入(即多个关键词),并通过正则表达式的 OR (`|`) 来组合这些关键词。 --- #### 清除现有高亮 当不再需要保留之前的高亮时,调用以下命令即可清除所有的高亮状态: ```javascript findController.executeCommand('findagain', { query: '', caseSensitive: false }); ``` 此方法将重置所有已有的搜索结果,恢复到未高亮的状态。 --- #### 处理后端返回的流数据 如果服务器返回的数据是以二进制流的形式提供,则需先转换为 Blob 对象再传递给 PDF.js 加载器。 ```javascript fetch('/path/to/pdf') .then(response => response.arrayBuffer()) .then(arrayBuffer => { const pdfBlob = new Blob([arrayBuffer], { type: 'application/pdf' }); // 初始化 PDF.js 并加载文档 pdfjsLib.getDocument(URL.createObjectURL(pdfBlob)).promise.then((pdfDocument) => { console.log(`成功加载 ${pdfDocument.numPages} 页`); }).catch(error => { console.error('加载失败:', error); }); }) .catch(err => console.error('请求错误:', err)); ``` 以上脚本展示了如何从远程 API 接收 PDF 数据流并正确解析它以便进一步处理。 --- ### 注意事项 - 不同版本间的 API 可能存在差异,请确认所使用的 PDF.js 版本与其官方文档一致。 - 如果遇到跨域问题(如 Message: file origin does not match viewer’s),建议设置 CORS 或者调整服务端配置。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值