2015-04-02 2 views
0

Я попытался установить ориентацию страницы на отдельных страницах с помощью справки от here без везения. Этот фрагмент кода генерирует документ, но он устанавливает только последнюю страницу в альбомную. Я не могу понять, что не так ... Любая помощь или руководство будут оценены!Переключение между ландшафтом/портретом в текстовом документе с использованием Apache POI XWPF в Java

public static void main(String[] args) throws Exception { 
    XWPFDocument document = new XWPFDocument(); 
    XWPFParagraph paragraph = document.createParagraph(); 
    XWPFRun run = paragraph.createRun(); 
    run.setText("FIRST PAGE"); 

    changeOrientation(document, "landscape"); 
    paragraph = document.createParagraph(); 
    run = paragraph.createRun(); 
    run.setText("SECOND PAGE"); 

    changeOrientation(document, "portrait"); 
    paragraph = document.createParagraph(); 
    run = paragraph.createRun(); 
    run.setText("THIRD PAGE"); 

    changeOrientation(document, "landscape"); 
    paragraph = document.createParagraph(); 
    run = paragraph.createRun(); 
    run.setText("FOURTH PAGE"); 

    FileOutputStream fos = new FileOutputStream(new File("C:/test.docx")); 
    document.write(fos); 
    fos.close(); 
} 

private static void changeOrientation(XWPFDocument document, String orientation){ 
    CTDocument1 doc = document.getDocument(); 
    CTBody body = doc.getBody(); 
    CTSectPr section = body.addNewSectPr(); 
    XWPFParagraph para = document.createParagraph(); 
    CTP ctp = para.getCTP(); 
    CTPPr br = ctp.addNewPPr(); 
    br.setSectPr(section); 
    CTPageSz pageSize = section.isSetPgSz() ? section.getPgSz() : section.addNewPgSz(); 
    if(orientation.equals("landscape")){ 
     pageSize.setOrient(STPageOrientation.LANDSCAPE); 
     pageSize.setW(BigInteger.valueOf(842 * 20)); 
     pageSize.setH(BigInteger.valueOf(595 * 20)); 
    } 
    else{ 
     pageSize.setOrient(STPageOrientation.PORTRAIT); 
     pageSize.setH(BigInteger.valueOf(842 * 20)); 
     pageSize.setW(BigInteger.valueOf(595 * 20)); 
    } 
} 

EDIT: Это дает мне document.xml (которые не смотрят прямо):

<?xml version="1.0" encoding="UTF-8"?> 
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"><w:body> 
<w:p><w:r><w:t>FIRST PAGE</w:t></w:r></w:p> 
<w:p><w:pPr><w:sectPr/></w:pPr></w:p> 
<w:p><w:r><w:t>SECOND PAGE</w:t></w:r></w:p> 
<w:p><w:pPr><w:sectPr/></w:pPr></w:p> 
<w:p><w:r><w:t>THIRD PAGE</w:t></w:r></w:p> 
<w:p><w:pPr><w:sectPr/></w:pPr></w:p> 
<w:p><w:r><w:t>FOURTH PAGE</w:t></w:r></w:p> 
<w:sectPr><w:pgSz w:orient="landscape" w:w="16840" w:h="11900"/></w:sectPr> 
<w:sectPr><w:pgSz w:orient="portrait" w:h="16840" w:w="11900"/></w:sectPr> 
<w:sectPr><w:pgSz w:orient="landscape" w:w="16840" w:h="11900"/></w:sectPr> 
</w:body></w:document> 

EDIT 2: Это как document.xml выглядит, когда создается с Word (с некоторыми неуместными вещи удалены ...). Боюсь, что я Noot достаточно хорошо на ПОИ, чтобы выяснить, что нужно сделать, чтобы сделать его генерировать XML, как это вместо:

