PDFTron нарисует вертикальную рамку, если макет горизонтальный

#javascript #pdftron

#javascript #pdftron

Вопрос:

У меня есть приведенный ниже код, который будет рисовать прямоугольник, когда пользователь нажимает «Shift щелчок левой кнопкой мыши»

  // Draw text box with alt   mouse left click
docViewer.on('click', (evt: any) => {
    if (evt.shiftKey) {
        // Get get window coordinates
        const windowCoords = getMouseLocation(evt);

        // Get current page number
        const displayMode = docViewer.getDisplayModeManager().getDisplayMode();
        const page = displayMode.getSelectedPages(windowCoords, windowCoords);
        const clickedPage = (page.first !== null) ? page.first : docViewer.getCurrentPage();

        // Get page coordinates
        const pageCoordinates = displayMode.windowToPage(windowCoords, clickedPage);

        // create rectangle
        const rectangleAnnot = new instanceAnnotations.RectangleAnnotation();
        rectangleAnnot.PageNumber = clickedPage   1;
        rectangleAnnot.X = pageCoordinates.x;
        rectangleAnnot.Y = pageCoordinates.y - 14;
        rectangleAnnot.Width = 200;
        rectangleAnnot.Height = 14;
        rectangleAnnot.StrokeColor = new instanceAnnotations.Color(255, 0, 0, 1);
        rectangleAnnot.StrokeThickness = 2;
        rectangleAnnot.Author = annotManager.getCurrentUser();

        annotManager.addAnnotation(rectangleAnnot, false);
        annotManager.redrawAnnotation(rectangleAnnot);
    }
});
  

Теперь проблема в том, что код выше рисует прямоугольник нормально, если PDF вертикальный, но если PDF горизонтальный, то он рисует прямоугольник вертикально. Пожалуйста, проверьте скриншот ниже для справки.

введите описание изображения здесь

Как вы можете видеть на странице 1, он рисует вертикальный прямоугольник, но на 2-й странице он рисует нормально. Итак, как это можно решить?

Ответ №1:

Вам необходимо учитывать поворот страницы, чтобы убедиться, что ваш прямоугольник выровнен со страницей. Вот краткий пример того, как вы можете добиться этого с помощью API getCompleteRotation, установив ширину и высоту в зависимости от поворота документа.

 docViewer.on("click", (evt) => {
if (evt.shiftKey) {
  // Get get window coordinates
  const windowCoords = getMouseLocation(evt);

  // Get current page number
  const displayMode = docViewer.getDisplayModeManager().getDisplayMode();
  const page = displayMode.getSelectedPages(windowCoords, windowCoords);
  const clickedPage =
    page.first !== null ? page.first : docViewer.getCurrentPage();

  // Get page coordinates
  const pageCoordinates = displayMode.windowToPage(
    windowCoords,
    clickedPage
  );

  // create rectangle
  const rectangleAnnot = new Annotations.RectangleAnnotation();
  rectangleAnnot.PageNumber = clickedPage   1;

  // Depending on doc orientation set Width and Height
  const rotation = docViewer.getCompleteRotation(clickedPage);

  const widthAndHeight = getWidthAndHeightBasedOnRotation(rotation);
  // You will have to adjust the X, Y  as well depending on rotation
  rectangleAnnot.X = pageCoordinates.x;
  rectangleAnnot.Y = pageCoordinates.y;

  rectangleAnnot.Width = widthAndHeight.width;
  rectangleAnnot.Height = widthAndHeight.height;
  rectangleAnnot.StrokeColor = new Annotations.Color(255, 0, 0, 1);
  rectangleAnnot.StrokeThickness = 2;
  rectangleAnnot.Author = annotManager.getCurrentUser();

  annotManager.addAnnotation(rectangleAnnot, false);
  annotManager.redrawAnnotation(rectangleAnnot);
}});

  const getWidthAndHeightBasedOnRotation = (rotation) => {
    switch (rotation) {
      case CoreControls.PageRotation["E_0"]:
        return {
          width: 200,
          height: 14,
        };
      case CoreControls.PageRotation["E_90"]:
        return {
          width: 14,
          height: 200,
        };
      case CoreControls.PageRotation["E_180"]:
        return {
          width: 200,
          height: 14,
        };
      case CoreControls.PageRotation["E_270"]:
        return {
          width: 14,
          height: 200,
        };
    }
  };
  

Вы можете получить доступ к объекту CoreControls из экземпляра. Пожалуйста, обратите внимание, что вам также нужно будет настроить координаты X, Y на основе поворота. Это хороший ресурс по координатам PDF и координатам просмотра, который поможет вам разобраться в этой части.