Aspose生成word添加一个具有横向页面的文档时出现换页

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Aspose生成word添加一个具有横向页面的文档时出现换页相关的知识,希望对你有一定的参考价值。

如图,在“1”处实现换页(采用的section,并设置其页面方向),然后写入“培训公告”,再附加word文档(登记表就是另一个word文档,页面横向,要保持横向)时“培训公告”与登记表之间多了一个分节符,这个分节符将“培训公告”与登记表分在了两页,怎样去除这个分页符,让培训公告与登记表连起来( srcDoc.FirstSection.PageSetup.SectionStart = SectionStart.Continuous;没管用)

参考技术A 以word 2007说明如下:

1、光标放在需要插入横向页面开始,单击“页面布局”,在“页面设置”菜单框中,依次点击“分隔符”、“连续”。

2、单击“页面设置”右下的小三角,在下拉“页面设置”框中,选择“横向”,“确定”。

3、其效果如下。如果这一页以后,还是竖向,那就要在这一页后,重复以上几个步骤,最后选择“竖向”就行了。
参考技术B 在Word中,默认为一节,每节的页面格式是相同的,若想在一个Word文档中,某一页设置为横向,必须插入分节符,使文档分成两节,这样就可以单独设置纸张方向了。 操作步骤: 1、将光标放在需要设置为横向页的首部,单击页面布---->分隔符---->分节

在 Java 中使用 Apache POI XWPF 在 Word 文档中的横向/纵向之间切换

【中文标题】在 Java 中使用 Apache POI XWPF 在 Word 文档中的横向/纵向之间切换【英文标题】:Switching between Landscape/portrait in word document using Apache POI XWPF in Java 【发布时间】:2015-04-02 08:19:54 【问题描述】:

我试图在here 的帮助下在单个页面上设置页面方向,但没有成功。此代码 sn -p 生成一个文档,但它只将最后一页设置为横向。我不知道出了什么问题...任何帮助或指导将不胜感激!

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

编辑: 这给了我 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>

编辑 2:这就是使用 Word 创建时 document.xml 的样子(删除了一些不相关的东西......)。恐怕我在 POI 方面还不够好,无法弄清楚如何使它生成这样的 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));
    

【问题讨论】:

您似乎没有将页面文本添加到您正在创建的部分中。如果您针对横向/纵向部分创建段落/运行会发生什么? 怎么做? CTSectPr 没有创建段落/运行的方法...不是 br.setSectPr(section); 行吗?应该将此段设置为本节? 我不确定。如果您在 word 中创建一个包含几个不同部分的简单 .docx,然后解压缩 .docx 文件(它是 xml 的 zip),这些段落是如何绑定到它们的部分的? 在帖子中编辑以包含生成的 document.xml。不知何故,我需要将段落绑定到正确的部分。试图将文本添加到在方法 changeOrientation 中创建的段落中,但没有成功... 尝试在 Word 中创建相同的示例文档,解压缩 word 生成的版本,然后发布其中的(关键)部分,展示 Word 是如何执行这些部分的 【参考方案1】:

请在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(Section Properties),在具有多个section的文档中,section属性(sectPr元素)存储为:的子元素:

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

您可以使用CTPPraddNewSectPr 方法为其添加CTSectPrCTBody 的末尾有一个 CTSectPr。您可以使用getSectPr 方法获取它。

【讨论】:

根据 OOXML 规范,CTSectPr 应该出现在节的末尾。所以你应该在创建节段落之后而不是之前设置CTSectPr 现在(几乎)可以工作了。感谢你的帮助!声望不足,无法投票,抱歉...

以上是关于Aspose生成word添加一个具有横向页面的文档时出现换页的主要内容,如果未能解决你的问题,请参考以下文章

如何通过更改页面方向从 JavaScript 生成 Word 文档? (纵向到横向)

Aspose.Words操作word生成PDF文档

利用Aspose.Word控件实现Word文档的操作

如何在 Aspose.Words 中插入自定义页码

黄聪:利用Aspose.Word控件实现Word文档的操作(转)

aspose.word 把Word转成图片时,格式变了