我想在docx中添加一个图像,但我刚刚找到了简单的apache poi代码:
XWPFDocument document = new XWPFDocument()
XWPFParagraph paragraph = document.createParagraph()
XWPFRun run = paragraph.createRun()
run.addPicture(new FileInputStream(img), format, img, Units.toEMU(width), Units.toEMU(height))
FileOutputStream outputStream = new FileOutputStream(doc)
document.write(outputStream)
现在我想在文本前面设置图片,但我找不到任何参考。
答案 0 :(得分:2)
Office Open XML
格式以及*.docx
本身都是ZIP
档案,其中包含XML
个文件和目录结构中的其他文件。因此,如果我们好奇,我们可以简单地解压缩它们并进行研究。
使用默认代码将图片添加到/word/document.xml
中运行的文字中,我们发现如下内容:
<w:r>
<w:t>Picture inline with text:</w:t>
<w:drawing>
<wp:inline distT="0" distR="0" distB="0" distL="0">
<wp:extent cx="1905000" cy="254000"/>
<wp:docPr id="0" name="Drawing 0" descr="samplePict.jpeg"/>
<a:graphic>
<a:graphicData ...
如果我们打开此usig Word
并将图片的文本换行更改为文本后面,那么在/word/document.xml
中我们会找到类似的内容:
<w:r>
<w:drawing>
<wp:anchor allowOverlap="1" behindDoc="1" layoutInCell="1" locked="0" relativeHeight="0" simplePos="0">
<wp:simplePos x="0" y="0"/>
<wp:positionH relativeFrom="column"><wp:posOffset>0</wp:posOffset></wp:positionH>
<wp:positionV relativeFrom="paragraph"><wp:posOffset>0</wp:posOffset></wp:positionV>
<wp:extent cx="1905000" cy="508000"/>
<wp:effectExtent b="0" l="0" r="0" t="0"/><wp:wrapNone/>
<wp:docPr descr="samplePict.jpeg" id="1" name="Drawing 0"/><wp:cNvGraphicFramePr/>
<a:graphic>
<a:graphicData ...
如您所见,第一个元素位于wp:inline
元素内,而第二个元素位于wp:anchor
元素内。
不幸的是,直到现在才使用wp:anchor
来应用apache poi
元素。所以我们需要知道在哪里找到低级对象,基于apache poi
。我发现http://grepcode.com是一个很好的参考。
现在我们可以根据这些低级别对象对所需内容进行编码:
import java.io.*;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.util.Units;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
public class CreateWordImagesBehindAndInFrontText {
private static CTAnchor getAnchorWithGraphic(CTDrawing drawing /*inline drawing*/ ,
String drawingDescr, boolean behind) throws Exception {
CTGraphicalObject graphicalobject = drawing.getInlineArray(0).getGraphic();
long width = drawing.getInlineArray(0).getExtent().getCx();
long height = drawing.getInlineArray(0).getExtent().getCy();
String anchorXML =
"<wp:anchor xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" "
+"simplePos=\"0\" relativeHeight=\"0\" behindDoc=\""+((behind)?1:0)+"\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">"
+"<wp:simplePos x=\"0\" y=\"0\"/>"
+"<wp:positionH relativeFrom=\"column\"><wp:posOffset>0</wp:posOffset></wp:positionH>"
+"<wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>0</wp:posOffset></wp:positionV>"
+"<wp:extent cx=\""+width+"\" cy=\""+height+"\"/>"
+"<wp:effectExtent l=\"0\" t=\"0\" r=\"0\" b=\"0\"/><wp:wrapNone/>"
+"<wp:docPr id=\"1\" name=\"Drawing 0\" descr=\""+drawingDescr+"\"/><wp:cNvGraphicFramePr/>"
+"</wp:anchor>";
drawing = CTDrawing.Factory.parse(anchorXML);
CTAnchor anchor = drawing.getAnchorArray(0);
anchor.setGraphic(graphicalobject);
return anchor;
}
public static void main(String[] args) throws Exception {
XWPFDocument doc= new XWPFDocument();
XWPFParagraph paragraph;
XWPFRun run;
InputStream in;
CTDrawing drawing;
CTAnchor anchor;
//default
paragraph = doc.createParagraph();
run = paragraph.createRun();
run.setText("Picture inline with text:");
in = new FileInputStream("samplePict.jpeg");
run.addPicture(in, Document.PICTURE_TYPE_JPEG, "samplePict.jpeg", Units.toEMU(150), Units.toEMU(40));
in.close();
paragraph = doc.createParagraph();
//behind text
paragraph = doc.createParagraph();
run = paragraph.createRun();
in = new FileInputStream("samplePict.jpeg");
run.addPicture(in, Document.PICTURE_TYPE_JPEG, "samplePict.jpeg", Units.toEMU(150), Units.toEMU(40));
in.close();
drawing = run.getCTR().getDrawingArray(0);
anchor = getAnchorWithGraphic(drawing, "samplePict.jpeg", true /*behind text*/);
drawing.setAnchorArray(new CTAnchor[]{anchor});
drawing.removeInline(0);
run = paragraph.createRun();
run.setText("The above picture is behind the text. ");
paragraph = doc.createParagraph();
//in front of text
paragraph = doc.createParagraph();
run = paragraph.createRun();
in = new FileInputStream("samplePict.jpeg");
run.addPicture(in, Document.PICTURE_TYPE_JPEG, "samplePict.jpeg", Units.toEMU(150), Units.toEMU(40));
in.close();
drawing = run.getCTR().getDrawingArray(0);
anchor = getAnchorWithGraphic(drawing, "samplePict.jpeg", false /*not behind text*/);
drawing.setAnchorArray(new CTAnchor[]{anchor});
drawing.removeInline(0);
run = paragraph.createRun();
run.setText("The above picture is in front of the text. ");
paragraph = doc.createParagraph();
doc.write(new FileOutputStream("CreateWordImagesBehindAndInFrontText.docx"));
doc.close();
}
}