2012-07-21 132 views
1

我正在查找读取和写入MS Word文档的Java库。 我要做的是:将MS Word文档与Java合并

  • 从另一个Word文档读取模板文件,.DOT或.doc,并与数据库读取一些数据填充它
  • 取数据和合并,与该文件描述以上,保留段落格式

用户可以对文件进行更新。

我搜索并找到POI Apache和UNO OpenOffice。 第一个可以轻松地读取模板并用我自己的数据库替换任何占位符。我没有发现关于合并两个或更多文档的任何内容。 OpenOffice UNO看起来更稳定但也很复杂。此外,我不确定它有能力合并文件。

我们正在寻找正确的方向?

我想过的另一个解决方案是将doc文件转换为docx。通过这种方式,我找到了更多可以帮助我们合并文档的库。 但我该怎么做?

谢谢!

+0

http://stackoverflow.com/questions/2494549/is-there-any-java-library-maybe-poi-which-allows-to-merge-docx-files – 2012-07-21 12:09:51

+0

感谢,但requiriment是.doc文件! – frengo 2012-07-21 12:11:36

+0

“合并”文档意味着什么?只是将一个内容附加到另一个? – 2012-07-21 13:16:37

回答

1

您可以看看Docmosis,因为它提供了您提到的四个功能(数据填充,模板/文档合并,DOC格式和java界面)。它有几种口味(下载,在线服务),但是你可以注册一个免费的云服务试用版,看Docmosis是否可以做你想做的(然后你不需要安装任何东西)或者在线阅读文档。

它在底层使用OpenOffice(您可以从开发者指南安装说明中看到),它在文档之间做了相当不错的转换。 UNO API有一些复杂性 - 我建议Docmosis或JODReports将您的项目直接与UNO隔离。

希望有所帮助。

0
import java.io.File; 
import java.util.List; 

import javax.xml.bind.JAXBException; 

import org.docx4j.dml.CTBlip; 
import org.docx4j.openpackaging.exceptions.Docx4JException; 
import org.docx4j.openpackaging.packages.WordprocessingMLPackage; 
import org.docx4j.openpackaging.parts.Part; 
import org.docx4j.openpackaging.parts.PartName; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageBmpPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageEpsPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageGifPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageJpegPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImagePngPart; 
import org.docx4j.openpackaging.parts.WordprocessingML.ImageTiffPart; 
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart; 
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart.AddPartBehaviour; 
import org.docx4j.relationships.Relationship; 

public class MultipleDocMerge { 


    public static void main(String[] args) throws Docx4JException, JAXBException { 
     File first = new File("D:\\Mreg.docx"); 
     File second = new File("D:\\Mreg1.docx"); 
     File third = new File("D:\\Mreg4&19.docx"); 
     File fourth = new File("D:\\test12.docx"); 
     WordprocessingMLPackage f = WordprocessingMLPackage.load(first); 
     WordprocessingMLPackage s = WordprocessingMLPackage.load(second); 
     WordprocessingMLPackage a = WordprocessingMLPackage.load(third); 
     WordprocessingMLPackage e = WordprocessingMLPackage.load(fourth); 

     List body = s.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false); 
     for(Object b : body){ 
      List filhos = ((org.docx4j.wml.Body)b).getContent(); 
      for(Object k : filhos) 
       f.getMainDocumentPart().addObject(k); 
     } 

     List body1 = a.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false); 
     for(Object b : body1){ 
      List filhos = ((org.docx4j.wml.Body)b).getContent(); 
      for(Object k : filhos) 
       f.getMainDocumentPart().addObject(k); 
     } 

     List body2 = e.getMainDocumentPart().getJAXBNodesViaXPath("//w:body", false); 
     for(Object b : body2){ 
      List filhos = ((org.docx4j.wml.Body)b).getContent(); 
      for(Object k : filhos) 
       f.getMainDocumentPart().addObject(k); 
     } 


     List<Object> blips = e.getMainDocumentPart().getJAXBNodesViaXPath("//a:blip", false); 
     for(Object el : blips){ 
      try { 

        CTBlip blip = (CTBlip) el; 
        RelationshipsPart parts = e.getMainDocumentPart().getRelationshipsPart(); 
        Relationship rel = parts.getRelationshipByID(blip.getEmbed()); 
        Part part = parts.getPart(rel); 
        if(part instanceof ImagePngPart) 
         System.out.println(((ImagePngPart) part).getBytes()); 
        if(part instanceof ImageJpegPart) 
         System.out.println(((ImageJpegPart) part).getBytes()); 
        if(part instanceof ImageBmpPart) 
         System.out.println(((ImageBmpPart) part).getBytes()); 
        if(part instanceof ImageGifPart) 
         System.out.println(((ImageGifPart) part).getBytes()); 
        if(part instanceof ImageEpsPart) 
         System.out.println(((ImageEpsPart) part).getBytes()); 
        if(part instanceof ImageTiffPart) 
         System.out.println(((ImageTiffPart) part).getBytes()); 
        Relationship newrel = f.getMainDocumentPart().addTargetPart(part,AddPartBehaviour.RENAME_IF_NAME_EXISTS); 
        blip.setEmbed(newrel.getId()); 
        f.getMainDocumentPart().addTargetPart(e.getParts().getParts().get(new PartName("/word/"+rel.getTarget()))); 
       } catch (Exception ex){ 
         ex.printStackTrace(); 
       } } 

     File saved = new File("D:\\saved1.docx"); 
     f.save(saved); 




    } 

} 
+0

尝试添加解释也。 – 2018-02-15 05:55:51