gpt4 book ai didi

java - Apache POI XWPF 添加形状到标题

转载 作者:太空宇宙 更新时间:2023-11-04 09:58:24 26 4
gpt4 key购买 nike

我正在尝试将一些形状和 Logo 文件添加到我的 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

最后, header 应类似于 this

谢谢

最佳答案

由于 apache poi XWPF 到目前为止确实处于测试状态,因此只有确切知道 Word 如何将其内容存储到 XML 中,这样的事情才有可能实现。然后就可以解决 apache poi XWPF 的不足之处。您已经使用过这样的解决方法,可以在将图片添加到页眉或页脚中时纠正丢失的 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 = footer.createParagraph();
paragraph.setAlignment(ParagraphAlignment.CENTER);

run = paragraph.createRun();
run.setText("The Footer:");


doc.write(new FileOutputStream("test.docx"));

}
}

关于java - Apache POI XWPF 添加形状到标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53814704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com