2015-04-28 2 views
0

Здравствуйте, я хочу вставить изображение в документ Word. Ниже код вставляет изображение в оригинал размере:Apache POI изображение масштабное изображение

private def writePhotosToDoc(model: WordReportModel, doc: XWPFDocument): Unit = { 
    val paragraphIndex = detectVariable(Variables.PHOTO_APPLICATION, doc) 

    if (!paragraphIndex.exists(_ == ("idx", -1))) { 
     val taskParagraph = doc.getParagraphs.asScala(
      paragraphIndex("idx") 
     ) 
     taskParagraph.removeRun(
      paragraphIndex("irx") 
     ) 
     model.attachments.foreach{ 
      case(key, value) => 
       val p = doc.createParagraph() 
       p.getCTP.setPPr(taskParagraph.getCTP.getPPr) 
       p.setAlignment(ParagraphAlignment.CENTER) 
       val r = p.createRun() 
       r.addBreak() 

       val bi = ImageIO.read(value.head) 
       val width = bi.getWidth 
       val height = bi.getHeight 

       r.addPicture(
        new FileInputStream(value.head), 
        Document.PICTURE_TYPE_PNG, 
        value.head.getName, 
        Units.toEMU(width), 
        Units.toEMU(height) 
       ) 
     } 
    } 
} 

Как вставить изображение и установить масштаб.

+0

Что произойдет, если вы измените ширину и высоту, которую вы переходите на addPicture? –

ответ

2

Я видел this нить и пробовал вставлять разные размеры и, кажется, работает нормально.

Здесь начинается выполнение. Обратите внимание, что вы должны сначала создать обычный файл DOCX, а затем редактировать и добавлять изображения (в противном случае файл не создается правильно):

XWPFDocument doc = new XWPFDocument(); 
doc.write(new FileOutputStream(new File("test.docx"))); 

CustomXWPFDocument document = new CustomXWPFDocument(new FileInputStream(new File("test.docx"))); 
FileOutputStream fos = new FileOutputStream(new File("test.docx")); 

String blipId = document.addPictureData(new FileInputStream(new File("res/Tulips.jpg")), Document.PICTURE_TYPE_JPEG); 


System.out.println(document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG)); 

//System.out.println(document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG)); 
document.createPicture(blipId,document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG), 100, 150); 


document.write(fos); 
fos.flush(); 
fos.close(); 

И это CustomXWPFDocument класс (взято из question):

public class CustomXWPFDocument extends XWPFDocument 
{ 
    public CustomXWPFDocument(InputStream in) throws IOException 
    { 
     super(in); 
    } 

    public void createPicture(String blipId,int id, int width, int height) 
    { 
     final int EMU = 9525; 
     width *= EMU; 
     height *= EMU; 
     //String blipId = getAllPictures().get(id).getPackageRelationship().getId(); 


     CTInline inline = createParagraph().createRun().getCTR().addNewDrawing().addNewInline(); 

     String picXml = "" + 
       "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" + 
       " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + 
       "  <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" + 
       "   <pic:nvPicPr>" + 
       "   <pic:cNvPr id=\"" + id + "\" name=\"Generated\"/>" + 
       "   <pic:cNvPicPr/>" + 
       "   </pic:nvPicPr>" + 
       "   <pic:blipFill>" + 
       "   <a:blip r:embed=\"" + blipId + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" + 
       "   <a:stretch>" + 
       "    <a:fillRect/>" + 
       "   </a:stretch>" + 
       "   </pic:blipFill>" + 
       "   <pic:spPr>" + 
       "   <a:xfrm>" + 
       "    <a:off x=\"0\" y=\"0\"/>" + 
       "    <a:ext cx=\"" + width + "\" cy=\"" + height + "\"/>" + 
       "   </a:xfrm>" + 
       "   <a:prstGeom prst=\"rect\">" + 
       "    <a:avLst/>" + 
       "   </a:prstGeom>" + 
       "   </pic:spPr>" + 
       "  </pic:pic>" + 
       " </a:graphicData>" + 
       "</a:graphic>"; 

     //CTGraphicalObjectData graphicData = inline.addNewGraphic().addNewGraphicData(); 
     XmlToken xmlToken = null; 
     try 
     { 
      xmlToken = XmlToken.Factory.parse(picXml); 
     } 
     catch(XmlException xe) 
     { 
      xe.printStackTrace(); 
     } 
     inline.set(xmlToken); 
     //graphicData.set(xmlToken); 

     inline.setDistT(0); 
     inline.setDistB(0); 
     inline.setDistL(0); 
     inline.setDistR(0); 

     CTPositiveSize2D extent = inline.addNewExtent(); 
     extent.setCx(width); 
     extent.setCy(height); 

     CTNonVisualDrawingProps docPr = inline.addNewDocPr(); 
     docPr.setId(id); 
     docPr.setName("Picture " + id); 
     docPr.setDescr("Generated"); 
    } 
} 
+0

Вы видите исходный код Apache POI? Вы вставляете вариант для варианта Excel «run.addpicture()» возвращаете XWPFPicture. –

+0

«Обратите внимание, что этот метод работает правильно только для книг с размером шрифта по умолчанию (Arial 10pt для .xls и Calibri 11pt для .xlsx)». OP хочет вставить изображения в документ Word. Это тоже работает со Словом? –

+0

Хорошо. Я видел еще одну тему, рассматривающую это, и с помощью фрагмента 1 размер кажется правильным. – LittlePanda

Смежные вопросы