这是我第一次在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”.我已经添加了这个程序的所有可能的罐子.对于这个错误,我搜索了整个网络,发现很多人都有类似的问题. 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-模式

xmlbeans

dom4j

java – 在word文档中插入图片的更多相关文章

  1. ios – iPad中的UIPrintInteractionController给了我两个警告

    我正在使用代码在我的应用程序中获取Airprint以将当前视图打印为图像.弹出Airprint对话框,但在日志屏幕中它显示两个警告:1)警告:在iPad上调用–[UIPrintInteractionControllerpresentAnimated:completionHandler:]找不到PDF标题:找不到`%PDF’.2)[UIPopoverController_commonPresentP

  2. ios5 – 什么是docx文件的统一类型标识符

    阅读DeveloperLibrary的文档,doc的标识符为“com.microsoft.word.doc”.但是什么是docx的标识符?解决方法标识符是org.openxmlformats.wordprocessingml.document.

  3. ios – OS X:将.dylib转换为.a / .o(动态到静态)?

    假设我已经阅读了thiscaveat,我仍然希望将TBB用作静态链接库.但我真的不想重写TBBmakefile来生成libtbb.a而不是libtbb.dylib.是否有一个简单的命令行方式将libtbb.dylib转换为libtbb.o并使用相同的入口点?

  4. swift之图片浏览器

    3Q7、swift中,NSArray的元素是倒序的。

  5. Swift 3 打印功能

    1.加载到webview再打印2.直接打印nsdata

  6. 如果点击上一个项目,Android PagerAdapter不会报告正确的位置

    我有一个ViewPager设置为负值边距,以获得如下效果:现在,我想要发生的是当我点击当前视图左侧或右侧的视图.它应该选择该视图,并在ViewPager上调用setCurrentItem().这可以在当前项目右侧的视图中正常工作,但不能查看当前项目的左侧.当我点击该视图时,向我报告的位置是当前视图的位置.这有一些代码,如果它有帮助.这是从PagerAdapter.instantiateItem()

  7. android – 照片捕获意图仅在Samsung手机上导致NullPointerException

    照片捕获意图仅在Samsung手机上导致NullPointerException.下面的实现.解决方法我发现一个修复(不是我的工作),使其适用于三星设备.有解释的博客可以找到here.但是,在非三星手机上使用此修复会返回错误的图像,因此我将使用

  8. Kotlin内存陷阱inline使用技巧示例详解

    这篇文章主要为大家介绍了Kotlin内存陷阱inline使用技巧示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. Python利用docx模块实现快速操作word文件

    这篇文章主要为大家详细介绍了Python如何利用docx模块实现快速操作word文件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

  10. Vue实现docx、pdf格式文件在线预览功能

    在业务中,如果遇到文档管理类的功能,会出现需要在线预览的业务需求,本文主要是通过第三方库来实现文档预览功能,并将其封装成preview组件,感兴趣的可以了解一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部