如何用pdf.js搜索?

cho*_*ake 13 javascript angularjs pdf.js ionic-framework

我正在我的Ionic App中显示带有pdf.js的pdf文件.我不使用viewer.js和viewer.html,因为我需要一个完全不同的布局.现在我有一个自定义搜索栏,我想在我的pdf文件中突出显示术语.我可以调用这个功能吗?

我正在渲染这样的文件:

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

$scope.renderPage = function(page) {
    var viewport = page.getViewport(1);
    scale = document.getElementById('viewer').clientWidth / viewport.width;
    viewport = page.getViewport(scale);

    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    var renderContext = {
        canvasContext: ctx,
        viewport: viewport
    };

    canvas.height = viewport.height;
    canvas.width = viewport.width;

    var canvasContainer = document.getElementById('viewer');
    canvasContainer.appendChild(canvas);

    page.render(renderContext);
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<div id="viewerContainer" style="padding-bottom: 100%; padding-top: 20px;">
    <div id="viewer" class="viewer-styles">
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

cho*_*ake 14

现在我找到了解决方案!

var container = document.getElementById('viewerContainer');
var viewer = document.getElementById('viewer');


var pdfViewer = new PDFViewer({ 
   container: container,
   viewer: viewer
});

$scope.pdfFindController = new PDFFindController({
   pdfViewer: pdfViewer
);

pdfViewer.setFindController($scope.pdfFindController);

container.addEventListener('pagesinit', function () {
    pdfViewer.currentScaleValue = 'page-width';                            
});

PDFJS.getDocument(MY_PATH_TO_THE_PDF).then(function (pdfDocument) {
    pdfViewer.setDocument(pdfDocument);
});
Run Code Online (Sandbox Code Playgroud)

搜索条件:

$scope.pdfFindController.executeCommand('find', {
    caseSensitive: false, 
    findPrevious: undefined,
    highlightAll: true, 
    phraseSearch: true, 
    query: "myQuery"
});
Run Code Online (Sandbox Code Playgroud)

我必须导入viewer.js.

我不再需要在问题中发布的代码了.PDFViewer呈现pdf.

  • 只是好奇,您是否使用“viewer.js”工具的某种文档弄清楚了这一点?除了使用通用“viewer.html”页面之外,我在使用该工具时遇到了问题 (3认同)
  • 你好@derelict!我很高兴能帮助你.我更改了pdfjs以便它只显示一个页面并在此页面上搜索(原因:移动设备上的Permormance问题).我认为匹配数组是正确的方法,但我没有尝试这样做.也许你可以通过计算pdfLength*pageNumber或类似的东西来获得滚动长度并向下滚动? (2认同)
  • 在哪里可以找到viewer.js? (2认同)
  • 看起来 setFindController 方法已被弃用。使用:`var findController = PDFViewer.findController; findController.executeCommand(...) ` (2认同)

小智 7

这是一个旧线程,但我认为人们现在应该知道该包是如何工作的。我已经设法让它按以下方式工作。我使用 iframe 来显示 pdf。

const iframeDocument = document.getElementById('pdf-js-viewer').contentWindow;
let searchText = "TheTextYouWantoToHighlight";

iframeDocument.PDFViewerApplication.pdfViewer.findController.executeCommand('find', {
    caseSensitive: false, 
    findPrevious: undefined,
    highlightAll: true, 
    phraseSearch: true, 
    query: searchText
})
Run Code Online (Sandbox Code Playgroud)

使用最新版本的 pdfjs,这可以工作,但在控制台中使用调度事件时会出现错误。此代码将消除该错误并按预期工作。

const iframeDocument = document.getElementById('pdf-js-viewer').contentWindow;
let searchText = "TheTextYouWantoToHighlight";
iframeDocument.PDFViewerApplication.eventBus.dispatch('find', {
    caseSensitive: false,
    findPrevious: undefined,
    highlightAll: true,
    phraseSearch: true,
    query: searchText
});
Run Code Online (Sandbox Code Playgroud)