我正在使用Apache POI创建docx文档,我希望将边距设置为窄,就像使用MS Word中的Layout>Margins>narrow一样。
我看到了一些建议RecordInputStream的其他答案,但我不知道如何在代码中集成它,因为它使用FileInputStream作为参数。
我使用ByteArrayOutputStream,因为我正在用omnifaces导出它,我想找到一种使它工作的方法。
这是我的代码:
ByteArrayOutputStream output = new ByteArrayOutputStream();
XWPFDocument document = new XWPFDocument();
XWPFParagraph titleParagraph = document.createParagraph();
//some code here...
document.write(output);
document.close();
Faces.sendFile(output.toByteArray(), wordFilename, true);
请帮忙。提前感谢!
到目前为止,XWPFDocument中没有设置页边距的功能。因此,我们需要使用低级别的beanorg.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr
和org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar
。
word
称之为窄边距的是四周0.5英寸的边距。
import java.io.FileOutputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar;
import java.math.BigInteger;
public class CreateWordPageMargins {
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument();
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("Text");
CTSectPr sectPr = document.getDocument().getBody().getSectPr();
if (sectPr == null) sectPr = document.getDocument().getBody().addNewSectPr();
CTPageMar pageMar = sectPr.getPgMar();
if (pageMar == null) pageMar = sectPr.addNewPgMar();
pageMar.setLeft(BigInteger.valueOf(720)); //720 TWentieths of an Inch Point (Twips) = 720/20 = 36 pt = 36/72 = 0.5"
pageMar.setRight(BigInteger.valueOf(720));
pageMar.setTop(BigInteger.valueOf(720));
pageMar.setBottom(BigInteger.valueOf(720));
pageMar.setFooter(BigInteger.valueOf(720));
pageMar.setHeader(BigInteger.valueOf(720));
pageMar.setGutter(BigInteger.valueOf(0));
FileOutputStream out = new FileOutputStream("CreateWordPageMargins.docx");
document.write(out);
out.close();
document.close();
}
}