Введение

PDF JS отлично подходит для отображения PDF-файлов на вашем милом веб-сайте. На момент написания этой статьи он был встроен в браузер Mozilla Firefox и отвечает за автоматическую визуализацию PDF-файлов в браузере.

Руководства и ссылки

Самой по себе официальной документации немного не хватает, см. здесь или направленные документы здесь. Тем не менее, есть несколько онлайн-ресурсов, которые довольно полезны, например:

Шаг первый: скрипты

Вам понадобится способ получить сценарии pdfjs в вашем проекте. Самый простой способ — через CDN, но веб-пакеты или сборки с исходным кодом также являются хорошей альтернативой. Мы будем использовать CDN.



На момент написания была доступна версия 3.5.141.

<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.5.141/pdf.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.5.141/pdf_viewer.min.css" />

pdf-viewer CSS требуется для оформления содержимого.

Шаг 2: Инициализируйте работника

Загрузите рабочий файл pdf-js и псевдоним PDF js для удобства.

const PDFJS = window['pdfjs-dist/build/pdf'];
// Note: Worker version should be same to pdf-js
PDFJS.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.5.141/pdf.worker.min.js';

Убедитесь, что рабочая версия совпадает с версией pdf-js, иначе у вас могут возникнуть проблемы.

Шаг 3: Загрузите документ

Этот шаг более-менее стандартный, как описано в примерах официальных документов, по сути загружая документ (из URL-адреса или необработанных данных), затем при необходимости обрабатывая промисы.

PDFJS.getDocument({ url: pdf_url }).promise.then(function (pdf_doc) {
    __PDF_DOC = pdf_doc;
    // Do things...
    // Show the first page
    showPage(1);
}).catch(function (error) {
    // An error occurred
});

Шаг 4: визуализация страницы и отображение текста

Здесь мы визуализируем PDF-файл на холсте и накладываем на него текстовый слой. Нам понадобятся следующие элементы:

<canvas id="pdf-canvas" width="400"></canvas>
<div id="text-layer" class="textLayer"></div>

Примечание.Класс textLayer жизненно важен для стилей (помните стили pdf_viewer, которые мы добавили?)

В функцию рендеринга вашей страницы добавьте еще один вызов для рендеринга наложения текста.

function showPage(page_no) {
    // ...

    // Fetch the page
    __PDF_DOC.getPage(page_no).then(function (page) {
        // Get viewport of the page at required scale
        let viewport = page.getViewport({
            scale: 1,
        });

        // As the canvas is of a fixed width we need to set the scale of the viewport accordingly
        let scale = __CANVAS.width / viewport.width;
        viewport = page.getViewport({
            scale: scale
        });

        // Set canvas height
        __CANVAS.height = viewport.height;

        var renderContext = {
            canvasContext: __CANVAS_CTX,
            viewport: viewport
        };

        // Render the page contents in the canvas
        page.render(renderContext).promise.then(function () {
            // ...

            // Return the text contents of the page after the pdf has been rendered in the canvas
            return page.getTextContent();
        }).then(function (textContent) {
            // Get canvas offset
            var canvas_offset = $("#pdf-canvas").offset();

            // Clear HTML for text layer
            $("#text-layer").html('');

            // Assign the CSS created to the text-layer element
            document.getElementById('text-layer').style.setProperty('--scale-factor', viewport.scale);
            $("#text-layer").css({ left: canvas_offset.left + 'px', top: canvas_offset.top + 'px'});

            // Pass the data to the method for rendering of text over the pdf canvas.
            PDFJS.renderTextLayer({
                textContentSource: textContent,
                container: $("#text-layer").get(0),
                viewport: viewport,
                textDivs: []
            });
        });
    });
}

Вот и все.

Исходный код

Исходный код доступен на github



Заключение

PDF JS рулит!