我正在尝试使用Java和ApachePOI库来创建一个包含一些横向和一些纵向页面的word文档。我可以更改所有页面的方向,但是有没有办法只更改其中一些页面的方向?我尝试过使用不同的部分和主体,但无济于事。
目前我已经编写了一个函数,它将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));
}
}
谢谢!
事实证明需要一个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));
}
}
但是,这只起作用一次,因此页面不能交替方向。它必须首先是所有横向页面,最后是纵向页面,反之亦然。
根据OOXML规范ECMA-376,第四版,第1部分-基础知识和标记语言参考-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));
}
}