带有文字选择的pdf.js

cla*_*rkk 11 javascript jquery pdf.js

如何使PDF中的文本可选?

在这里尝试过.PDF写得很好,但没有文字选择

https://github.com/mozilla/pdf.js

https://github.com/mozilla/pdf.js/blob/master/web/text_layer_builder.css
https://github.com/mozilla/pdf.js/blob/master/web/text_layer_builder.js

'use strict';

PDFJS.getDocument('file.pdf').then(function(pdf){
    var page_num = 1;
    pdf.getPage(page_num).then(function(page){
        var scale = 1.5;
        var viewport = page.getViewport(scale);
        var canvas = document.getElementById('the-canvas');
        var context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;

        var canvasOffset = $(canvas).offset();
        var $textLayerDiv = $('#text-layer').css({
            height : viewport.height+'px',
            width : viewport.width+'px',
            top : canvasOffset.top,
            left : canvasOffset.left
        });

        page.render({
            canvasContext : context,
            viewport : viewport
        });

        page.getTextContent().then(function(textContent){
            var textLayer = new TextLayerBuilder({
                textLayerDiv : $textLayerDiv.get(0),
                pageIndex : page_num - 1,
                viewport : viewport
            });

            textLayer.setTextContent(textContent);
            textLayer.render();
        });
    });
});

<body>
  <div>
    <canvas id="the-canvas" style="border:1px solid black;"></canvas>
    <div id="text-layer" class="textLayer"></div>
  </div>
</body>
Run Code Online (Sandbox Code Playgroud)

She*_*epy 14

您的JavaScript代码非常完美.您只需要包含Text Layer Builder所依赖的UI实用程序:

https://github.com/mozilla/pdf.js/blob/master/web/ui_utils.js

或者在HTML中:

<script src="https://raw.githubusercontent.com/mozilla/pdf.js/master/web/ui_utils.js"></script>
Run Code Online (Sandbox Code Playgroud)

如果您运行代码(没有ui_utils)并检查调试控制台,您将看到ReferenceError: CustomStyle is not defined.一个快速搜索在PDFjs的回购会告诉你它是在ui_utils.js定义.

这是我的最小但完整的代码供您参考.我在这里使用PDFjs的演示pdf .请注意,在生产中,您不应链接到raw.github.

<!DOCTYPE html><meta charset="utf-8">
<link rel="stylesheet" href="https://raw.githubusercontent.com/mozilla/pdf.js/master/web/text_layer_builder.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://raw.githubusercontent.com/mozilla/pdf.js/master/web/ui_utils.js"></script>
<script src="https://raw.githubusercontent.com/mozilla/pdf.js/master/web/text_layer_builder.js"></script>
<script src="https://mozilla.github.io/pdf.js/build/pdf.js"></script>
<body>
  <div>
    <canvas id="the-canvas" style="border:1px solid black;"></canvas>
    <div id="text-layer" class="textLayer"></div>
  </div>
<script>
'use strict';

PDFJS.getDocument('file.pdf').then(function(pdf){
    var page_num = 1;
    pdf.getPage(page_num).then(function(page){
        var scale = 1.5;
        var viewport = page.getViewport(scale);
        var canvas = $('#the-canvas')[0];
        var context = canvas.getContext('2d');
        canvas.height = viewport.height;
        canvas.width = viewport.width;

        var canvasOffset = $(canvas).offset();
        var $textLayerDiv = $('#text-layer').css({
            height : viewport.height+'px',
            width : viewport.width+'px',
            top : canvasOffset.top,
            left : canvasOffset.left
        });

        page.render({
            canvasContext : context,
            viewport : viewport
        });

        page.getTextContent().then(function(textContent){
           console.log( textContent );
            var textLayer = new TextLayerBuilder({
                textLayerDiv : $textLayerDiv.get(0),
                pageIndex : page_num - 1,
                viewport : viewport
            });

            textLayer.setTextContent(textContent);
            textLayer.render();
        });
    });
});
</script>
Run Code Online (Sandbox Code Playgroud)


jac*_*ouh 8

在 pdf.js 版本 2.8.61 上,检查的答案不再起作用,因为 renderTextLayer() 已集成到 pdf.js,不再需要外部源,也不需要 jQuery。

以下代码将使 PDF 文本可选。它加载以下PDF文档作为示例,请替换为您自己的:

https://raw.githubusercontent.com/mozilla/pdf.js/ba2edeae/web/compressed.tracemonkey-pldi-09.pdf

它主要使用两个 html 元素:

<canvas id="the-canvas"></canvas>
<div class="textLayer"></div>
Run Code Online (Sandbox Code Playgroud)

用于显示的不可选择文档的画布,用于可选文本的 .textLayer div。.textLayer div 上的文本都是透明的,所以不可见,它只提供选择效果。


<canvas id="the-canvas"></canvas>
<div class="textLayer"></div>
Run Code Online (Sandbox Code Playgroud)


Pet*_*son 5

经过数小时的努力,我发现这篇文章对选择文本和使用没有节点的 pdf.js 非常有帮助。 使用 Mozilla 的 PDF.Js 在 JavaScript 中自定义 PDF 渲染