Apache POI XWPF向标头添加形状
我试图在我的Word docx文档的标题中添加一些形状和徽标文件。添加图片对我有用,但是我找不到如何添加形状的任何解决方案。谁能帮我?
String imgFile="logo.png";XWPFDocument document = new XWPFDocument(new FileInputStream("myfile.docx"));
CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(document, sectPr);               
XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
XWPFParagraph paragraph = header.getParagraphArray(0);
paragraph.setAlignment(ParagraphAlignment.CENTER);
XWPFRun run = paragraph.createRun();
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); //now they have a blipID too
最后,标题应如下所示
谢谢
回答:
由于apache poi
XWPF到目前为止,确实处于beta状态,因此只有在确切知道Word将其内容存储到中的情况下,此类事情才有可能XML。这样就可以解决的不足apache
poiXWPF。您已经使用了一种变通方法,blipID当将图片添加到页眉或页脚中运行时,它可以纠正错过的情况。
发现如何Word将其内容存储到XML容器中不是火箭科学。一个*.docx文件就是一个ZIP文件。如果使用Zip软件将该文件解压缩,则只需查看一下XML文件即可。
据我所知,不apache
poi直接支持在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"));
 }
}
以上是 Apache POI XWPF向标头添加形状 的全部内容, 来源链接: utcz.com/qa/421267.html








