关闭

java操作word/excel/pdf等文件技术方案

标签: java文档操作
882人阅读 评论(0) 收藏 举报
分类:

最近项目中遇到很多对word/excel/pdf等文件的操作,解决方案有好多,开源免费有:利用openoffice组件(需要安装openoffice软件),poi,itext等。也有收费的服务:aspose(特别好用,也有点贵)。
我项目中需求可以概括为导出word(包括文字,表格,图片),把pdf插入到word,word之间的合并。

这里按需求介绍一下我走通的技术方案:
导出word 可以使用poi,aspose。(其实poi操作word还是有些不方便的,用itext好一些,当然aspose都可以干,只不过要花钱!!)
关于这方面的资料挺少的,api都挺好使用的,只不过一开始面对忙忙多的类,会有无从下手的感觉,特再此说明一些关键操作类。

无论采用哪种类库,他们大致步奏是一样的。一般都是新建一个段落,获取画笔。(由于本文主要提供技术方案及操作步奏,具体代码就不提供了,读者可以根据作者思路及官方api进行操作)
poi操作word:poi操作word把doc/docx是分开的,创建word对象后,便可create paragraph(段落)了,在从paragraph.createRun(),获取画笔XWPFRun(我称为画笔),便可run设置文字字体,大小,通过setText()方法,变可以写入文字。
生成表格,paragraph.createTable(),可以在create时声称table的大小,也可以动态添加行和列。
插入图片:poi插入图片有点问题,下面重写了XWPFDocuemnt的插入图片方法,读者可以使用自己类代替自带的XWPFDocument进行docx的操作

public class CustomXWPFDocument extends XWPFDocument {    
    public CustomXWPFDocument(InputStream in) throws IOException {    
        super(in);    
    }    

    /**  
     *   
     */    
    public CustomXWPFDocument() {    
        super();    
        // TODO Auto-generated constructor stub     
    }    

    /**  
     * @param pkg  
     * @throws IOException  
     */    
    public CustomXWPFDocument(OPCPackage pkg) throws IOException {    
        super(pkg);    
        // TODO Auto-generated constructor stub     
    }  // picAttch 图片后面追加的字符串 可以是空格  
    public void createPicture(XWPFParagraph paragraph,int id, int width, int height,String picAttch) {    
        final int EMU = 9525;    
        width *= EMU;    
        height *= EMU;    
        String blipId = getAllPictures().get(id).getPackageRelationship()    
                .getId();    

        CTInline inline = paragraph.createRun().getCTR()    
                .addNewDrawing().addNewInline();    
        paragraph.createRun().setText(picAttch);  
        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("图片" + id);    
        docPr.setDescr("");    
    }    
}   

使用createPicture方法便可以插入图片了。
存储word:XWPFDocument有write方法,我们可以提供了FileOutputStream,便可直接保存了。

aspose操作word:aspose真心好用,毕竟收费还这么贵,首先通过Document实例化一个word对象(doc/docx)都可以,然后获取DocumentBuilder(我称之为画笔),接下来所有的操作,包括画表格都有它来完成,跟poi的使用还有点不一样的,写入文字,表格,图片都是基于builder完成的,write是写入文字的做法。
这里跟poi有一个很大的不同,假设我们需要有个文字加黑操作,poi在加黑和不加黑就需要两个run来处理,而aspose只需要用同一个builder来处理就好,builder.setBlod(),完全不影响该builder画出的全部数据。

下面在来讲讲pdf插入word,合并word的操作。
很遗憾,poi/aspose.word是不支持直接插入pdf的,我这里采用了pdfbox库先将pdf转为图片,然后将图片插入到word中。
word合并:aspose是直接支持合并word的,Document.append()方法直接合并。

0
0
查看评论

java读写word文档,完美解决方案

   本人最近做的一个项目,需要把数据里里的数据读出来,经过加工,以word格式输出。 这几天一直都在找,没有找到好的解决方案!偶尔发现了java2word,咱们国人开发的一个包,今天使用一下,非常简单!比网上介绍的poi,jacob等解决方按容易上手多了!最然功能不是...
  • smartcat86
  • smartcat86
  • 2007-10-27 12:10
  • 57672

利用Java读取并写入Word文件

java 读取Word,写入Word
  • xiyushiyi
  • xiyushiyi
  • 2014-11-26 17:54
  • 48974

java操作word

docx4j
  • SuperVictim
  • SuperVictim
  • 2016-11-05 20:04
  • 2534

(转载)java操作word文档(jacob)

转载自http://wibiline.iteye.com/blog/1725492 项目需要,用户从系统里面下载word文档,该文档进行了填写限制和加密,用户只能在固定位置填写内容。现要求系统验证上传的附件是否从系统上下载下来的。 思路:系统上面的文档都加入一个固定书签,用户...
  • jayson1001
  • jayson1001
  • 2017-03-15 15:01
  • 422

Java Web项目中使用Freemarker生成Word文档

Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob、Apache POI、Java2Word、iText等各种方式,其实在从Office 2003开始,就可以将Office文档转换成XML文件,这样只要将需要填入的内容放上${}占位符,就可以使用像Fre...
  • jackfrued
  • jackfrued
  • 2014-09-21 15:33
  • 64598

JAVA读取WORD,EXCEL,POWERPOINT,PDF文件的方法

JAVA读取WORD,EXCEL,POWERPOINT,PDF文件的方法http://blog.sina.com.cn/u/54c1567b010008vhOFFICE文档使用POI控件,PDF可以使用PDFBOX0.7.3控件,完全支持中文,用XPDF也行,不过感觉PDFBOX比较好,而且作者也在...
  • fuyangchang
  • fuyangchang
  • 2007-06-11 14:12
  • 10013

应用内展示word ,pdf, excel,ppt等文件

应用内展示word ,pdf, excel,ppt等文件在线展示 word ppt在线展示:https://view.officeapps.live.com/op/view.aspx?src=urlmWebView.getSettings().setJavaScriptEnabled(true); ...
  • suo172
  • suo172
  • 2017-11-03 17:48
  • 103

Word,Excel,pdf,txt等文件上传并提取内容

最近项目需求:1.要用到各种文件上传,下载。 2.并对文件进行搜索。 3.只要文件中包含有搜索的内容,全部显示出来。 今天正好有时间整理一下,方便以后阅读,及对需要用到的朋友提供微薄之力。首先在实现文件上传时,使用的struts2自带的文件上传功能,通过流的方式将文件保存,在下...
  • seashouwang
  • seashouwang
  • 2014-04-19 12:08
  • 1853

Word,Excel,Powerpoint,Txt,Pdf 等文档的在线浏览的实现

一:使用的工具及其技术:         openOffice,swfTools,flexPaper。          其中openOffice和s...
  • kalision
  • kalision
  • 2013-07-24 11:38
  • 3190

在android中读取word、excel、pdf

在网上查找了一些资料,发现用JAVA读取的方式有2中,一种是利用第三方的jar包,另外一种是利用IO数据流。因为刚开始尝试,最终决定先走简单的途径,先借助他人的成果,所以就选择用第三方的jar包来进行尝试。 一、 处理Office文件 (1)poi.jar包下载 下载地址:http://po...
  • HorseRunningNoStop
  • HorseRunningNoStop
  • 2016-02-23 23:07
  • 1761
    个人资料
    • 访问:74915次
    • 积分:1324
    • 等级:
    • 排名:千里之外
    • 原创:59篇
    • 转载:1篇
    • 译文:0篇
    • 评论:31条