Как добавить изображение с рамкой в ​​ячейку таблицы в Word с Apache POI? - PullRequest
0 голосов
/ 02 декабря 2019

Я пытаюсь вставить изображение с рамкой в ​​таблицу в Microsoft Word с помощью Apache POI. Я могу добавить изображение в ячейку с кодом ниже:

// table is a XWPFTable object instantiated earlier in the code
XWPFParagraph paragraph = table.getRow(0).getCell(0).addParagraph();
XWPFRun run = paragraph.createRun();
FileInputStream fis = new FileInputStream("C:\\ [filepath for the image]");
run.addPicture(fis, XWPFDocument.PICTURE_TYPE_PNG, "Name", 6217920, 3474720);

Я пытался найти способы добавить границу к изображению, но я не смог найти никаких ресурсов в Интернете. Я наткнулся на эту ссылку: Форматировать изображение с помощью заливки и линии, используя apache poi в Java , но это не помогает в этом случае.

(Если быть точным, я хочу добавить сплошной черный цветлиния вокруг изображения толщиной 2 1/4 пт)

Кто-нибудь знает, как этого добиться? Заранее спасибо.

1 Ответ

1 голос
/ 02 декабря 2019

Как всегда, если текущие классы высокого уровня apache poi не предоставляют некоторые Office Open XML функции, выполните следующие действия:

Сначала выполните то, что предусмотрено, и посмотрите на базовые XML, которые вы создали,В этом случае выполните:

// table is a XWPFTable object instantiated earlier in the code
XWPFParagraph paragraph = table.getRow(0).getCell(0).addParagraph();
XWPFRun run = paragraph.createRun();
FileInputStream fis = new FileInputStream("C:\\ [filepath for the image]");
XWPFPicture picture = run.addPicture(fis, XWPFDocument.PICTURE_TYPE_PNG, "Name", Units.pixelToEMU(300), Units.pixelToEMU(150));
System.out.println(picture.getCTPicture());

Вы получите что-то вроде:

<xml-fragment xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:rel="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
  <pic:nvPicPr>
    <pic:cNvPr id="0" name="Picture 0" descr="Name"/>
    <pic:cNvPicPr>
      <a:picLocks noChangeAspect="true"/>
    </pic:cNvPicPr>
  </pic:nvPicPr>
  <pic:blipFill>
    <a:blip rel:embed="rId2"/>
    <a:stretch>
      <a:fillRect/>
    </a:stretch>
  </pic:blipFill>
  <pic:spPr>
    <a:xfrm>
      <a:off x="0" y="0"/>
      <a:ext cx="2857500" cy="1428750"/>
    </a:xfrm>
    <a:prstGeom prst="rect">
      <a:avLst/>
    </a:prstGeom>
  </pic:spPr>
</xml-fragment>

Теперь откройте результат в Word и добавьте, что вы хотите. В этом случае добавьте рамку вокруг картинки. Затем сохраните результат, распакуйте архив *.docx Zip и посмотрите на /word/document.xml, чтобы узнать, что изменилось.

Вы найдете что-то вроде:

<a:ln w="28575">
  <a:solidFill>
    <a:srgbClr val="000000"/>
  </a:solidFill>
</a:ln>

добавленона <pic:spPr>.

Теперь попробуйте создать это, используя ooxml-schema классы низкого уровня apache poi:

...
XWPFPicture picture = run.addPicture(fis, XWPFDocument.PICTURE_TYPE_PNG, "Name", Units.pixelToEMU(300), Units.pixelToEMU(150));
System.out.println(picture.getCTPicture());

picture.getCTPicture().getSpPr().addNewLn().setW(Units.toEMU(2.25));
picture.getCTPicture().getSpPr().getLn().addNewSolidFill().addNewSrgbClr().setVal(new byte[]{0,0,0});
System.out.println(picture.getCTPicture());
...
...