【问题标题】:Replacing text in XWPFParagraph without changing format of the docx file替换 XWPFParagraph 中的文本而不更改 docx 文件的格式
【发布时间】:2020-12-02 04:52:06
【问题描述】:

我正在开发字体转换器应用程序,它将 Unicode 字体文本转换为 Krutidev/Shree Lipi(马拉地语/印地语)字体文本。在原始 docx 文件中有格式化的单词(即颜色、字体、文本大小、超链接等)。 在将单词从 Unicode 转换为另一种字体后,我想保持最终 docx 的格式与原始 docx 相同。

PFA。

这是我的代码

try {
    fileInputStream = new FileInputStream("StartDoc.docx");
    document = new XWPFDocument(fileInputStream);
    XWPFWordExtractor extractor = new XWPFWordExtractor(document);
    List<XWPFParagraph> paragraph = document.getParagraphs();
    Converter data = new Converter() ;
    for(XWPFParagraph p :document.getParagraphs())
    {           
        for(XWPFRun r :p.getRuns())
        {           
            String string2 = r.getText(0);
            data.uniToShree(string2);
            r.setText(string2,0);
        }
    }
    //Write the Document in file system

    FileOutputStream out = new FileOutputStream(new File("Output.docx");
    document.write(out);
    out.close();
    System.out.println("Output.docx written successully");

} 
catch (IOException e) {
    System.out.println("We had an error while reading the Word Doc");
}

【问题讨论】:

  • 在段落中逐个处理它?
  • @Gagravarr 如果我在上面的代码中做错了什么,请指导我。
  • 如果你想保持格式,你需要逐段运行而不是逐段工作。像现在一样获取您的段落,然后在这些段落中运行
  • @Gagravarr 我尝试了此代码,但出现错误。 Converter.uniToKrutidev 的空指针异常。 for(XWPFParagraph p :document.getParagraphs()){ for(XWPFRun r :p.getRuns()){ String string2 = r.getText(0);字符串数据a; dataa = Converter.uniToKrutidev(string2); r.setText(dataa,0); } }
  • 运行保持格式。如果你想保持格式,你需要坚持替换运行中的文本。至于页面,你的代码肯定还有bug,Word是基于运行而不是基于页面的格式,所以文件格式没有页面变化!

标签: java apache-poi xwpf


【解决方案1】:

感谢您的问答。 几年前我曾使用过 POI,但使用的是 excel 工作簿,但我仍然会尽力帮助您找到错误的根本原因。

Java 编译器足够聪明,可以自行建议良好的调试信息! 消除错误歧义的第一步是不要覆盖通过编译器抱怨提供给您的异常消息。

尝试打印 e.getLocalizedMessage() 或 e.getMessage() 的结果,看看你得到了什么。 使用 printStackTrace 方法获取堆栈跟踪对于查明错误所在的位置也很有用!

分享您对上述方法调用的发现,以进一步帮助您调试问题。

[编辑 1:]

看来,您可以在数据的字体转换方面恰到好处地处理文件,但您无法在转换后的数据文件中重建原始数据的格式。 (因此,“我们在阅读 Word Doc 时出错”,是一个谎言被打印出来;))

现在,Word 文档有 2 个元素:

  1. 内容
  2. 结构或架构

您可以转换数据,因为您只处理各自 doc 文件的内容。 为了能够保留内容的格式,您的解决方案还需要了解 doc 文件的格式并注意这一点。

定义 doc 文件及其扩展名 (.docx) 的 MS Word 遵循一组定义格式规则的特定模式。这些架构在 Microsoft 的 XML 命名空间包中定义[1]。

您可以很容易地获得所需的 doc 文件的 XML(HTML) 格式(参见 [1] 中的步骤或链接 [2] 中的代码),甚至可以应用不同的架构或可能基于您自己的架构定义由 MS 命名空间提供的定义,无论是编程方式,您都需要熟悉 XML、XSL 和 XSLT 概念(w3schools[3] 是一个很好的起点),但这种方法并不比编写自己的 MS-Word 版本更复杂;或使用 [1] 中所示的 MS-Word 内置工具。

[1]。 https://www.microsoftpressstore.com/articles/article.aspx?p=2231769&seqNum=4#:~:text=During%20conversion%2C%20Word%20tags%20the,you%20can%20an%20HTML%20file.

[2]。 https://svn.apache.org/repos/asf/poi/trunk/src/scratchpad/testcases/org/apache/poi/hwpf/converter/TestWordToHtmlConverter.java

[3]。 https://www.w3schools.com/xml/

我的回答为您提供了如何实现您想要的目标的粗略概述,但根据您的倾向和可用时间,您可能需要在决定走一条路而不走另一条路之前自行决定。 希望对您有所帮助!

【讨论】:

  • 感谢您的回答。正如@gagravarr 告诉我逐段运行然后逐段运行。这就是我在上面的代码中写的。在逐个运行之前,代码是不同的。您也可以检查早期的代码。上图是早期代码的输出
  • 当您遇到异常时,您的意思是“System.out.println("We have an error while reading the Word Doc");”您确定您在读取 ​​word 文件时遇到错误吗?如果是,则已经知道错误。如果不是,异常说明了什么?打印 e.getMessage() 和 e.printStackTrace() 以了解捕获了哪个异常条件。
猜你喜欢
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 2011-10-01
相关资源
最近更新 更多