Как да изтриете празни страници в многостраничен документ?

РЕДАКТИРАНЕ: добавен отговор, защото редактирането би било твърде дълго (вижте отговор 2)

След предишна публикация за обединяване на документи В крайна сметка получих работещ скрипт (Благодаря, Henrique ;), но все още имам един малък проблем: крайният „обединен“ документ съдържа понякога празни страници (в зависимост от съдържанието на други документи), които бих искал да премахна. Не мога да намеря лесен начин да направя това. Скриптът върви така:

function mergeDocs(docIDs) {  // parameter docIDs is an array of Doc IDs
  var baseDocname = DocumentApp.openById(docIDs[0]).getName();// typical name = IMPRESSION_page_07_07-06-2012__20:57
  var modelDoc = DocsList.getFileById(docIDs[0]);
  var newmodelName=baseDocname.substr(0,11)+'multipage'+baseDocname.substring(18);
  var baseDocId = DocsList.copy(modelDoc,newmodelName).getId();// make a copy of firstelement and give it new basedocname build from the serie(to keep margins etc...)
  var baseDoc = DocumentApp.openById(baseDocId)
  var body = baseDoc.getActiveSection();
//
  for( var i = 0; i < docIDs.length; ++i ) {
    var otherCopy = DocumentApp.openById(docIDs[i]).getActiveSection();
    var totalElements = otherCopy.getNumChildren();
    for( var j = 0; j < totalElements; ++j ) {
      var element = otherCopy.getChild(j).copy();
      var type = element.getType();
      if( type == DocumentApp.ElementType.PARAGRAPH )
        body.appendParagraph(element);
      else if( type == DocumentApp.ElementType.TABLE )
        body.appendTable(element);
      else if( type == DocumentApp.ElementType.LIST_ITEM )
        body.appendListItem(element);
      else
        throw new Error("According to the doc this type couldn't appear in the body: "+type);
    }
     body.appendPageBreak(); // if content length is too short avoids breaking page layout
  }
}

„PageBreak“ причинява (понякога) празна страница, знам това (!), но е необходимо да се поддържа перфектно оформление на страницата (аз отпечатвам етикети с този документ). ето връзка към типичен пример


person Serge insas    schedule 07.06.2012    source източник


Отговори (2)


Е, Серж, не мисля, че има нещо в API, което да каже на коя страница принадлежи даден елемент. Така че решаването на това ще бъде трудно :)

Вдясно от прилепа, мисля за "вътрешен" подход. Искам да кажа, че знаете коя страница ви създава проблеми. Ако винаги е едно и също (например имате фиксиран брой етикети), можете просто да преброите прекъсванията на страниците и да премахнете лошия.

Но ако това не е възможно, което е моето предположение, поне знаете оформлението си. Можете да тествате, за да видите колко етикета пасват точно на една страница и след това да преброите етикетите си, така че когато това се случи, да пропуснете добавянето на прекъсване на страницата. Това изглежда като по-добро решение.

От друга страна, в зависимост от вашето оформление, това може да не е възможно или просто твърде трудно. И така, последното нещо, за което мога да се сетя, е да проверя DOM на документа, за да видя дали се случва някакъв специфичен модел, когато прекъсването на страница е само на страница. Тъй като това е някак странно, предполагам, че Google Документи вероятно автоматично вмъква празен абзац на тази страница, така че не е „без деца“ или нещо подобно, може би дори свойство, не знам. Това, което знам е, че това ще изисква доста усилия, извършване на разследване, за да се разбере задълбочено как работи Document DOM. Ако не го направите, вероятно ще трябва да го направя в бъдеще, тъй като често работя с документи като шаблони като този. Когато го направя, ще актуализирам отговора си, ако не сте го направили преди мен :)

person Henrique G. Abreu    schedule 08.06.2012

Модифицирах скрипта, така че да ми дава постоянни резултати и написах функция за анализ, за ​​да получа структурата на документа. Открих, че вероятно е по-добра идея да поставя всичко това в отговор, вместо да редактирам първия си въпрос, защото е малко дълъг. 1° опростен скрипт:

function mergeDocs(docIDs) {
  var baseDocname = DocumentApp.openById(docIDs[0]).getName();// typical name = IMPRESSION_page_07_07-06-2012__20:57
  var modelDoc = DocsList.getFileById(docIDs[0]);
  var newmodelName=baseDocname.substr(0,11)+'multipage'+baseDocname.substring(18);
  var baseDocId = DocsList.copy(modelDoc,newmodelName).getId();// make a copy of firstelement and give it new basedocname build from the serie(to keep margins etc...)
  var baseDoc = DocumentApp.openById(baseDocId)
  var body = baseDoc.getActiveSection();
  var headpara='  *  '
  for (dd=1;dd<baseDoc.getNumChildren();++dd){
  baseDoc.removeChild(baseDoc.getChild(dd))
  }
  for( var i = 0; i < docIDs.length; ++i ) {
    var otherCopy = DocumentApp.openById(docIDs[i]).getActiveSection();
    var totalElements = otherCopy.getNumChildren();

    for( var j = 0; j < totalElements; ++j ) {
      var element = otherCopy.getChild(j).copy();
      var type = element.getType();
      if( type == DocumentApp.ElementType.PARAGRAPH ){
        }
      else if( type == DocumentApp.ElementType.TABLE){
        body.appendTable(element);
          if (i<docIDs.length-1){
              body.appendPageBreak();
              body.appendParagraph(headpara);// add a string '  *  ' to trace it
              }
        }
    }
  }
}

2° функцията за анализ:

function analyse() {
  var Doc = DocumentApp.openById('1UOr44ju8Li6yCSlmFbMRdimNpR2BjCGjcLkrwG9jW74');
    var totalElements = Doc.getNumChildren();
    var el=[]
    for( var j = 0; j < totalElements; ++j ) {
      var element = Doc.getChild(j);
      var type = element.getType();
Logger.log(j+" : "+type)
       if (type =='PARAGRAPH'){
       el[j]=element.getText()
       };
    }
Logger.log(el)    
}

и накрая резултатът от този анализ:

0 : PARAGRAPH
1 : PARAGRAPH
2 : TABLE
3 : PARAGRAPH
4 : PARAGRAPH
5 : PARAGRAPH
6 : TABLE
7 : PARAGRAPH
8 : PARAGRAPH
9 : PARAGRAPH
10 : TABLE
11 : PARAGRAPH
12 : PARAGRAPH
13 : PARAGRAPH
14 : TABLE
15 : PARAGRAPH
[, , NOT_FOUND, , ,   *  , NOT_FOUND, , ,   *  , NOT_FOUND, , ,   *  , NOT_FOUND, ]

(' *' са параграфи, добавени от скрипта, 'NOT_FOUND' са таблиците) И така, сега знам, че прекъсванията на страници се показват като параграфи, че документът сам създава параграфи между таблиците (което причинява празните страници), но дори когато се опитвам да премахна нежелани абзаци с помощта на element.removeFromParent(), продължавам да имам тези празни страници... Малко съм изгубен в момента ;-) Съжалявам, че бях толкова дълъг.

person Serge insas    schedule 08.06.2012
comment
Намерих решение за това в друга публикация - person Serge insas; 12.06.2012