bootd
@bootd
Гугли и ты откроешь врата знаний!

Как отобразить ссылки в PDF.js?

Добрый вечер, ребята. На проекте нужно сделать просмотр pdf файлов. Воспользовался библиотекой pdf.js
Сделал постраничный вывод, отдельным слоем вывел текст, но столкнулся с проблемой.

Проблема заключается в том, что в pdf файлах есть ссылки. И вот эти ссылки я никак не могу отобразить.
Вот например функция для отрисовки текста отдельным слоем:
код
pageTextLayer (page) {
            return page
                .getTextContent()
                .then(textContent => {
                    let container = this.$refs.pdfTextLayer
                    container.innerHTML = ''

                    PDF.renderTextLayer({
                        textContent,
                        container,
                        viewport: this.viewport,
                        textDivs: []
                    })
                })
        },

Она замечательно работает, весь текст вывелся, но ссылки вывелись обычным текстом.
Долго гуглил, копался в исходниках примеров и нашёл метод, который позволяет получить аннотации текущей страницы, вроде то, что нужно:
код
pageAnnotationLayer (page) {
            return page
                .getAnnotations()
                .then(annotations => {
                    annotations.forEach(annotation => {
                        // нужны только ссылки
                        if (annotation.subtype !== 'Link' && !annotation.url) {
                            return
                        }

                        // Но вот тут дальше не пойму что делать, если с выводом слоя с текстом есть отдельный метод, который создаёт div элементы с нужным позиционированием и размером, то с аннотациями я так и не нашёл нужного метода
                    })
                })
        },


Помогите понять, как вывести ссылки отдельным слоем
  • Вопрос задан
  • 703 просмотра
Решения вопроса 1
@Naysan
Нашла такое решение
// Loading document.
PDFJS.getDocument(DEFAULT_URL).then(function (pdfDocument) {
  // Document loaded, retrieving the page.
  return pdfDocument.getPage(PAGE_TO_VIEW).then(function (pdfPage) {
    // Creating the page view with default parameters.
    var pdfPageView = new PDFJS.PDFPageView({
      container: container,
      id: PAGE_TO_VIEW,
      scale: SCALE,
      defaultViewport: pdfPage.getViewport(SCALE),
      // We can enable text/annotations layers, if needed
      textLayerFactory: new PDFJS.DefaultTextLayerFactory(),
      annotationLayerFactory: new PDFJS.DefaultAnnotationLayerFactory()
    });
    // Associates the actual page with the view, and drawing it
    pdfPageView.setPdfPage(pdfPage);
    return pdfPageView.draw();
  });
});

Тут и текст и ссылки добавляются, еще нужно подключить сss чтоб annotation встали на место.
import 'pdfjs-dist/web/pdf_viewer.css';
Можно сделать и через метод который вы нашли :
import { AnnotationLayerBuilder } from 'pdfjs-dist/lib/web/annotation_layer_builder';
import { SimpleLinkService} from 'pdfjs-dist/lib/web/pdf_link_service';
import NullL10n from 'pdfjs-dist/lib/web/ui_utils.js';

var annotateMeta = page.getAnnotations().then(function (data) {

        var annotation = new AnnotationLayerBuilder({
          pageDiv: textcontainer,
          linkService: new SimpleLinkService(),
          pdfPage: page,
          l10n: NullL10n
        })
        annotation .render(viewport);
      });


Но первый вариант мне больше нравится
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 апр. 2024, в 07:58
500 руб./в час
18 апр. 2024, в 07:22
45000 руб./за проект
18 апр. 2024, в 01:12
150000 руб./за проект