避免Word在Apache POI生成的.doc开头显示空白页

Posted

技术标签:

【中文标题】避免Word在Apache POI生成的.doc开头显示空白页【英文标题】:Avoid Word displaying blank page at the beginning of .doc generated by Apache POI 【发布时间】:2018-12-04 21:38:53 【问题描述】:

我在一个 Java 项目中使用 Apache POI。我在横向页面上工作过,代码如下:

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;
if (section.isSetPgSz ()) 
pageSize = section.getPgSz ();
   else 
pageSize = section.addNewPgSz ();

pageSize.setOrient (STPageOrientation.LANDSCAPE);
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));


创建文档后调用该方法

private void dipl()

XWPFDocument document = new XWPFDocument ();
String landscape = "landscape";
changeOrientation (document, landscape);
 // ......

问题是 Word 在横向页面之前的文档开头显示空白纵向页面。 那么,如何避免创建空白页呢?

【问题讨论】:

我相信它来自body.AddNewSectPr。一个文档已经包含一个部分 - 默认部分。如果您添加另一个并将其格式化为“下一页”类型,您将得到一个空白页... 【参考方案1】:

Word 文档的默认部分属性仅在正文中设置,而不在段落中设置。如果部分属性在段落中,则这是附加部分的属性,例如,如果文档包含横向格式的部分和纵向格式的部分。

创建仅具有横向格式信纸大小的Word 文档的最小工作示例是:

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

public class CreateWordLandscape 
 public static void main(String[] args) throws Exception 

  XWPFDocument document= new XWPFDocument();

  CTDocument1 ctDocument = document.getDocument();
  CTBody ctBody = ctDocument.getBody();
  CTSectPr ctSectPr = (ctBody.isSetSectPr())?ctBody.getSectPr():ctBody.addNewSectPr();
  CTPageSz ctPageSz = (ctSectPr.isSetPgSz())?ctSectPr.getPgSz():ctSectPr.addNewPgSz();
  ctPageSz.setOrient(STPageOrientation.LANDSCAPE);
  //paper size letter
  ctPageSz.setW(java.math.BigInteger.valueOf(Math.round(11 * 1440))); //11 inches
  ctPageSz.setH(java.math.BigInteger.valueOf(Math.round(8.5 * 1440))); //8.5 inches

  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run=paragraph.createRun();  
  run.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");

  FileOutputStream out = new FileOutputStream("CreateWordLandscape.docx");  
  document.write(out);
  out.close();
  document.close();

 

【讨论】:

以上是关于避免Word在Apache POI生成的.doc开头显示空白页的主要内容,如果未能解决你的问题,请参考以下文章

使用apache的POI API 生成word文档(docx)时,怎么将一段文字设置成为大纲标题,如设置成标题1

Java Apache POI 读取 Word (.doc) 文件并获取使用的命名字符样式

使用java Apache poi 根据word模板生成word报表

使用 POI 读取 Word 中的书签替换书签内容(doc和docx)

Android基于Spire.Doc.Android生成word

Android基于Spire.Doc.Android生成word