Insert picture in word document

后端 未结 2 1872
有刺的猬
有刺的猬 2020-11-30 10:46

This is the first time I am working on Apache POI and the question which I am going to ask has been asked already on this site but no clear answer were given for them so I h

2条回答
  •  臣服心动
    2020-11-30 11:13

    First, I would like to point out the example provided by apache poi - Link, i.e. the correct way to do it would be

    doc.createParagraph().createRun().addPicture(new FileInputStream(imgFile), format, imgFile, Units.toEMU(200), Units.toEMU(200));
    

    However, there is still an existing bug which renders the .docx file unreadable after executing the above statement. It might be resolved soon, in which case the above-mentioned statement will do the work. For the meantime, there is a work-around.

    First, generate the docx file without any pictures. Then add this class CustomXWPFDocument to your package.

    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.xmlbeans.XmlException;
    import org.apache.xmlbeans.XmlToken;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
    import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
    
    import java.io.IOException;
    import java.io.InputStream;
    
    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 = "" +
                    "" +
                    "   " +
                    "      " +
                    "         " +
                    "            " +
                    "            " +
                    "         " +
                    "         " +
                    "            " +
                    "            " +
                    "               " +
                    "            " +
                    "         " +
                    "         " +
                    "            " +
                    "               " +
                    "               " +
                    "            " +
                    "            " +
                    "               " +
                    "            " +
                    "         " +
                    "      " +
                    "   " +
                    "";
    
            //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");
        }
    }
    

    Then, create the updated document by adding your pictures like this :-

    CustomXWPFDocument document = new CustomXWPFDocument(new FileInputStream(new File("C:\\Users\\Avarice\\Desktop\\doc1.docx")));
            FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\Avarice\\Desktop\\doc2.docx"));
            String id = document.addPictureData(new FileInputStream(new File("C:\\Users\\Avarice\\Desktop\\thumbnail.jpg")), Document.PICTURE_TYPE_JPEG);
            document.createPicture(id,document.getNextPicNameNumber(Document.PICTURE_TYPE_JPEG), 64, 64);
            document.write(fos);
            fos.flush();
            fos.close();
    

    You should also have the following jars in your build path:-

    poi-ooxml-schemas

    xmlbeans

    dom4j

提交回复
热议问题