2016-09-13 5 views
0

.doc (워드) 문서의 헤더를 편집하고 싶습니다. 코드 아래 내가 쓴 :자바를 사용하여 .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가 완료되지 않은 상태에 있고 많은 것들이 (I 년 전에 아마 보았다 마지막 시간) 지원되지 않습니다. .doc 파일 형식은 복잡한 이진 파일 형식입니다. 많은 표가 문서의 특정 위치를 가리키는 항목과 함께 존재합니다. 문서의 한 부분을 변경하면 일반적으로 모든 테이블을 업데이트해야합니다. 텍스트 실행, 텍스트 상자, 책갈피, 도형, 표 (행과 열) 및 더 많은 테이블이 있습니다. 운이 좋다면 매우 간단한 문서를 가지고 있으며 복잡한 테이블의 대부분은 거기에 존재하지 않습니다. 그러나 모양, 이미지, 텍스트 상자 등이 있으면 HWPF에서 제대로 지원되지 않거나 적절하게 지원되지 않는 것들이있을 수 있습니다. 출력은 일반적으로 Word에서 거부되는 잘못된 Word 파일입니다 (운이 좋으면) 또는 Word를 더 많이 또는 덜 무겁게 충돌시킬 수 있습니다. 잠재적으로 컴퓨터를 다시 시작할 필요가 있습니다.

는 (나는이 모든 몇 년 전에. 그래서 나는 세부 사항을 알고 고정 된 클라이언트에 대한 사용자 정의 HWPF 라이브러리를 개발했다.)

을 대안

당신은 .docx 형식 보는 대신 .doc 할 수 있습니다 . .docx 개의 파일을 가져올 수 있다면 XWPF를 사용할 수 있습니다.이 파일은 훨씬 더 나은 상태입니다.

헤더와 관련하여 : 내가 아는 한, 헤더는 주 문서에 없습니다. 헤더 하위 문서를 볼 필요가 있습니다. (나는 그것이 XWPFHeader라고 생각한다)

+0

안녕하세요. 응답 해 주셔서 감사합니다. 이제 docx를 사용 중이며 텍스트를 바꿀 수 있습니다. 이미지의 경우 나는 [this] (http://stackoverflow.com/questions/19244822/replace-a-placeholder-with-image-in-word)와 [this] (http://stackoverflow.com/questions/17745466)를 따랐다./삽입 그림 - 단어 - 문서/17768732 # 17768732),하지만 내 요구 사항은 약간 다릅니다 - 그것은 이미지를 삽입해야 제 2 페이지에 하나의 상자가 있습니다. 어떤 생각? –

+0

아마도 텍스트 상자가 있습니다. 지금은 세부 정보를 볼 수 없지만 XWPFDocument 또는 유사한 클래스에서 "텍스트 상자"를 검색 할 수 있습니다. 텍스트 상자 목록이나 텍스트 상자의 하위 문서가 있다고 가정하고 적절한 상자를 찾아야합니다. –