所以,我有一个模式的PDF,我用PDF.js呈现了它,我的主要目标是从呈现的pdf中 Select 文本并将其提取到控制台中,但是我的第一个问题是使pdf.js呈现为可 Select 的.

我try 在pdf.js目录中使用viewer.html.我只需要弄清楚如何使文本层可选,如果我做的一切权利.

以下是我的代码:

{% extends 'base.html' %}

{% block title %}Get Started{% endblock %}

{% block content %}
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script>

<style>
    #get-started-page {
        text-align: center;
        margin-top: 50px; /* Add margin-top for space */
    }
    .get-started-card {
        margin: auto;
        margin-bottom: 50px;
        padding: 20px;
        text-align: left; /* Align text to the left */
    }
    .get-started-btn {
        margin-top: 10px; /* Add margin-top for space below the input */
    }
    .modal-body {
        display: flex;
        align-items: center;
        justify-content: center;
        height: 80vh; /* Adjust the height of the modal body */
        overflow-y: auto; /* Enable vertical scrolling if content exceeds the modal height */
    }

    #the-canvas {
        max-width: 100%; /* Make sure the canvas doesn't exceed its container */
        max-height: 100%; /* Make sure the canvas doesn't exceed its container */
    }

    .textLayer {
        position: absolute;
        top: 0;
        left: 0;
        height: 100%;
        width: 100%;
        --scale-factor: 1; /* Set the --scale-factor CSS variable */
    }
</style>

<section id="get-started-page">
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-8">
                <div class="card bg-dark text-white transparent-card get-started-card">
                    <div class="card-body">
                        <h2 class="text-center mb-4">Get Started with IntelliQuest</h2>
                        <div class="mb-3 centerrrrr">
                            <label class="form-label">Upload PDF</label>
                            <div>
                                <input type="file" accept=".pdf" id="pdfInput" />
                            </div>
                            <button type="button" class="btn btn-primary get-started-btn" id="uploadButton">Upload PDF</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>

<!-- Bootstrap Modal -->
<div class="modal fade" id="pdfModal" tabindex="-1" aria-labelledby="pdfModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title" id="pdfModalLabel">Full-size PDF (Page 1 of 1)</h5>
                <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
            </div>
            <div class="modal-body">
                <canvas id="the-canvas"></canvas>
                <div class="textLayer"></div>
            </div>
            <!-- Add navigation buttons inside the modal -->
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" id="prevPageBtn">Previous Page</button>
                <button type="button" class="btn btn-secondary" id="nextPageBtn">Next Page</button>
            </div>
        </div>
    </div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.js" integrity="sha512-dfMpvQclalfL7nRtHdy4+U2GLYb2XJJOgGLgKibrbcbarI/ZLgCAaBCS6+AuWN0OtLn/zFpu+Cggd8TCBYx9Ag==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<script>
    // Set the worker source for PDF.js
    pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.js';

    function handleUpload() {
        var fileInput = document.getElementById('pdfInput');
        var uploadButton = document.getElementById('uploadButton');

        uploadButton.addEventListener('click', function () {
            var file = fileInput.files[0];

            if (file) {
                var pdfUrl = URL.createObjectURL(file);

                loadPdf(pdfUrl);
            } else {
                alert('Please select a PDF file for upload.');
            }
        });
    }

    function loadPdf(url) {
        pdfjsLib.getDocument(url).promise.then(function (pdfDoc_) {
            pdfDoc = pdfDoc_;
            var canvas = document.getElementById('the-canvas');
            var textLayer = document.querySelector(".textLayer");
            var ctx = canvas.getContext('2d');
            var scale = 1;

            function renderPage(num) {
                pdfDoc.getPage(num).then(function (page) {
                    var viewport = page.getViewport({ scale: scale });
                    canvas.height = viewport.height;
                    canvas.width = viewport.width;

                    var renderContext = {
                        canvasContext: ctx,
                        viewport: viewport
                    };
                    page.render(renderContext);

                    // Enable text selection on the canvas
                    canvas.style.userSelect = 'text';

                    // Show text layer
                    pdfjsLib.textLayer.render({
                        textContent: page.getTextContent(),
                        container: textLayer,
                        viewport: viewport,
                        textDivs: []
                    });
                });
            }

            var numPages = pdfDoc.numPages;
            var pageNum = 1;

            renderPage(pageNum);

            document.getElementById('prevPageBtn').addEventListener('click', function () {
                if (pageNum > 1) {
                    pageNum--;
                    renderPage(pageNum);
                }
            });

            document.getElementById('nextPageBtn').addEventListener('click', function () {
                if (pageNum < numPages) {
                    pageNum++;
                    renderPage(pageNum);
                }
            });

            var pdfModal = new bootstrap.Modal(document.getElementById('pdfModal'));
            pdfModal.show();
        });
    }

    handleUpload();
</script>
{% endblock %}

有没有关于如何使PDF可选的提示?

推荐答案

问题是,莫代尔不是一个PDF,它只是一个简单的画布图像.

enter image description here

基本上,PDF.js是一个PDF图像呈现器(它可以按照设计使用),也可以从PDF中提取文本,覆盖在图像上.

enter image description here

此外,当在框架中使用时,PDF也可以在另一个画布中绘制,然后工作人员将注释附加到他看不到的PDF的末尾.

如果您不使用带边框的PDF,则任何添加的层都在PDF本身之外,实际上只是用基于字体的内容(独立于PDF)覆盖的另一个浮动画布.

enter image description here

然而,正如Daniel Cruz所 comments 的那样,pdf.js with text selection中还讨论了其他选项

Javascript相关问答推荐

React Native平面列表自动滚动

Phaser框架-将子对象附加到Actor

窗口.getComputedStyle()在MutationObserver中不起作用

通过在页面上滚动来移动滚动条

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

使搜索栏更改语言

仅针对RTK查询中的未经授权的错误取消maxRetries

MathJax可以导入本地HTML文档使用的JS文件吗?

如何从隐藏/显示中删除其中一个点击?

如何在coCos2d-x中更正此错误

当使用';字母而不是与';var#39;一起使用时,访问窗口为什么返回未定义的?

在Matter.js中添加从点A到另一个约束的约束

如何在Bootstrap中减少网格系统中单个div的宽度

有效路径同时显示有效路径组件和不存在的路径组件

使用类型:assets资源 /资源&时,webpack的配置对象&无效

谷歌饼图3D切片

当S点击按钮时,我如何才能改变它的样式?

如何在不将整个文件加载到内存的情况下,在Node.js中实现Unix粘贴命令?

ReactJS Sweep Line:优化SciChartJS性能,重用wasmContext进行多图表渲染

如何在函数组件中保留对计时器的引用