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文档中添加形状(在这种情况下为文本框)。对于这种使用低级别底层对象(在这种情况下CTGroupCTShape)是必要的。

示例:(代码应自我解释)

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

回到顶部