Установите положение изображения и наклон в документ Word .docx с помощью POI XWPF - PullRequest
0 голосов
/ 20 июня 2020

Я добавил следующее изображение в текстовый документ, используя XWPF addPicture,

XWPFParagraph p3 = document.createParagraph();
XWPFRun r3 = p3.createRun();
imgFile = "C:\\poi-3.9\\pictures\\Picture4.jpeg";
try {
r3.addPicture(new FileInputStream(imgFile), format, imgFile, Units.toEMU(500), Units.toEMU(80)); // 200x200 pixels
}catch (Exception e){
  System.out.println (e.getMessage());
}

firstImage

Теперь я хочу установить его в определенное положение и также наклоните его, чтобы он выглядел так ...

enter image description here

Есть ли способ сделать это с помощью XWPF run или любого другого другой метод. Спасибо.

1 Ответ

0 голосов
/ 26 июня 2020

Решил сам. В основном текстовый документ - это своего рода zip-файл. Если мы переименуем расширение файла word в .zip и откроем файл document. xml, мы сможем увидеть, как на самом деле позиционируется изображение, используя формат xml. Вот шаги, которые я предпринял.

  1. Создайте текстовый документ с требуемым изображением и установите положение изображения вручную ()
  2. Переименуйте расширение файла как .zip из .docx , извлеките zip-файл.
  3. Перейдите и откройте документ. xml, который присутствует в папке word извлеченного zip-файла.
  4. Поиск имени изображения (здесь мое имя изображения - picture4 )
  5. Получите смещение по горизонтали и вертикали, экстент 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();
             }
             }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...