2014-10-21 2 views
0

Я пытаюсь использовать Java и библиотеку POI Apache для создания документа Word, содержащего пейзаж и некоторые портретизированные страницы. Я могу изменить ориентацию всех страниц, но есть ли способ изменить ориентацию некоторых из них? Я пробовал использовать разные разделы и тела, но безрезультатно.Пейзажные и портретные страницы в документе того же слова с использованием Apache POI XWPF в Java

На данный момент я написал функцию, которая принимает XWPFDocument как входной сигнал и изменяет ориентацию нового тела. Я надеялся, что изменение ориентации для нового тела не повлияет на предыдущие страницы, но влияет на весь документ.

private void changeOrientation(XWPFDocument document, String orientation){ 
    CTDocument1 doc = document.getDocument(); 
    CTBody body = doc.addNewBody(); 
    body.addNewSectPr(); 
    CTSectPr section = body.getSectPr(); 
    if(!section.isSetPgSz()) { 
     section.addNewPgSz(); 
    } 
    CTPageSz pageSize = section.getPgSz(); 
    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

Если вы создаете простой 2-страничный документ в Word, с одним пейзажем и одним портретом, то читаете, что в Apache POI, как POI видит размеры страниц? – Gagravarr

+0

Он видит его как ориентацию последней страницы – Jess

ответ

2

Оказывается, в CTPPr (раздел перерыва) необходима, что может быть сделано с помощью следующего кода:

private 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.getPgSz(); 
    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)); 
    } 
} 

Однако, это только работает один раз, поэтому страницы не могут чередоваться ориентации. Это должны быть все пейзажные страницы сначала, а портрет - последний или наоборот.

1

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

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

Таким образом, чтобы изменить ориентацию страницы секции нужно создать или найти соответствующую sectPr и используйте следующий код:

private void changeOrientation(CTSectPr section, String orientation) { 
    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)); 
    } 
} 
Смежные вопросы