推荐人政策:strict-origin-when-cross-origin / 使用外部来源
pdf 应位于同一主机上(包括相同的协议)。将 pdf 托管在与您的应用程序/网站相同的 url 上,应该可以解决这个问题。
允许在其他页面中加载 pdf 可能会导致各种安全风险。
如果您想在自己的主页上显示外部 pdf 的最新版本,基本上有两种选择。
在您的服务器上托管 PDF
运行一个服务器脚本 (cron),它会下载 pdf 并将其托管在您自己的服务器上。
允许跨域
如果您有权访问托管 pdf 的服务器,则可以发送标头以允许跨域。
Access-Control-Allow-Origin: *
如何将 pdfjs 与 yarn/npm 一起使用
这方面的文档真的很糟糕,但是他们有一个存储库pdfjs-dist
和一些相关的文档。
安装
npm install pdfjs-dist
用法(来自DOC)
import * as pdfjsLib from 'pdfjs-dist';
var url = 'https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/examples/learning/helloworld.pdf';
// The workerSrc property shall be specified.
pdfjsLib.GlobalWorkerOptions.workerSrc = '//mozilla.github.io/pdf.js/build/pdf.worker.js';
// Asynchronous download of PDF
var loadingTask = pdfjsLib.getDocument(url);
loadingTask.promise.then(function(pdf) {
console.log('PDF loaded');
// Fetch the first page
var pageNumber = 1;
pdf.getPage(pageNumber).then(function(page) {
console.log('Page loaded');
var scale = 1.5;
var viewport = page.getViewport({scale: scale});
// Prepare canvas using PDF page dimensions
var canvas = document.getElementById('the-canvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
// Render PDF page into canvas context
var renderContext = {
canvasContext: context,
viewport: viewport
};
var renderTask = page.render(renderContext);
renderTask.promise.then(function () {
console.log('Page rendered');
});
});
}, function (reason) {
// PDF loading error
console.error(reason);
});
服务工作者
你确实需要 service worker - 没有它 pdfjs 就不能工作,所以 reactpdf 也不能。
如果您使用 CRA,并且不想使用 CDN,您可以执行以下步骤:
1)将工作人员复制到公用文件夹
cp ./node_modules/pdfjs-dist/build/pdf.worker.js public/scripts
2)注册Service Worker
pdfjsLib.GlobalWorkerOptions.workerSrc = `${process.env.PUBLIC_URL}/scripts/pdf.worker.js`