Установите номера страниц, чтобы они начинались с заданного номера в Word с Java

Я могу добавить номера страниц в файл docx с помощью этого метода, но я не знаю, как сделать так, чтобы номера страниц начинались с определенного числа (например, я хочу, чтобы на первой странице было "5").

Я пытался использовать CTPageNumber, но следующее ничего не добавило в документ:

static void addPageNumbers(XWPFDocument doc, int startingNum) {
  CTSectPr sectPr = doc.getDocument().getBody().isSetSectPr() ? doc.getDocument().getBody().getSectPr()
    : doc.getDocument().getBody().addNewSectPr();
  CTPageNumber pgNum = sectPr.isSetPgNumType() ? sectPr.getPgNumType() : sectPr.addNewPgNumType();
  pgNum.setStart(BigInteger.valueOf(startingNum));
  pgNum.setFmt(STNumberFormat.DECIMAL);
}

person James    schedule 25.09.2018    source источник
comment
Может быть, в документе есть несколько разделов, а не только один из тела? См. stackoverflow.com/questions/50054304/ для примера   -  person Axel Richter    schedule 26.09.2018
comment
Насколько я помню, порядок свойств раздела имеет решающее значение. Насколько я могу судить, этот код просто добавляет новый. Если я посмотрю на лежащий в основе Word Open XML тестовый файл, в котором я указал нумерацию страниц, начинающуюся с 5, элемент <w:pgNumType w:start="5"/> будет добавлен непосредственно после элемента w:footer. Вы можете попытаться убедиться, что вы делаете то же самое...   -  person Cindy Meister    schedule 26.09.2018


Ответы (1)


Повозившись некоторое время, я смог решить это с помощью:

static void addPageNumbers(XWPFDocument doc, long startingNum) {
  CTBody body = document.getDocument().getBody();
  CTSectPr sectPr = body.isSetSectPr() ? body.getSectPr() : body.addNewSectPr();
  CTPageNumber pgNum = sectPr.isSetPgNumType() ? sectPr.getPgNumType() : sectPr.addNewPgNumType();
  pgNum.setStart(BigInteger.valueOf(startingNum));

  CTP ctp = CTP.Factory.newInstance();
  ctp.addNewR().addNewPgNum(); // Not sure why this is necessary, but it is.

  XWPFParagraph footerParagraph = new XWPFParagraph(ctp, document);
  footerParagraph.setAlignment(ParagraphAlignment.CENTER); // position of number
  XWPFParagraph[] paragraphs = { footerParagraph };

  XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);
  headerFooterPolicy.createFooter(STHdrFtr.FIRST, paragraphs);
  headerFooterPolicy.createFooter(STHdrFtr.DEFAULT, paragraphs); // DEFAULT doesn't include the first page
}
person James    schedule 27.09.2018