2016-12-14 3 views
1

Я пытаюсь объединить разностный документ (Docx) с Apache POIFS, но не может успешно определить соответствующий заголовок для каждого раздела. Моя первая страница отображается с собственным заголовком, тогда у меня есть только один заголовок для всех других страниц. И просто не удается добиться того, как иметь разные заголовки для каждого раздела.Создайте другой заголовок для каждого раздела в Apache POIFS

Пожалуйста, если кто-то знает, как это сделать ... Вот мой код, который просто объединяет все мои дополнительные заголовки к оригиналу (в конце у меня есть только один заголовок со всеми значениями всех моих разные оригинальные заголовки объединяются в нем).

private void appendHeader(final XWPFDocument destDocx, final XWPFDocument additionalDocx) throws IOException, XmlException { 
     ////// ==> No matter how I create the policy, the result is the same 
//  final XWPFHeaderFooterPolicy destPolicy = destDocx.createHeaderFooterPolicy(); 
     final XWPFHeaderFooterPolicy destPolicy = new XWPFHeaderFooterPolicy(destDocx); 
     final List<XWPFHeader> destHeaders = destDocx.getHeaderList(); 
     LOGGER.trace("Dest header size: {}", destHeaders.size()); 
     LOGGER.trace("Additional header size: {}", additionalDocx.getHeaderList().size()); 

     // Loop on additional headers to add them to the dest doc. 
     for (final XWPFHeader additionaHeader : additionalDocx.getHeaderList()) { 
      // Get the new header I want for this section 
      final String additionalXmlHeader = additionaHeader._getHdrFtr().xmlText(); 

      // Format it properly 
      final CTHdrFtr newHeader = CTHdrFtr.Factory.parse(additionalXmlHeader); 
      // And add it to the document 
      ////// ==> No matter how I set my header... 
//   destHeader.setHeaderFooter(newHeader); 
      final XWPFHeader destHeader = new XWPFHeader(destDocx, newHeader); 
     } 

     // This simply increases each time I'm adding a new header while I would like to have specific header for each section of the document 
     LOGGER.trace("New dest header size: {}", destHeaders.size()); 
    } 

Cheers. Olivier

ответ

1

Это будет сложно, поскольку POI еще не поддерживает создание нескольких разделов, а также не поддерживает добавление верхних и нижних колонтитулов в любой раздел, отличный от раздела по умолчанию (который является последним разделом документа). Возможно, вы сможете делать то, что хотите, используя классы CT, но вам придется исследовать, как работают секции, поскольку я еще не разработал все различные требования.

Вот что должно произойти, если вы собираетесь использовать классы CT. Вам нужно добавить абзац при каждом разрыве раздела. Затем вам нужно создать элемент свойств раздела в этом параграфе. BTW, раздел по умолчанию можно найти в конце тела документа без оболочки абзаца, это раздел по умолчанию, и он охватывает все, что до него до предыдущего параграфа. Поэтому свойства раздела находятся в конце раздела, а не в начале, как и следовало ожидать. И все свойства раздела, кроме последнего раздела, содержатся в параграфе. И последний раздел - это раздел по умолчанию. Странно, не так ли? Теперь внутри раздела, в котором вы хотите иметь специальные заголовки, вам нужно добавить отношения заголовка/нижнего колонтитула. Посмотрите на последний раздел, чтобы посмотреть, как это выглядит. Вы можете воспроизвести его. Тогда вам придется вручную создать новую часть заголовка для этих отношений. Если вы просто создаете новый заголовок по умолчанию или первой страницы с использованием существующих методов, он вернет текущий верхний или нижний колонтитул для раздела по умолчанию (создание одного если он еще не существует). Это означает, что вам придется пройти через код заголовка create и обобщить это, чтобы создать деталь и вставить отношения в раздел, для которого требуется верхний/нижний колонтитул.

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

XWPFDocument doc = new XWPFDocument(); 

    XWPFParagraph p = doc.createParagraph(); 

    XWPFRun r = p.createRun(); 
    r.setText("Some Text"); 
    r.setBold(true); 
    r = p.createRun(); 
    r.setText("Goodbye"); 

    // create header/footer functions insert an empty paragraph 
    XWPFHeader head = doc.createHeader(HeaderFooterType.FIRST); 
    head.createParagraph().createRun().setText("First page header"); 

    XWPFFooter foot = doc.createFooter(HeaderFooterType.FIRST); 
    foot.createParagraph().createRun().setText("First page footer"); 

    // create header/footer functions insert an empty paragraph 
    XWPFHeader head = doc.createHeader(HeaderFooterType.DEFAULT); 
    head.createParagraph().createRun().setText("header"); 

    XWPFFooter foot = doc.createFooter(HeaderFooterType.DEFAULT); 
    foot.createParagraph().createRun().setText("footer"); 

    OutputStream os = new FileOutputStream(new File("header2.docx")); 
    doc.write(os); 
    doc.close(); 

четный/нечетные заголовки страниц и колонтитулы также не поддерживаются (по состоянию на 3.16 беты 1) для создания даже если перечисление существует.

+0

(извините, хотя я уже ответил) Ничего себе! Нелегко. Я буду копаться в этом чуть позже, когда у меня будет время на мой проект. В настоящее время я просто использовал поворот, где мне не нужны эти дополнительные заголовки ... В любом случае, спасибо за вашу помощь. – Olivier

+0

Если вы найдете хороший способ поддержки разделов и их верхних и нижних колонтитулов, вы можете пожертвовать этот код POI, и мы бы с благодарностью включили его в проект. – jmarkmurphy