如何在 webpack 和 Vuejs 中使用带有工具栏的完整 PDF.js 查看器?

Nai*_*One 5 javascript pdf.js webpack vuejs2

我正在使用 vue.js spa 和 webpack 尝试使用 mozilla 的 PDF.js 显示 PDF。我让示例工作起来很容易,但我很难通过工具栏工作来获得完整的查看器。我需要使用 PDFjs,require('pdfjs-dist/webpack')因此它不会发送“已设置假工人”警告。我真的找不到解释如何在 webpack 中使用完整查看器的 SO 问题/指南或视频。这个项目的文档也几乎不存在,我想我也尝试了我能在那里找到的一切。

对不起,如果这似乎是一个愚蠢的问题,但我很努力地解决这个问题,并点击了我可以通过谷歌搜索找到的每个链接。

提前谢谢各位

我已经从示例中获得的代码:

var PDFJS = require('pdfjs-dist/webpack');

  const url = 'the-url-to-my-pdf';
  const canvasContainer = document.getElementById('preview');

  function renderPage(page) {
    const viewport = page.getViewport(2);
    let canvas = document.createElement('canvas');
    let canvasWrapper = document.createElement('div');
    canvasWrapper.classList.add('page');
    const ctx = canvas.getContext('2d');
    const renderContext = {
      canvasContext: ctx,
      viewport: viewport
    };
    canvas.height = viewport.height;
    canvas.width = viewport.width;
    canvasWrapper.appendChild(canvas);
    canvasContainer.appendChild(canvasWrapper);

    page.render(renderContext);
  }

  function renderPages(pdfDoc) {
    for(var num = 1; num <= pdfDoc.numPages; num++) {
      pdfDoc.getPage(num).then(renderPage);
    }
  }

  PDFJS.getDocument(url).then(renderPages);
Run Code Online (Sandbox Code Playgroud)

元素“预览”只是多个 pdf 页面的包装 div

IVO*_*LOV 2

这是一个完整的示例 - 完整的单文件 Vue 组件:

