Как заблокировать пропорции изображения в документе с Apache POI? - PullRequest
0 голосов
/ 15 апреля 2019

Есть ли способ включить опцию «блокировать пропорции» для изображения в docx, используя Apache POI?Я добавляю изображение в прогон и хочу заблокировать его размер.Поиск в документации, но ничего не найдено.

Для большей ясности я имею в виду доступную опцию внутри слова, как показано на рисунке: https://support.content.office.net/en-us/media/a30a8baa-6775-4931-bca6-199fda6afc6e.png

Спасибо

1 Ответ

1 голос
/ 15 апреля 2019

Ответ зависит от того, как изображение применяется к документу Word.Если это было сделано с помощью XWPFRun.addPicture , это будет встроенное изображение в текстовом прогоне.Затем прогон содержит слой чертежа, который содержит встроенный элемент, содержащий изображение.Этот встроенный элемент затем может содержать невизуальные свойства графического фрейма, которые могут иметь блокировки графического фрейма, которые не устанавливают истинный аспект изменения.

XML в /word/document.xml выглядит следующим образом:

<w:r>
 <w:drawing>
  <wp:inline ...>
   <wp:cNvGraphicFramePr><a:graphicFrameLocks noChangeAspect="true"/></wp:cNvGraphicFramePr>
    <a:graphic>
   ...

Тогда для XWPFRun run, содержащего картинку, можно установить

run.getCTR().getDrawingArray(0).getInlineArray(0).addNewCNvGraphicFramePr().addNewGraphicFrameLocks().setNoChangeAspect(true);

Полный пример:

import java.io.*;

import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.util.Units;

import java.util.List;
import java.util.ArrayList;

import java.net.URL;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.Dimension;

public class CreateWordPicturesInTextRuns {

 public static void main(String[] args) throws Exception {

  List<String> pictureURLs = new ArrayList<String>();
  pictureURLs.add("https://www.eastcottvets.co.uk/uploads/Animals/gingerkitten.jpg");
  pictureURLs.add("https://www.catster.com/wp-content/uploads/2017/12/A-kitten-meowing.jpg");
  pictureURLs.add("https://www.animalfriends.co.uk/app/uploads/2014/08/06110347/Kitten-small.jpg");
  pictureURLs.add("https://d27ucmmhxk51xv.cloudfront.net/media/english/illustration/kitten.jpg");

  XWPFDocument document= new XWPFDocument();
  XWPFParagraph paragraph = document.createParagraph();
  XWPFRun run = paragraph.createRun();
  run.setText("The kitten pictures: ");

  URL url;
  BufferedImage image;
  Dimension dim;
  ByteArrayOutputStream bout;
  ByteArrayInputStream bin;
  for (String pictureURL : pictureURLs) {

   url = new URL(pictureURL);
   image = ImageIO.read(url);
   dim = new Dimension(image.getWidth(), image.getHeight());
   double width = dim.getWidth();
   double height = dim.getHeight();
   double scaling = 1.0;
   if (width > 72*3) scaling = (72*3)/width; //scale width not to be greater than 3 inches

   bout = new ByteArrayOutputStream();
   ImageIO.write(image, "jpeg", bout);
   bout.flush();
   bin = new ByteArrayInputStream(bout.toByteArray());
   run = paragraph.createRun();
   run.addPicture(bin, XWPFDocument.PICTURE_TYPE_JPEG, "kitten", 
    Units.toEMU(width*scaling), Units.toEMU(height*scaling));

   //lock aspect ratio
   run.getCTR().getDrawingArray(0).getInlineArray(0).addNewCNvGraphicFramePr().addNewGraphicFrameLocks().setNoChangeAspect(true);

  }

  FileOutputStream out = new FileOutputStream("CreateWordPicturesInTextRuns.docx");
  document.write(out);
  out.close();
  document.close();

 }
}
...