由于
apache poi
XWPF到目前为止,确实处于beta状态,因此只有在确切知道
Word将其内容存储到中的情况下,此类事情才有可能
XML。这样就可以解决的不足
apachepoi
XWPF。您已经使用了一种变通方法,
blipID当将图片添加到页眉或页脚中运行时,它可以纠正错过的情况。
发现如何
Word将其内容存储到
XML容器中不是火箭科学。一个
*.docx文件就是一个
ZIP文件。如果使用Zip软件将该文件解压缩,则只需查看一下XML文件即可。
据我所知,不
apachepoi直接支持在Word文档中添加形状(在这种情况下为文本框)。对于这种使用低级别底层对象(在这种情况下
CTGroup和
CTShape)是必要的。
示例:(代码应自我解释)
import java.io.*;import org.apache.poi.util.Units;import org.apache.poi.xwpf.usermodel.*;import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPicture;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTxbxContent;import com.microsoft.schemas.vml.CTGroup;import com.microsoft.schemas.vml.CTShape;import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop;import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc;import org.w3c.dom.Node;import java.math.BigInteger;public class CreateWordHeaderFooterTextBoxPicture { public static void main(String[] args) throws Exception { XWPFdocument doc= new XWPFdocument(); // the body content XWPFParagraph paragraph = doc.createParagraph(); XWPFRun run=paragraph.createRun(); run.setText("The Body:"); paragraph = doc.createParagraph(); run=paragraph.createRun(); run.setText("Lorem ipsum...."); // create header start XWPFHeaderFooterPolicy headerFooterPolicy = doc.createHeaderFooterPolicy(); XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT); // header's first paragraph paragraph = header.getParagraphArray(0); if (paragraph == null) paragraph = header.createParagraph(); paragraph.setAlignment(ParagraphAlignment.LEFT); // create tab stops CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab(); tabStop.setVal(STTabJc.CENTER); int twipsPerInch = 1440; tabStop.setPos(BigInteger.valueOf(3 * twipsPerInch)); tabStop = paragraph.getCTP().getPPr().getTabs().addNewTab(); tabStop.setVal(STTabJc.RIGHT); twipsPerInch = 1440; tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch)); // first run in header's first paragraph, to be for first text box run = paragraph.createRun(); // create inline text box in run CTGroup ctGroup = CTGroup.Factory.newInstance(); CTShape ctShape = ctGroup.addNewShape(); ctShape.setStyle("width:80pt;height:24pt"); CTTxbxContent ctTxbxContent = ctShape.addNewTextbox().addNewTxbxContent(); XWPFParagraph textboxparagraph = new XWPFParagraph(ctTxbxContent.addNewP(), (IBody)header); XWPFRun textboxrun = textboxparagraph.createRun(); textboxrun.setText("The TextBox 1..."); textboxrun.setFontSize(10); Node ctGroupNode = ctGroup.getDomNode(); CTPicture ctPicture = CTPicture.Factory.parse(ctGroupNode); CTR cTR = run.getCTR(); cTR.addNewPict(); cTR.setPictArray(0, ctPicture); // add tab to run run.addTab(); // second run in header's first paragraph, to be for logo picture run = paragraph.createRun(); // add the picture in the headers run String imgFile="Logo.png"; XWPFPicture picture = run.addPicture(new FileInputStream(imgFile), XWPFdocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(195), Units.toEMU(22)); String blipID = ""; for(XWPFPictureData picturedata: header.getAllPackagePictures()) { blipID = header.getRelationId(picturedata); } picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID); // add tab to run run.addTab(); // third run in header's first paragraph, to be for second text box run = paragraph.createRun(); // create inline text box in run ctGroup = CTGroup.Factory.newInstance(); ctShape = ctGroup.addNewShape(); ctShape.setStyle("width:80pt;height:24pt"); ctTxbxContent = ctShape.addNewTextbox().addNewTxbxContent(); textboxparagraph = new XWPFParagraph(ctTxbxContent.addNewP(), (IBody)header); textboxrun = textboxparagraph.createRun(); textboxrun.setText("The TextBox 2..."); textboxrun.setFontSize(10); ctGroupNode = ctGroup.getDomNode(); ctPicture = CTPicture.Factory.parse(ctGroupNode); cTR = run.getCTR(); cTR.addNewPict(); cTR.setPictArray(0, ctPicture); // create header end // create footer start XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT); paragraph = footer.getParagraphArray(0); if (paragraph == null) paragraph = header.createParagraph(); paragraph.setAlignment(ParagraphAlignment.CENTER); run = paragraph.createRun(); run.setText("The Footer:"); doc.write(new FileOutputStream("test.docx")); }}


