在Word文档中插入图片

这是我第一次使用Apache POI,并且已经在该站点上提出了我要问的问题,但是没有给他们明确的答案,所以我别无选择,只能接受您的所有帮助。

我正在尝试编写一个Java程序,该程序从一个文件夹中获取图像并将该图像插入到Word文档中。我正在为此程序使用Apache POI。我在这里发布我的代码。

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”。我已经为此程序添加了所有可能的jar。对于这个错误,我在网上进行了搜索,发现许多人都遇到类似的问题。XWPFDocument参考的“

addPicture”不起作用。请帮助我解决此问题。

回答:

首先,我想指出apache poi-

Link提供的示例,即正确的方法是

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

但是,仍然存在一个现有错误,在执行上述语句后,该.docx文件将变得不可读。可能很快会解决,在这种情况下,上述声明将起作用。同时,有一种解决方法。

首先,生成没有任何图片的docx文件。然后将此类添加CustomXWPFDocument到您的包中。

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

}

}

然后,通过添加图片来创建更新的文档,如下所示:-

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

您还应该在构建路径中包含以下jar:

poi-ooxml-schemas

xmlbeans

dom4j

以上是 在Word文档中插入图片 的全部内容, 来源链接: utcz.com/qa/410113.html

回到顶部