\n\n
<template>\n  <div class="pdfjs">\n    <div id="outerContainer">\n\n      <div id="sidebarContainer">\n        <div id="toolbarSidebar">\n          <div class="splitToolbarButton toggled">\n            <button id="viewThumbnail" class="toolbarButton group toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs">\n              <span data-l10n-id="thumbs_label">Thumbnails</span>\n            </button>\n            <button id="viewOutline" class="toolbarButton group" title="Show Document Outline (double-click to expand/collapse all items)" tabindex="3" data-l10n-id="document_outline">\n              <span data-l10n-id="document_outline_label">Document Outline</span>\n            </button>\n            <button id="viewAttachments" class="toolbarButton group" title="Show Attachments" tabindex="4" data-l10n-id="attachments">\n              <span data-l10n-id="attachments_label">Attachments</span>\n            </button>\n          </div>\n        </div>\n        <div id="sidebarContent">\n          <div id="thumbnailView">\n          </div>\n          <div id="outlineView" class="hidden">\n          </div>\n          <div id="attachmentsView" class="hidden">\n          </div>\n        </div>\n      </div>  <!-- sidebarContainer -->\n\n      <div id="mainContainer">\n        <div class="findbar hidden doorHanger hiddenSmallView" id="findbar">\n          <label for="findInput" class="toolbarLabel" data-l10n-id="find_label">Find:</label>\n          <input id="findInput" class="toolbarField" tabindex="91">\n          <div class="splitToolbarButton">\n            <button class="toolbarButton findPrevious" title="" id="findPrevious" tabindex="92" data-l10n-id="find_previous">\n              <span data-l10n-id="find_previous_label">Previous</span>\n            </button>\n            <div class="splitToolbarButtonSeparator"></div>\n            <button class="toolbarButton findNext" title="" id="findNext" tabindex="93" data-l10n-id="find_next">\n              <span data-l10n-id="find_next_label">Next</span>\n            </button>\n          </div>\n          <input type="checkbox" id="findHighlightAll" class="toolbarField" tabindex="94">\n          <label for="findHighlightAll" class="toolbarLabel" data-l10n-id="find_highlight">Highlight all</label>\n          <input type="checkbox" id="findMatchCase" class="toolbarField" tabindex="95">\n          <label for="findMatchCase" class="toolbarLabel" data-l10n-id="find_match_case_label">Match case</label>\n          <span id="findResultsCount" class="toolbarLabel hidden"></span>\n          <span id="findMsg" class="toolbarLabel"></span>\n        </div>  <!-- findbar -->\n\n        <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">\n          <div id="secondaryToolbarButtonContainer">\n            <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="51" data-l10n-id="presentation_mode">\n              <span data-l10n-id="presentation_mode_label">Presentation Mode</span>\n            </button>\n\n            <button id="secondaryOpenFile" class="secondaryToolbarButton openFile visibleLargeView" title="Open File" tabindex="52" data-l10n-id="open_file">\n              <span data-l10n-id="open_file_label">Open</span>\n            </button>\n\n            <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="53" data-l10n-id="print">\n              <span data-l10n-id="print_label">Print</span>\n            </button>\n\n            <button id="secondaryDownload" class="secondaryToolbarButton download visibleMediumView" title="Download" tabindex="54" data-l10n-id="download">\n              <span data-l10n-id="download_label">Download</span>\n            </button>\n\n            <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark visibleSmallView" title="Current view (copy or open in new window)" tabindex="55" data-l10n-id="bookmark">\n              <span data-l10n-id="bookmark_label">Current View</span>\n            </a>\n\n            <div class="horizontalToolbarSeparator visibleLargeView"></div>\n\n            <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="56" data-l10n-id="first_page">\n              <span data-l10n-id="first_page_label">Go to First Page</span>\n            </button>\n            <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="57" data-l10n-id="last_page">\n              <span data-l10n-id="last_page_label">Go to Last Page</span>\n            </button>\n\n            <div class="horizontalToolbarSeparator"></div>\n\n            <button id="pageRotateCw" class="secondaryToolbarButton rotateCw" title="Rotate Clockwise" tabindex="58" data-l10n-id="page_rotate_cw">\n              <span data-l10n-id="page_rotate_cw_label">Rotate Clockwise</span>\n            </button>\n            <button id="pageRotateCcw" class="secondaryToolbarButton rotateCcw" title="Rotate Counterclockwise" tabindex="59" data-l10n-id="page_rotate_ccw">\n              <span data-l10n-id="page_rotate_ccw_label">Rotate Counterclockwise</span>\n            </button>\n\n            <div class="horizontalToolbarSeparator"></div>\n\n            <button id="toggleHandTool" class="secondaryToolbarButton handTool" title="Enable hand tool" tabindex="60" data-l10n-id="hand_tool_enable">\n              <span data-l10n-id="hand_tool_enable_label">Enable hand tool</span>\n            </button>\n\n            <div class="horizontalToolbarSeparator"></div>\n\n            <button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Properties\xe2\x80\xa6" tabindex="61" data-l10n-id="document_properties">\n              <span data-l10n-id="document_properties_label">Document Properties\xe2\x80\xa6</span>\n            </button>\n          </div>\n        </div>  <!-- secondaryToolbar -->\n\n        <div class="toolbar">\n          <div id="toolbarContainer">\n            <div id="toolbarViewer">\n              <div id="toolbarViewerLeft">\n                <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" data-l10n-id="toggle_sidebar">\n                  <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>\n                </button>\n                <div class="toolbarButtonSpacer"></div>\n                <button id="viewFind" class="toolbarButton group hiddenSmallView" title="Find in Document" tabindex="12" data-l10n-id="findbar">\n                  <span data-l10n-id="findbar_label">Find</span>\n                </button>\n                <div class="splitToolbarButton">\n                  <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="13" data-l10n-id="previous">\n                    <span data-l10n-id="previous_label">Previous</span>\n                  </button>\n                  <div class="splitToolbarButtonSeparator"></div>\n                  <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="14" data-l10n-id="next">\n                    <span data-l10n-id="next_label">Next</span>\n                  </button>\n                </div>\n                <input type="number" id="pageNumber" class="toolbarField pageNumber" title="Page" value="1" size="4" min="1" tabindex="15" data-l10n-id="page">\n                <span id="numPages" class="toolbarLabel"></span>\n              </div>\n              <div id="toolbarViewerRight">\n                <button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView" title="Switch to Presentation Mode" tabindex="31" data-l10n-id="presentation_mode">\n                  <span data-l10n-id="presentation_mode_label">Presentation Mode</span>\n                </button>\n\n                <button id="openFile" class="toolbarButton openFile hiddenLargeView" title="Open File" tabindex="32" data-l10n-id="open_file">\n                  <span data-l10n-id="open_file_label">Open</span>\n                </button>\n\n                <button id="print" class="toolbarButton print hiddenMediumView" title="Print" tabindex="33" data-l10n-id="print">\n                  <span data-l10n-id="print_label">Print</span>\n                </button>\n\n                <button id="download" class="toolbarButton download hiddenMediumView" title="Download" tabindex="34" data-l10n-id="download">\n                  <span data-l10n-id="download_label">Download</span>\n                </button>\n                <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark">\n                  <span data-l10n-id="bookmark_label">Current View</span>\n                </a>\n\n                <div class="verticalToolbarSeparator hiddenSmallView"></div>\n\n                <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" data-l10n-id="tools">\n                  <span data-l10n-id="tools_label">Tools</span>\n                </button>\n              </div>\n              <div id="toolbarViewerMiddle">\n                <div class="splitToolbarButton">\n                  <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="21" data-l10n-id="zoom_out">\n                    <span data-l10n-id="zoom_out_label">Zoom Out</span>\n                  </button>\n                  <div class="splitToolbarButtonSeparator"></div>\n                  <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="22" data-l10n-id="zoom_in">\n                    <span data-l10n-id="zoom_in_label">Zoom In</span>\n                  </button>\n                </div>\n                <span id="scaleSelectContainer" class="dropdownToolbarButton">\n                  <select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom">\n                    <option id="pageAutoOption" title="" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option>\n                    <option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option>\n                    <option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Fit Page</option>\n                    <option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Full Width</option>\n                    <option id="customScaleOption" title="" value="custom" disabled="disabled" hidden="true"></option>\n                    <option title="" value="0.5" data-l10n-id="page_scale_percent" data-l10n-args=\'{ "scale": 50 }\'>50%</option>\n                    <option title="" value="0.75" data-l10n-id="page_scale_percent" data-l10n-args=\'{ "scale": 75 }\'>75%</option>\n                    <option title="" value="1" data-l10n-id="page_scale_percent" data-l10n-args=\'{ "scale": 100 }\'>100%</option>\n                    <option title="" value="1.25" data-l10n-id="page_scale_percent" data-l10n-args=\'{ "scale": 125 }\'>125%</option>\n                    <option title="" value="1.5" data-l10n-id="page_scale_percent" data-l10n-args=\'{ "scale": 150 }\'>150%</option>\n                    <option title="" value="2" data-l10n-id="page_scale_percent" data-l10n-args=\'{ "scale": 200 }\'>200%</option>\n                    <option title="" value="3" data-l10n-id="page_scale_percent" data-l10n-args=\'{ "scale": 300 }\'>300%</option>\n                    <option title="" value="4" data-l10n-id="page_scale_percent" data-l10n-args=\'{ "scale": 400 }\'>400%</option>\n                  </select>\n                </span>\n              </div>\n            </div>\n            <div id="loadingBar">\n              <div class="progress">\n                <div class="glimmer">\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div type="context" id="viewerContextMenu">\n          <div id="contextFirstPage" label="First Page"\n                    data-l10n-id="first_page"></div>\n          <div id="contextLastPage" label="Last Page"\n                    data-l10n-id="last_page"></div>\n          <div id="contextPageRotateCw" label="Rotate Clockwise"\n                    data-l10n-id="page_rotate_cw"></div>\n          <div id="contextPageRotateCcw" label="Rotate Counter-Clockwise"\n                    data-l10n-id="page_rotate_ccw"></div>\n        </div>\n\n        <div id="viewerContainer" tabindex="0" v-loading="loading">\n          <div id="viewer" class="pdfViewer"></div>\n        </div>\n\n        <div id="errorWrapper" hidden=\'true\'>\n          <div id="errorMessageLeft">\n            <span id="errorMessage"></span>\n            <button id="errorShowMore" data-l10n-id="error_more_info">\n              More Information\n            </button>\n            <button id="errorShowLess" data-l10n-id="error_less_info" hidden=\'true\'>\n              Less Information\n            </button>\n          </div>\n          <div id="errorMessageRight">\n            <button id="errorClose" data-l10n-id="error_close">\n              Close\n            </button>\n          </div>\n          <div class="clearBoth"></div>\n          <textarea id="errorMoreInfo" hidden=\'true\' readonly="readonly"></textarea>\n        </div>\n      </div> <!-- mainContainer -->\n\n      <div id="overlayContainer" class="hidden">\n        <div id="passwordOverlay" class="container hidden">\n          <div class="dialog">\n            <div class="row">\n              <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>\n            </div>\n            <div class="row">\n              <!-- The type="password" attribute is set via script, to prevent warnings in Firefox for all http:// documents. -->\n              <input id="password" class="toolbarField">\n            </div>\n            <div class="buttonRow">\n              <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>\n              <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>\n            </div>\n          </div>\n        </div>\n        <div id="documentPropertiesOverlay" class="container hidden">\n          <div class="dialog">\n            <div class="row">\n              <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p>\n            </div>\n            <div class="separator"></div>\n            <div class="row">\n              <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p>\n            </div>\n            <div class="separator"></div>\n            <div class="row">\n              <span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p>\n            </div>\n            <div class="row">\n              <span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p>\n            </div>\n            <div class="buttonRow">\n              <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>\n            </div>\n          </div>\n        </div>\n        <div id="printServiceOverlay" class="container hidden">\n          <div class="dialog">\n            <div class="row">\n              <span data-l10n-id="print_progress_message">Preparing document for printing\xe2\x80\xa6</span>\n            </div>\n            <div class="row">\n              <progress value="0" max="100"></progress>\n              <span data-l10n-id="print_progress_percent" data-l10n-args=\'{ "progress": 0 }\' class="relative-progress">0%</span>\n            </div>\n            <div class="buttonRow">\n              <button id="printCancel" class="overlayButton"><span data-l10n-id="print_progress_close">Cancel</span></button>\n            </div>\n          </div>\n        </div>\n      </div>  <!-- overlayContainer -->\n\n    </div> <!-- outerContainer -->\n    <di