【问题标题】:How to parse style separated paragraphs of MS Word in Aspose or Apache Poi?如何在 Aspose 或 Apache Poi 中解析 MS Word 的样式分隔段落?
【发布时间】:2020-05-18 03:11:08
【问题描述】:

ms word 文档有多种样式的段落,通常每个段落都有一种样式,但您可以使用样式分隔工具在一个段落上组合两个或多个样式的文本。那么如何使用 Aspose Words、Apache Poi 或其他方法从根释义中获取子样式和样式分隔段落的文本内容?

【问题讨论】:

  • 你试过什么?你被困在哪里了?这是关于Office Open XML (*.docx) 还是二进制文件格式*.doc?至少在Office Open XML (*.docx) 中,样式分隔符只会导致段落的换行符消失。尽管如此,样式分隔符之前和之后的段落是两个单独的段落,可以这样阅读。
  • 我在 docx 格式上尝试过 apache poi 和 aspose 解析器,但我只能获取根段落元素和样式。所以我是新的解析文档。

标签: java apache-poi apache-tika aspose aspose.words


【解决方案1】:

样式分隔符实际上是正常的段落分隔符,但设置了特殊属性。因此,您可以将由样式分隔符分隔的内容视为两个单独的段落。

<w:p w14:paraId="561A87F3" w14:textId="0D47DD82" w:rsidR="00AB32A0" w:rsidRPr="00AB32A0" w:rsidRDefault="00AB32A0" w:rsidP="00AB32A0">
  <w:pPr>
    <w:pStyle w:val="Heading1" />
    <w:rPr>
      <w:vanish />
      <w:specVanish />
    </w:rPr>
  </w:pPr>
  <w:r w:rsidRPr="00AB32A0">
    <w:rPr>
      <w:rStyle w:val="Heading1Char" />
    </w:rPr>
    <w:t>Test heading1</w:t>
  </w:r>
</w:p>
<w:p w14:paraId="0982566B" w14:textId="76E92742" w:rsidR="00391656" w:rsidRDefault="00AB32A0" w:rsidP="00AB32A0">
  <w:r>
    <w:t xml:space="preserve"> test paragraph.</w:t>
  </w:r>
</w:p>

以下两个属性表示分节符是样式分隔符

<w:rPr>
  <w:vanish />
  <w:specVanish />
</w:rPr>

在 Aspose.Words 中,您可以通过 Paragraph.BreakIsStyleSeparator 属性检测分节符是否为样式分隔符。

cs:

Document doc = new Document(@"C:\Temp\test.docx");
foreach (Paragraph para in doc.FirstSection.Body.Paragraphs)
{
    Console.WriteLine("Style Name: {0}; Is Style Separator: {1}; Content: {2}", para.ParagraphFormat.StyleName, para.BreakIsStyleSeparator, para.ToString(SaveFormat.Text));
}

java:

Document doc = new Document("C:/Temp/test.docx");
for(Paragraph para : doc.getFirstSection().getBody().getParagraphs()){
   String styleName = para.getParagraphFormat().getStyleName();
   boolean isStyleSeparator = para.getBreakIsStyleSeparator();
   String content = para.toString(SaveFormat.TEXT);
}

披露:我在 Aspose.Words 团队工作。

【讨论】:

  • 感谢您的回复,祝整个团队成功:) 我已经在 java 上进行了测试,但 para.BreakIsStyleSeparator 永远不会返回 true,即使有很多单独的段落。
  • 我的分隔段落之间有一个 • 图标,而不是 ¶ 图标,即使使用样式分隔工具组合了不同样式的段落。
  • 屏幕截图:prnt.sc/siz5wg
  • 点是一个空格。您的文档中似乎没有合并的段落,但段落的运行格式不同。您可以循环遍历段落中的 Run 节点并使用 Run.getFont() 属性检查它们的格式。 apireference.aspose.com/words/java/com.aspose.words/run#Font
  • 非常感谢,已解决。问题:第二段有段落样式,但由于第一段有字符样式,样式分隔符没有正确应用。清理第一个样式文本并创建一个段落样式版本,并将它们分开,就是这样。再次感谢。
【解决方案2】:

至少在 Office Open XML (*.docx) 使用样式分隔符 (CtrlAltEnter) 只会导致消失的换行符段落。尽管如此,样式分隔符前后的段落是两个单独的段落,可以这样阅读。

鉴于以下Word 文档WordDocument.docx

以下代码读取所有段落并获取它们的样式。还有一种方法getIsLineBreakVanished 检查给定段落的换行符是否消失。这适用于使用了样式分隔符 (CtrlAltEnter) 的段落。

import java.io.FileInputStream;

import org.apache.poi.xwpf.usermodel.*;

public class WordGetParagraphStyles {

 static boolean getIsLineBreakVanished(XWPFParagraph paragraph) {
  boolean result = false;
  if (paragraph.getCTP().getPPr() != null) {
   if (paragraph.getCTP().getPPr().getRPr() != null) {
    if (paragraph.getCTP().getPPr().getRPr().getVanish() != null && paragraph.getCTP().getPPr().getRPr().getSpecVanish() != null) {
     result = true;
    }
   }
  }
  return result;
 }

 public static void main(String[] args) throws Exception {
  XWPFDocument document = new XWPFDocument(new FileInputStream("./WordDocument.docx"));

  for (IBodyElement bodyElement : document.getBodyElements()) {
   if (bodyElement instanceof XWPFParagraph) {
    XWPFParagraph paragraph = (XWPFParagraph)bodyElement;
    String style = paragraph.getStyle();
    String styleID = paragraph.getStyleID();
    String text = paragraph.getText();
    boolean hasCRLF = !getIsLineBreakVanished(paragraph);
    System.out.println("Found paragraph:" + " Style=" + styleID + ":" + style + ", Text=" + text + ", has CRLF=" + hasCRLF);
   }
  }
 }
}

【讨论】:

  • 感谢您的回复,但每次都返回 true。我的分隔段落之间有一个 • 图标,而不是 ¶ 图标,即使使用样式分隔工具组合了不同样式的段落。
  • @ATES:屏幕截图显示的是段落样式为“Prg”的段落。在其中两个中,“Head_5”样式的字符样式部分应用于第一个文本运行。这与您关于样式分隔段落的问题无关。
  • 感谢@Axel-Richter,删除了字符类型的样式并创建了一个具有段落类型的样式,并将它们分开,用您的代码解决。
猜你喜欢
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
相关资源
最近更新 更多