使用java在.doc中添加图像和编辑标题

使用java在.doc中添加图像和编辑标题,java,apache-poi,hwpf,Java,Apache Poi,Hwpf,我想编辑.doc(word)文档的标题。下面是我写的代码: 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

我想编辑.doc(word)文档的标题。下面是我写的代码:

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();
        }
    }
}
导入org.apache.poi.hwpf.HWPFDocument;
导入org.apache.poi.hwpf.usermodel.CharacterRun;
导入org.apache.poi.hwpf.usermodel.paragration;
导入org.apache.poi.hwpf.usermodel.Range;
导入org.apache.poi.hwpf.usermodel.Section;
导入org.apache.poi.poifs.filesystem.poifsfsystem;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.net.URL;
公共类WordReplaceText{
公共静态最终字符串SOURCE\u FILE=“C:\\Users\\609650323\\Desktop\\Files\\Project\\GFAST\\surveyPack.doc”;
公共静态最终字符串输出\u FILE=“C:\\Users\\609650323\\Desktop\\Files\\Project\\GFAST\\surveyPack2.doc”;
公共静态void main(字符串[]args)引发异常{
WordReplaceText实例=新的WordReplaceText();
HWPFDocument doc=instance.openDocument(源文件);
如果(doc!=null){
doc=instance.replaceText(doc,“${A}”,“AField”);
实例.saveDocument(文档、输出文件);
}
}
专用HWPFDocument replaceText(HWPFDocument文档,字符串findText,字符串replaceText){
Range r=doc.getRange();
对于(int i=0;i
但它不工作,在执行下面的代码后,它无法打开显示错误的新文档。我还需要在文件中提供的框中添加pic。有人知道怎么做吗

以下是我也尝试过的链接:

获取相同的错误:


简短的答案很可能是不幸的:它不起作用

答案很长:

HWPF处于不完整状态,许多东西不受支持(我上次查看可能是一年前)。.doc文件格式是一种复杂的二进制文件格式。许多表都有指向文档中某些位置的条目。更改文档的一部分通常需要更新所有表。有用于文本运行、文本框、书签、形状、表格(行和列)等的表格。如果幸运的话,您有一个非常简单的文档,而大多数复杂的表都不存在。然而,当你有形状、图像、文本框等时,你可能会遇到HWPF中尚未/未正确支持的东西。输出通常是一个无效的Word文件,它会被Word拒绝(如果您幸运的话),或者会或多或少地使Word崩溃(可能需要重新启动计算机)

(我为一个客户开发了一个定制的HWPF库,几年前就解决了所有这些问题。因此我知道了细节。)

替代品

您可能希望查看
.docx
格式,而不是
.doc
。如果您可以安排获取
.docx
文件,那么可以使用XWPF,它的状态要好得多


关于标题:据我所知,标题不在主文档中。您需要查看标题子文档。(我相信它是
XWPFHeader
?)

简短的答案很可能是不幸的:它不起作用

答案很长:

HWPF处于不完整状态,许多东西不受支持(我上次查看可能是一年前)。.doc文件格式是一种复杂的二进制文件格式。许多表都有指向文档中某些位置的条目。更改文档的一部分通常需要更新所有表。有用于文本运行、文本框、书签、形状、表格(行和列)等的表格。如果幸运的话,您有一个非常简单的文档,而大多数复杂的表都不存在。然而,当你有形状、图像、文本框等时,你可能会遇到HWPF中尚未/未正确支持的东西。输出通常是一个无效的Word文件,它会被Word拒绝(如果您幸运的话),或者会或多或少地使Word崩溃(可能需要重新启动计算机)

(我为一个客户开发了一个定制的HWPF库,几年前就解决了所有这些问题。因此我知道了细节。)

替代品

您可能希望查看
.docx
格式,而不是
.doc
。如果您可以安排获取
.docx
文件,那么可以使用XWPF,它的状态要好得多


关于标题:据我所知,标题不在主文档中。您需要查看标题子文档。(我相信它是
XWPFHeader
?)

您使用的是哪个版本的ApachePOI?如果不是最新版本,您可以尝试使用最新版本吗?Apache POI 3.13您使用的是哪个版本的Apache POI?如果不是最新的,你能试试最新的吗?ApachePOI3.13Hi,谢谢你的回复。