<w:p w:rsidR="004E2FF4" w:rsidRDefault="004E2FF4"><w:pPr><w:sectPr w:rsidR="004E2FF4"><w:pgSz w:w="11906" w:h="16838"/></w:sectPr></w:pPr><w:r><w:t>FIRST PAGE</w:t></w:r></w:p> 
<w:p w:rsidR="004E2FF4" w:rsidRDefault="004E2FF4"><w:pPr><w:sectPr w:rsidR="004E2FF4" w:rsidSect="004E2FF4"><w:pgSz w:w="16838" w:h="11906" w:orient="landscape"/></w:sectPr></w:pPr> 
<w:r><w:lastRenderedPageBreak/><w:t>SECOND PAGE</w:t></w:r></w:p><w:p w:rsidR="004E2FF4" w:rsidRDefault="004E2FF4"><w:pPr><w:sectPr w:rsidR="004E2FF4"><w:pgSz w:w="11906" w:h="16838"/></w:sectPr></w:pPr> 
<w:r><w:lastRenderedPageBreak/><w:t>THIRD PAGE</w:t></w:r></w:p><w:p w:rsidR="00D70BD0" w:rsidRDefault="004E2FF4"> 
<w:r><w:lastRenderedPageBreak/><w:t>FOURTH PAGE</w:t></w:r></w:p><w:sectPr w:rsidR="00D70BD0" w:rsidSect="004E2FF4"><w:pgSz w:w="16838" w:h="11906" w:orient="landscape"/></w:sectPr> 

Редактировать 3: Спасибо за хорошее гидирование, но я могу еще не получить его на 100%. Теперь я изменил код на следующий. Но это привело к установке предыдущей ориентации страницы вместо желаемой. А остальное не получается правильным. Image that shows the resulting pages

private static void changeOrientation(XWPFDocument document, String orientation, boolean pFinalSection){ 
    CTSectPr section; 
    if (pFinalSection) { 
     CTDocument1 doc = document.getDocument(); 
     CTBody body = doc.getBody(); 
     section = body.getSectPr() != null ? body.getSectPr() : body.addNewSectPr(); 
     XWPFParagraph para = document.createParagraph(); 
     CTP ctp = para.getCTP(); 
     CTPPr br = ctp.addNewPPr(); 
     br.setSectPr(section); 
    } else { 
     XWPFParagraph para = document.createParagraph(); 
     CTP ctp = para.getCTP(); 
     CTPPr br = ctp.addNewPPr(); 
     section = br.addNewSectPr(); 
     br.setSectPr(section); 
    } 
    CTPageSz pageSize = section.isSetPgSz() ? section.getPgSz() : section.addNewPgSz(); 
    if(orientation.equals("landscape")){ 
     pageSize.setOrient(STPageOrientation.LANDSCAPE); 
     pageSize.setW(BigInteger.valueOf(842 * 20)); 
     pageSize.setH(BigInteger.valueOf(595 * 20)); 
    } 
    else{ 
     pageSize.setOrient(STPageOrientation.PORTRAIT); 
     pageSize.setH(BigInteger.valueOf(842 * 20)); 
     pageSize.setW(BigInteger.valueOf(595 * 20)); 
    } 
} 
+0

Вы не добавляете текст страницы в разделы, которые вы создаете. Что произойдет, если вы создадите абзацы/прогоны по разделам пейзаж/портрет? – Gagravarr

+0

Как это сделать? CTSectPr не имеет метода создания абзацев/прогонов ... Не строка br.setSectPr (раздел); Предположим, чтобы этот параграф был приведен в этот раздел? –

+0

Не уверен, что у меня на голове. Если вы создаете простой .docx в слове с несколькими разными разделами, то распакуйте файл .docx (это zip из xml), как бы параграфы были привязаны к их разделам? – Gagravarr

ответ

2

Пожалуйста, проверьте мой ответ на такой же проблемой в пост Landscape and portrait pages in the same word document using Apache POI XWPF in Java.

Согласно OOXML Спецификация ECMA-376, Fourth Edition, Part 1 - Fundamentals And Markup Language Reference - 17.6.18 sectPr (раздел Свойства), в документе с несколькими разделами, раздел свойств (элементов sectPr) сохраняются в качестве дочернего элемента:

  • последний пункт в секции, для всех секций, кроме заключительной секции ,
  • элемент кузова, для окончательной секции.

Вы можете использовать addNewSectPr метод CTPPr добавить CTSectPr к нему. CTBody имеет CTSectPr в конце его. Вы можете получить его с помощью метода getSectPr.

+0

По-прежнему не получается работать 100%. См. Мой отредактированный пост ... –

+0

Согласно спецификации OOXML, 'CTSectPr' должен прийти в конце раздела. Поэтому вы должны установить 'CTSectPr' после создания параграфов раздела не раньше. – bbhar

+0

Получил (почти) работу сейчас. Спасибо за вашу помощь! Недостаточно репутации для голосования, извините ... –