Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApachePOIxWPF向标头添加形状_Java_Header_Apache Poi_Shape_Docx - Fatal编程技术网

Java ApachePOIxWPF向标头添加形状

Java ApachePOIxWPF向标头添加形状,java,header,apache-poi,shape,docx,Java,Header,Apache Poi,Shape,Docx,我正在尝试将一些形状和徽标文件添加到word docx文档的标题中。添加图片对我来说很有用,但我没有找到任何解决方法来添加形状。有人能帮我吗 String imgFile="logo.png"; XWPFDocument document = new XWPFDocument(new FileInputStream("myfile.docx")); CTSectPr sectPr = document.getDocument().getBody().addNewSectPr(); 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
确实处于测试状态,只有知道
Word
将如何将其内容存储到
XML
中,这样的事情才可能发生。然后可以解决
apachepoi
XWPF
的不足之处。您已经使用了这样一种解决方法,它可以在将图片添加到页眉或页脚中时更正遗漏的
blipd

探索
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"));

 }
}