插入Word文档中的图片 [英] Insert picture in word document

查看:248
本文介绍了插入Word文档中的图片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我第一次在Apache POI工作,这是我要问的问题已经被问这个网站,但没有明确的答案被给予了他们,所以我没有选择,只能采取一切你的帮助。

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 have no choice but to take all your help.

我想写一个java程序,它从一个文件夹需要的图像和插入图像插入到Word文档。我使用Apache POI对这一计划。在这里,我张贴我的code。

I am trying to write a java program which takes images from one folder and insert that image into a word document. I am using Apache POI for this program. Here I am posting my code.

import java.io.*;
import java.util.*;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xwpf.usermodel.*;

public class ImagesDoc 
{
    public static void main(String[] args) throws IOException 
    {
        XWPFDocument docx = new XWPFDocument();
        XWPFParagraph par = docx.createParagraph();
        XWPFRun run = par.createRun();
        run.setText("Hello, World. This is my first java generated docx-file. Have fun.");
        run.setFontSize(13);
        InputStream pic = new FileInputStream("C:\\Users\\amitabh\\Pictures\\pics\\pool.jpg");
        byte [] picbytes = IOUtils.toByteArray(pic);
        docx.addPicture(picbytes, Document.PICTURE_TYPE_JPEG);

        FileOutputStream out = new FileOutputStream("C:\\Users\\amitabh\\Pictures\\pics\\simple1.docx"); 
        docx.write(out); 
        out.close(); 
        pic.close();
    }
}

我能够创建Word文档文件,我可以插入文本,以及,但 docx.addPicture(picbytes,Document.PICTURE_TYPE_JPEG); 行是给我的错误是加转换为DOCX。我添加了所有可能的罐子对这一计划。对于这个错误我已经找遍了网,发现很多人有类似的问题。 给AddPicture为XWPFDocument参考不工作。请帮我解决这个问题。

I am able to create the word document file and I am able to insert the text as well but docx.addPicture(picbytes, Document.PICTURE_TYPE_JPEG); line is giving me the error as"add cast to docx". I have added all possible jars for this program. For this error I have searched all over the net and found that many people are having similar problem. "addPicture" for XWPFDocument reference is not working. Please help me to resolve this problem.

推荐答案

首先,我想指出,由阿帕奇的POI提供的例子 - <一个href=\"http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xwpf/usermodel/SimpleImages.java\">Link,即正确的方式做这将是

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));

不过,仍然有一个现有的bug这使得.docx文件执行上面的语句后不可读。它可能很快得到解决,在这种情况下,上述声明将要做的工作。对于其间,有一个解决方法。

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.

首先,产生无任何图像的DOCX文件。那么这个类 CustomXWPFDocument 添加到您的包。

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 = "" +
                "<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");
    }
}

然后,加入你的图片是这样创造更新的文档: -

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-模式

poi-ooxml-schemas

XMLBeans的

dom4j的

这篇关于插入Word文档中的图片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