Решил сам. В основном текстовый документ - это своего рода zip-файл. Если мы переименуем расширение файла word в .zip и откроем файл document. xml, мы сможем увидеть, как на самом деле позиционируется изображение, используя формат xml. Вот шаги, которые я предпринял.
- Создайте текстовый документ с требуемым изображением и установите положение изображения вручную ()
- Переименуйте расширение файла как .zip из .docx , извлеките zip-файл.
- Перейдите и откройте документ. xml, который присутствует в папке word извлеченного zip-файла.
- Поиск имени изображения (здесь мое имя изображения - picture4 )
- Получите смещение по горизонтали и вертикали, экстент cx и cy, относительную высоту и положение других параметров из xml, я выделил их жирным шрифтом в фрагменте xml ниже.
<w:body>
<w:p>
<w:bookmarkStart w:id="0" w:name="_GoBack"/>
<w:bookmarkEnd w:id="0"/>
<w:r>
<w:drawing>
<wp:anchor distT="0" distB="0" distL="**114300**" distR="**114300**" simplePos="0" relativeHeight="**251658240**" behindDoc="1" locked="0" layoutInCell="1" allowOverlap="1">
<wp:simplePos x="0" y="0"/>
<wp:positionH relativeFrom="column">
<wp:posOffset>**-2256790**</wp:posOffset>
</wp:positionH>
<wp:positionV relativeFrom="paragraph">
<wp:posOffset>**-1823085**</wp:posOffset>
</wp:positionV>
<wp:extent cx=**"3448050"** cy=**"3619500"**/>
<wp:effectExtent l="0" t="0" r="0" b="0"/>
<wp:wrapNone/>
<wp:docPr id="4" name="Drawing 0" descr="**Picture4**"/>
<wp:cNvGraphicFramePr>
Установите то же самое в привязке xml
String anchorXML = "<wp:anchor xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " +"distT=\"0\" distB=\"0\" distL=\"114300\" distR=\"114300\" simplePos=\"0\" relativeHeight=\"251658240\" behindDoc=\"1\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">"
+"<wp:simplePos x=\"0\" y=\"0\"/>"
+"<wp:positionH relativeFrom=\"column\"><wp:posOffset>-1800000</wp:posOffset></wp:positionH>"
+"<wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>-1800000</wp:posOffset></wp:positionV>"
+ "<wp:extent cx=\"3448050\" cy=\"3619500\"/>"
+"<wp:effectExtent l=\"0\" t=\"0\" r=\"6350\" b=\"6350\"/>"
+" <wp:simplePos x=\"0\" y=\"0\"/><wp:positionH relativeFrom=\"column\"><wp:posOffset>-1800000</wp:posOffset></wp:positionH><wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>-1800000</wp:posOffset></wp:positionV><wp:extent cx=\"3448050\" cy=\"3619500\"/><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>";
Вот пример кода для добавления изображения и положения, мы можем параметризация метода установки смещения и других параметров xml.
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline; public class addImage extends XWPFDocument { public static void main(String[] args) throws IOException {
// Create a document file
CustomXWPFDocument document = new CustomXWPFDocument();
XWPFParagraph paragraphFourteenx = document.createParagraph();
XWPFRun paragraphFourteenRunx = paragraphFourteenx.createRun();
// add picture four
//String imgFile = "C:\\pictures\\Picture4.jpeg";
XWPFParagraph p3 = document.createParagraph();
XWPFRun r3 = p3.createRun();
imgFile = "C:\\Picture4.jpeg";
try {
r3.addPicture(new FileInputStream(imgFile), format, imgFile, Units.toEMU(250), Units.toEMU(250)); // 200x200 pixels
}catch (Exception e){
System.out.println (e.getMessage());
}
try{
CTDrawing drawing = r3.getCTR().getDrawingArray(0);
CTGraphicalObject graphicalobject = drawing.getInlineArray(0).getGraphic();
CTAnchor anchor = getAnchorWithGraphic(graphicalobject, "Picture4",
Units.toEMU(250), Units.toEMU(250),
Units.toEMU(0), Units.toEMU(0),true);
drawing.setAnchorArray(new CTAnchor[]{anchor});
drawing.removeInline(0);
}catch (Exception e){
System.out.println (e.getMessage());
}
String anchorXML =
"<wp:anchor xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" "
+"distT=\"0\" distB=\"0\" distL=\"114300\" distR=\"114300\" simplePos=\"0\" relativeHeight=\"251658240\" behindDoc=\"1\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">"
+"<wp:simplePos x=\"0\" y=\"0\"/>"
+"<wp:positionH relativeFrom=\"column\"><wp:posOffset>-1800000</wp:posOffset></wp:positionH>"
+"<wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>-1800000</wp:posOffset></wp:positionV>"
+ "<wp:extent cx=\"3448050\" cy=\"3619500\"/>"
+"<wp:effectExtent l=\"0\" t=\"0\" r=\"6350\" b=\"6350\"/>"
+" <wp:simplePos x=\"0\" y=\"0\"/><wp:positionH relativeFrom=\"column\"><wp:posOffset>-1800000</wp:posOffset></wp:positionH><wp:positionV relativeFrom=\"paragraph\"><wp:posOffset>-1800000</wp:posOffset></wp:positionV><wp:extent cx=\"3448050\" cy=\"3619500\"/><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>";
CTDrawing drawing = CTDrawing.Factory.parse(anchorXML);
CTAnchor anchor = drawing.getAnchorArray(0);
anchor.setGraphic(graphicalobject);
// stream output to file
FileOutputStream outStream = null;
try {
double x = Math.random();
String fileName = "C:\\poi-3.9\\generateprequal\\output\\" + args[0] + ".docx";
outStream = new FileOutputStream(fileName);
} catch (FileNotFoundException e) {
System.out.println("First Catch");
e.printStackTrace();
}
try {
document.write(outStream);
outStream.close();
} catch (FileNotFoundException e) {
System.out.println("Second Catch");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Third Catch");
e.printStackTrace();
}
}}