我想在我的 web 应用程序中使用 pdf.js 并自定义它的视图,这样我就可以将它嵌入到我的应用程序的其余部分中(我正在考虑使用 iframe)。
首先,我想摆脱大多数默认的工具栏按钮,例如“打印”或“下载文件”,但保留缩放和页面导航。 相反,我希望这些功能(打印/下载)出现在我的应用程序的工具栏中。 怎么做?如何从 pdf.js 工具栏隐藏打印/下载按钮,并使用已在 Web 应用程序中呈现的自定义按钮调用此功能?
或者我应该使用 pdf.js 以外的其他库吗?
任何信息都非常有帮助!
您还可以构建自己的 pdf 查看器。您需要在文档中添加画布元素。请参阅下面的示例代码。您可以添加简单的按钮或屏幕滑动来导航到下一页或以不同比例重新加载页面。最初将其设置为适合屏幕宽度。 另请参阅 pdf.js github 中的示例。 示例代码:
function initializePsfJS() {
pdfDoc = null;
pageNum = 1;
pageRendering = false;
pageNumPending = null;
scale = 1;
canvas = document.getElementById('the-canvas');
ctx = canvas.getContext('2d');
viewport = null;
PDFJS.workerSrc = './js/pdf.worker.js';
}
/**
* Get page info from document, resize canvas accordingly, and render page.
* @param num Page number.
*/
function renderPage(num) {
pageRendering = true;
// Using promise to fetch the page
pdfDoc.getPage(num).then(function (page) {
if (scale === "fit") {
var unscaledViewport = page.getViewport(1);
var viewerCont = document.getElementById('viewerDiv');
var bdrec = viewerCont.getBoundingClientRect();
scale = Math.min((bdrec.height / unscaledViewport.height), (bdrec.width / unscaledViewport.width));
}
viewport = page.getViewport(scale);
canvas.height = viewport.height;
canvas.width = viewport.width;
// Render PDF page into canvas context
var renderContext = {
canvasContext : ctx,
viewport : viewport
};
var renderTask = page.render(renderContext);
// Wait for rendering to finish
renderTask.promise.then(function () {
pageRendering = false;
if (pageNumPending !== null) {
// New page rendering is pending
renderPage(pageNumPending);
pageNumPending = null;
}
calculateinitialXY();
});
});
}
/**
* If another page rendering in progress, waits until the rendering is
* finised. Otherwise, executes rendering immediately.
*/
function queueRenderPage(num) {
if (pageRendering) {
pageNumPending = num;
} else {
renderPage(num);
}
}
function getDocumentByXMLHttpRequest() {
//reason for this
//http://stackoverflow.com/questions/36199155/pdf-file-generated-by-post-request-not-opening
var header = getHeader();
var requesturl = < url rest service url to fetch document >
var xhr = new XMLHttpRequest();
xhr.open('GET', requesturl);
xhr.setRequestHeader(header.key, header.value);
xhr.responseType = 'arraybuffer';
xhr.onload = function () {
if (this.status == 200) {
onloadDocumentFromContent(this.response);
} else {
navigator.notification.alert('Error while requesting pdf with id ' + getDocumentId());
}
};
xhr.send();
}
function onloadDocumentFromContent(pdfraw) {
var docInitParams = {
data : pdfraw
};
PDFJS.getDocument(docInitParams).then(function (pdfDoc_) {
pdfDoc = pdfDoc_;
// Initial/first page rendering
renderPage(pageNum);
});
}
好的,我找到了怎么做。 要隐藏按钮,只需向其添加 CSS 类“hidden”,例如“toolbarButton downloadhiddenMediumViewhidden”。 要下载文件,只需调用“PDFViewerApplication.download();”。要打印它,请使用 window.print()。
所有处理程序都列在 view.js 文件中。只需搜索“//事件处理函数。”。在我的版本中,它位于第 1840 行。
我想这是最简单的方法。当然,按钮可以从 DOM 中完全删除,但这也意味着要更改 view.js 文件。
如果您使用 pdfjs 网页版并且想要隐藏打印按钮,例如您可以执行以下操作:
<iframe
src={`/pdfjs/web/viewer.html?file=${pdfFile}`}
onLoad={(e) => {
Array.from(e.target.contentDocument
.getElementsByClassName('print'))
.forEach((i) => { i.classList.add('hidden'); });
}}
>
</iframe>
您需要将样式添加到 iframe 渲染的新 HTML 中,默认情况下,浏览器不会将主应用程序中的样式应用到 iframe 渲染的应用程序。
另一个例子可以添加简单的颜色变化:
<iframe id='iframe_pdfjs'
src={`/pdfjs/web/viewer.html?file=${pdfFile}`}
onLoad={(e) => {
const cssStyle = document.createElement('style');
cssStyle.innerHTML = 'div {color: red;}';
document.getElementsById('iframe_pdfjs').contentDocument.head.appendChild(cssStyle)
></iframe>
在上面的示例中,我们只是将样式标签添加到 iframe 渲染的 HTML 中
如果您仍然喜欢使用
iframe
嵌入 PDF.js 查看器,这里还有另一个选项。您可以使用 pdfjs-viewer-element
包将自定义 CSS 样式添加到 PDF.js 查看器:
pdfjs-viewer-element
:npm install pdfjs-viewer-element
或使用浏览器:
<script type="module" src="https://cdn.skypack.dev/pdfjs-viewer-element"></script>
<pdfjs-viewer-element src="/file.pdf" viewer-path="/path-to-viewer" viewer-extra-styles="#download { display: none }"></pdfjs-viewer-element>
地点:
src
- pdf 文件的路径
viewer-path
- 解压后的发布文件夹的路径
viewer-extra-styles
- 您的自定义 CSS 样式