how to add a picture to a .docx document with Apache POI XWPF in java

前端 未结 6 622
小蘑菇
小蘑菇 2020-11-30 08:32

I\'ve created a simple docx-Document, using Java POI 3.7. XWPF. Then, I added a picture by using the Method XWPFDocument.addpicture(byte[] arg0, int arg1).

6条回答
  •  执笔经年
    2020-11-30 08:33

    I know this post is very old but still I am posting the answer so that all those who are searching for this answer can use it. For inserting the picture in the word document you have to write two programs. The first one is :-

    package org.word.POI;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.xwpf.usermodel.Document;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    
    /*
    Romesh Soni
    soni.romesh@gmail.com
    */
    
    public class TestCustom
    {
    
        public static void main(String []a) throws FileNotFoundException, IOException, InvalidFormatException
        {
    
            CustomXWPFDocument document = new CustomXWPFDocument(new FileInputStream(new File("C:\\Users\\amitabh\\Documents\\Apache POI\\Word File\\new.doc")));
            FileOutputStream fos = new FileOutputStream(new File("C:\\Users\\amitabh\\Documents\\Apache POI\\Word File\\new.doc"));
    
            String blipId = document.addPictureData(new FileInputStream(new File("C:\\Users\\amitabh\\Pictures\\pics\\3.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), 500, 500);
    
    
            document.write(fos);
            fos.flush();
            fos.close();
    
        }
    
    }
    

    Now here I have used "CustomeXwPFDocument" in this code and you will not get any imports through any jar file so you have to add another .java class in your package. the code for "CustomXWPFDocument" class goes like this:-

    package org.word.POI;
    
    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");
        }
    }
    

    Use POI 3.9 jars for this program. The best URL is:- http://www.apache.org/dyn/closer.cgi/poi/release/bin/poi-bin-3.9-20121203.zip

    Now you are ready to fly. Best of luck.

提交回复
热议问题