Обнаружение элемента PAGE_BREAK в документах Google с помощью скрипта приложения - PullRequest
3 голосов
/ 12 апреля 2019

Постановка проблемы:

У меня есть документ Google с N числом страниц.Требование - конвертировать каждую страницу в отдельный документ Google.

Решение опробовано:

Попытка найти элемент PAGE_BREAK путем анализа тела, а при обнаружении PAGE_BREAK создайте диапазон, скопируйте содержимое, а затем создайте новый документ Google.

Проблема:

Создан образец документа с текстом одной строки на странице 1 и текстом одной строки на странице 2. При анализе документа не удается обнаружить элемент PAGE_BREAK.Я ожидал, когда контент переходит на страницу 2, должен быть PAGE_BREAK, который в этом случае должен быть дочерним элементом элемента PARAGRAPH.Ниже приведен пример фрагмента кода скрипта приложения Google, который я пробовал:

var activeDocument = DocumentApp.getActiveDocument();
var body = activeDocument.getBody();

function resetDoc() {
  body.clear(); 
  // When PAGE BREAK is added via script, I am able to detect the PAGE_BREAK element using findElement method only.
  // body.appendParagraph("Page 1");
  // body.appendPageBreak();
  // body.appendParagraph("Page 2");
}


function init() {
  const tree = extractTree(body);
  Logger.log(tree);
}


function extractTree(element) {
  const node = {
    element: element,
  };
  if (element.getNumChildren) {
    var numChildren = element.getNumChildren();

    var children = [];

    for (var i = 0; i < numChildren; i++) {
      var child = element.getChild(i);
      var found = findBreak(element);
      if(found)
      {
        Logger.log("Found page break at" + i );
      }
      var childNode = extractTree(child);
      Logger.log(child.getType());
      children.push(childNode);
    }

    node["children"] = children;
  }

  return node;
};


function findBreak(element) {
  var searchType = DocumentApp.ElementType.PAGE_BREAK;
  var breakElement = body.findElement(searchType);
  if(breakElement) {
    Logger.log("Found page break");
    return true;
  } else {
    Logger.log("No page break");
    return false;
  }
}

Любые предложения о том, как мне решить эту проблему.

Журналы:

[19-04-12 15:46:32:636 IST] TEXT
[19-04-12 15:46:32:637 IST] PARAGRAPH
[19-04-12 15:46:32:638 IST] PARAGRAPH
[19-04-12 15:46:32:640 IST] PARAGRAPH
[19-04-12 15:46:32:642 IST] PARAGRAPH
[19-04-12 15:46:32:643 IST] PARAGRAPH
[19-04-12 15:46:32:645 IST] PARAGRAPH
[19-04-12 15:46:32:647 IST] PARAGRAPH
[19-04-12 15:46:32:648 IST] PARAGRAPH
[19-04-12 15:46:32:650 IST] PARAGRAPH
[19-04-12 15:46:32:651 IST] PARAGRAPH
[19-04-12 15:46:32:653 IST] PARAGRAPH
[19-04-12 15:46:32:655 IST] PARAGRAPH
[19-04-12 15:46:32:656 IST] PARAGRAPH
[19-04-12 15:46:32:658 IST] PARAGRAPH
[19-04-12 15:46:32:660 IST] PARAGRAPH
[19-04-12 15:46:32:662 IST] PARAGRAPH
[19-04-12 15:46:32:663 IST] PARAGRAPH
[19-04-12 15:46:32:665 IST] PARAGRAPH
[19-04-12 15:46:32:666 IST] PARAGRAPH
[19-04-12 15:46:32:668 IST] PARAGRAPH
[19-04-12 15:46:32:670 IST] PARAGRAPH
[19-04-12 15:46:32:671 IST] PARAGRAPH
[19-04-12 15:46:32:673 IST] PARAGRAPH
[19-04-12 15:46:32:675 IST] PARAGRAPH
[19-04-12 15:46:32:676 IST] PARAGRAPH
[19-04-12 15:46:32:678 IST] PARAGRAPH
[19-04-12 15:46:32:680 IST] PARAGRAPH
[19-04-12 15:46:32:682 IST] PARAGRAPH
[19-04-12 15:46:32:684 IST] PARAGRAPH
[19-04-12 15:46:32:685 IST] PARAGRAPH
[19-04-12 15:46:32:687 IST] PARAGRAPH
[19-04-12 15:46:32:689 IST] PARAGRAPH
[19-04-12 15:46:32:690 IST] PARAGRAPH
[19-04-12 15:46:32:692 IST] PARAGRAPH
[19-04-12 15:46:32:693 IST] PARAGRAPH
[19-04-12 15:46:32:695 IST] PARAGRAPH
[19-04-12 15:46:32:697 IST] PARAGRAPH
[19-04-12 15:46:32:699 IST] PARAGRAPH
[19-04-12 15:46:32:701 IST] PARAGRAPH
[19-04-12 15:46:32:702 IST] PARAGRAPH
[19-04-12 15:46:32:704 IST] PARAGRAPH
[19-04-12 15:46:32:705 IST] PARAGRAPH
[19-04-12 15:46:32:706 IST] PARAGRAPH
[19-04-12 15:46:32:708 IST] TEXT
[19-04-12 15:46:32:709 IST] PARAGRAPH
[19-04-12 15:46:32:710 IST] PARAGRAPH
[19-04-12 15:46:32:711 IST] PARAGRAPH
[19-04-12 15:46:32:712 IST] {children=[{children=[{element=Text}], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}, {children=[{element=Text}], element=Paragraph}, {children=[], element=Paragraph}, {children=[], element=Paragraph}], element=DocumentBodySection}

[19-04-12 15: 46: 32: 706 IST] PARAGRAPH должен быть PAGE_BREAK, но это ПАРАГРАФ.

Пример документа Google:
https://docs.google.com/document/d/1bs_Jcfs-n1VEx65Ew5buBpsf_JCHgX0A7NHYIY8mAqw/edit?usp=sharing

Ссылочная ссылка:
1. Документация скрипта приложения Google
https://developers.google.com/apps-script/reference/document/page-break

1 Ответ

0 голосов
/ 13 апреля 2019

Прежде всего, я не уверен, что правильно понял задачу, потому что в общем случае наличие N визуальных страниц не означает наличие N-1 явных разрывов страниц. Я предположил, что вы хотите использовать только явные разрывы страниц, поскольку у вас уже есть некоторые попытки их найти.

Самая полезная единица (объект) для копирования фрагментов документа в этом случае - Абзац . Следующая функция берет все абзацы документа и проверяет каждый из них на наличие элемента PAGE_BREAK. Если PAGE_BREAK найден, то это означает конец одной страницы и начало другой. Конечно, нам нужно создать новый целевой документ в это время, чтобы продолжить копирование.

function copyPartsByPageBreaks() {
  var activeDoc = DocumentApp.getActiveDocument();
  var pars = activeDoc.getBody().getParagraphs();
  var pageIndex = 0;
  var targetBody = DocumentApp.create('PageBreak.' + pageIndex).getBody();
  while (pars.length > 0) {
    var p = pars.shift();
    targetBody.appendParagraph(p.copy());
    if (p.findElement(DocumentApp.ElementType.PAGE_BREAK) != null) {
      pageIndex++;  // Prepare a new target place for coping
      targetBody = DocumentApp.create('PageBreak.' + pageIndex).getBody();
    }
  }
}
...