2016-09-13 20 views
0

.doc(単語)文書のヘッダーを編集したいとします。以下のコードを書いています。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ライブラリを開発しました。)

代替

あなたが代わりに.doc.docx形式を見てみたいことがあり。 .docxファイルを手配することができれば、はるかに良い状態にあるXWPFを使うことができます。

ヘッダーについて:私が覚えている限り、ヘッダーはメイン文書にありません。あなたはヘッダーサブ文書を見る必要があります。 (私はそれがXWPFHeaderだったと信じています)

+0

こんにちは、ありがとうございました。今私はdocxを使用しており、テキストを置き換えることができます。画像の場合、私は[this](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)、私の要件は少し異なります。 - 画像を挿入する必要がある2ページ目に1つのボックスがあります。何か案が? –

+0

おそらくあなたはテキストボックスを持っています。今は詳細を見ることはできませんが、XWPFDocumentまたは類似のクラスで "textbox"を検索することができます。私は、テキストボックスの一覧やテキストボックスのサブ文書があると仮定し、適切なボックスを見つける必要があります。 –

関連する問題