gpt4 book ai didi

java - 使用 POI XWPF 将图像添加到 word .docx 文档标题中

转载 作者:行者123 更新时间:2023-12-01 07:36:16 24 4
gpt4 key购买 nike

我一直在尝试使用 Apache POI 将 .png 图像添加到 .docx 文件头。我没有找到对我有帮助的方法。有人知道怎么做吗?
有了这段代码,我只能添加文本。

XWPFDocument docc = new XWPFDocument(); 
CTP ctpHeader = CTP.Factory.newInstance();
CTR ctrHeader = ctpHeader.addNewR();
CTText ctHeader = ctrHeader.addNewT();
String headerText = "mi encabezado";
ctHeader.setStringValue(headerText);

XWPFParagraph headerParagraph = new XWPFParagraph(ctpHeader, docc); XWPFParagraph[] parsHeader = new XWPFParagraph[1];
parsHeader[0] = headerParagraph; header.createHeader(XWPFHeaderFooterPolicy.DEFAULT, parsHeader);

最佳答案

创建带有页眉和页脚以及页眉中的图像的 Word 文档的示例:

import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

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.CTSectPr;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc;

import java.math.BigInteger;

public class CreateWordHeaderFooter {

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
CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);

XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);

paragraph = header.getParagraphArray(0);
paragraph.setAlignment(ParagraphAlignment.LEFT);

CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
tabStop.setVal(STTabJc.RIGHT);
int twipsPerInch = 1440;
tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));

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

run = paragraph.createRun();
String imgFile="Koala.png";
run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(50), Units.toEMU(50));


// create footer start
XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);

paragraph = footer.getParagraphArray(0);
paragraph.setAlignment(ParagraphAlignment.CENTER);

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


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

}
}

编辑 2016 年 3 月 29 日:

这一直工作到 apache poi 3.13。现在有了 3.14,它就不再起作用了。原因:POI 将不再在标题段落中保存图像的 blip 引用。
/word/header1.xml :

使用 3.13 编译并运行的代码:
...
<pic:blipFill><a:blip r:embed="rId1"/>
...

使用 3.14 编译并运行相同的代码:
...
<pic:blipFill><a:blip r:embed=""/>
...

编辑 2016 年 3 月 31 日:

发现问题了。有人认为 public final PackageRelationship getPackageRelationship() 需要弃用。所以在 XWPFRun.javapublic XWPFPicture addPicture(...) 中的代码被改变了

从 3.13 版开始:
...
CTBlipFillProperties blipFill = pic.addNewBlipFill();
CTBlip blip = blipFill.addNewBlip();
blip.setEmbed(picData.getPackageRelationship().getId());
...

到 3.14 版:
...
CTBlipFillProperties blipFill = pic.addNewBlipFill();
CTBlip blip = blipFill.addNewBlip();
blip.setEmbed(parent.getDocument().getRelationId(picData));
...

但是 parent.getDocument() 始终是 XWPFDocument ,而 picData 可能与 XWPFHeaderFooter 相关。

public XWPFPicture addPicture(...) 的开头,程序员已经知道这一点。
...
if (parent.getPart() instanceof XWPFHeaderFooter) {
XWPFHeaderFooter headerFooter = (XWPFHeaderFooter)parent.getPart();
relationId = headerFooter.addPictureData(pictureData, pictureType);
picData = (XWPFPictureData) headerFooter.getRelationById(relationId);
} else {
XWPFDocument doc = parent.getDocument();
relationId = doc.addPictureData(pictureData, pictureType);
picData = (XWPFPictureData) doc.getRelationById(relationId);
}
...

因此,如果真的要强制执行折旧,则在设置 blipID 时也必须使用此 if..else。但为什么要贬值呢?

apache poi 3.14 版本哈哈
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

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.CTSectPr;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc;

import java.math.BigInteger;

public class CreateWordHeaderFooter {

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
CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);

XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);

paragraph = header.getParagraphArray(0);
paragraph.setAlignment(ParagraphAlignment.LEFT);

CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
tabStop.setVal(STTabJc.RIGHT);
int twipsPerInch = 1440;
tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));

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

run = paragraph.createRun();
String imgFile="Koala.png";
XWPFPicture picture = run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(50), Units.toEMU(50));
System.out.println(picture); //XWPFPicture is added
System.out.println(picture.getPictureData()); //but without access to XWPFPictureData (no blipID)

String blipID = "";
for(XWPFPictureData picturedata : header.getAllPackagePictures()) {
blipID = header.getRelationId(picturedata);
System.out.println(blipID); //the XWPFPictureData are already there
}
picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID); //now they have a blipID also
System.out.println(picture.getPictureData());

// create footer start
XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);

paragraph = footer.getParagraphArray(0);
paragraph.setAlignment(ParagraphAlignment.CENTER);

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


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

}
}

编辑 2017 年 3 月 28 日:

apache poi 3.16 Beta 2 版中,这似乎是固定的,因为以下代码使用 apache poi 3.16 Beta 2 版工作:
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.IOException;

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.CTSectPr;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc;

import java.math.BigInteger;

public class CreateWordHeaderFooter2 {

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
CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr);

XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);

paragraph = header.createParagraph();
paragraph.setAlignment(ParagraphAlignment.LEFT);

CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
tabStop.setVal(STTabJc.RIGHT);
int twipsPerInch = 1440;
tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));

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

run = paragraph.createRun();
String imgFile="Koala.png";
run.addPicture(new FileInputStream(imgFile), XWPFDocument.PICTURE_TYPE_PNG, imgFile, Units.toEMU(50), Units.toEMU(50));


// create footer start
XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);

paragraph = footer.createParagraph();
paragraph.setAlignment(ParagraphAlignment.CENTER);

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


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

}
}

关于java - 使用 POI XWPF 将图像添加到 word .docx 文档标题中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35097640/

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