2016-09-13 76 views
0

我想要編輯.doc(word)文檔的標題。下面的代碼,我已經寫了:使用java在.doc中添加圖像和編輯標題

import org.apache.poi.hwpf.HWPFDocument; 
import org.apache.poi.hwpf.usermodel.CharacterRun; 
import org.apache.poi.hwpf.usermodel.Paragraph; 
import org.apache.poi.hwpf.usermodel.Range; 
import org.apache.poi.hwpf.usermodel.Section; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.net.URL; 

public class WordReplaceText { 
    public static final String SOURCE_FILE = "C:\\Users\\609650323\\Desktop\\Files\\Project\\GFAST\\surveyPack.doc"; 
    public static final String OUTPUT_FILE = "C:\\Users\\609650323\\Desktop\\Files\\Project\\GFAST\\surveyPack2.doc"; 

    public static void main(String[] args) throws Exception { 
     WordReplaceText instance = new WordReplaceText(); 
     HWPFDocument doc = instance.openDocument(SOURCE_FILE); 
     if (doc != null) { 
      doc = instance.replaceText(doc, "${A}", "AField"); 
      instance.saveDocument(doc, OUTPUT_FILE); 

     } 

    } 

    private HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText) { 
     Range r = doc.getRange(); 
     for (int i = 0; i < r.numSections(); ++i) { 
      Section s = r.getSection(i); 
      for (int j = 0; j < s.numParagraphs(); j++) { 
       Paragraph p = s.getParagraph(j); 
       for (int k = 0; k < p.numCharacterRuns(); k++) { 
        CharacterRun run = p.getCharacterRun(k); 
        String text = run.text(); 
        if (text.contains(findText)) { 
         run.replaceText(findText, replaceText); 
        } 
       } 
      } 
     } 
     return doc; 
    } 

    private HWPFDocument openDocument(String file) throws Exception { 
     URL res = getClass().getClassLoader().getResource(file); 
     HWPFDocument document = null; 
     if (res != null) { 
      document = new HWPFDocument(new POIFSFileSystem(new File(res.getPath()))); 
     }else 
      document = new HWPFDocument(new POIFSFileSystem(new File(SOURCE_FILE))); 
     return document; 
    } 

    private void saveDocument(HWPFDocument doc, String file) { 
     try { 
      FileOutputStream out = new FileOutputStream(file); 
      doc.write(out); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

但其沒有工作,下面的代碼執行後,它是不能夠打開新的文件顯示錯誤。我還需要在文檔中提供的框中添加圖片。任何機構有任何想法如何做到這一點?

下面是鏈接我也嘗試:讓同樣的錯誤

Replacing variables in a word document template with java

enter image description here

+1

您使用的是哪個版本的Apache POI?如果不是最新的,你可以試試最新的? – centic

+0

Apache POI 3.13 –

回答

2

簡短的回答是可能的,不幸的是:它不工作。

長的答案是:

HWPF處於未完成狀態,很多事情不支持(上一次一年前,我也許看)。 .doc文件格式是一種複雜的二進制文件格式。許多表格都有指向文檔中特定位置的條目。更改文檔的一部分通常需要更新所有表格。有文本運行,文本框,書籤,形狀,表格(行和列)等等。如果你幸運的話,你有一個非常簡單的文件,大多數複雜的表格都不在那裏。但是,當你有形狀,圖像,文本框等時,你很可能遇到HWPF中尚未/未正確支持的東西。輸出通常是一個無效的Word文件,被Word拒絕(如果你幸運的話),或者它或多或少地使Word崩潰(可能需要重新啓動計算機)。

(我開發了一個定製HWPF庫,其固定的這一切在幾年前,所以我知道詳情的客戶端。)

替代

你可能想看看.docx格式而不是.doc 。如果您可以安排獲取.docx文件,則可以使用處於更好狀態的XWPF。

關於標題:據我所知,標題不在主文檔中。您需要查看標題子文檔。 (我相信這是XWPFHeader?)

+0

嗨,謝謝你的迴應。現在我正在使用docx並能夠替換文本。對於圖像我跟着[這](http://stackoverflow.com/questions/19244822/replace-a-placeholder-with-image-in-word)和[this](http://stackoverflow.com/questions/17745466/insert-picture-in-word-document/17768732#17768732),但我的要求有點不同 - 它在第二頁上有一個框,我必須插入圖像。任何想法? –

+0

也許你有一個文本框。我現在無法查看詳細信息,但可以在XWPFDocument或類似的類中搜索「文本框」。我假設會有一個文本框或文本框的子文檔列表,你必須找到適當的框。 –