0

我正在尝试使用 Java 和 Apache POI 库来创建一个包含一些横向和一些纵向页面的 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));
    }
}

谢谢!

4

2 回答 2

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));
    }
}

但是,这只适用于一次,因此页面不能改变方向。它必须首先是所有横向页面,最后是纵向页面,反之亦然。

于 2014-10-25T11:23:09.150 回答
1

根据 OOXML Specification ECMA-376, Fourth Edition, Part 1 - Fundamentals And Markup Language Reference - 17.6.18 sectPr(Section Properties),在具有多个 section 的文档中,section properties(sectPr 元素)存储为:

  • 该部分的最后一段,对于除最后一部分之外的所有部分,
  • body 元素,用于最后一部分。

因此,要更改部分的页面方向,应该创建或找到相应的 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));
    }
}
于 2015-01-24T20:31:26.263 回答