文档中存在两个类似线条的对象,怎么解析提取出来

文字文稿1.docx (12.7 KB)

@ouchli 这些线是段落底部边框。 您可以使用以下代码来获取:

Document doc = new Document("C:\\Temp\\in.docx");
Paragraph p = doc.getFirstSection().getBody().getFirstParagraph();
System.out.println(p.getParagraphFormat().getBorders().getBottom().getColor());
System.out.println(LineStyle.getName(p.getParagraphFormat().getBorders().getBottom().getLineStyle()));
System.out.println(p.getParagraphFormat().getBorders().getBottom().getLineWidth());

你好,设置段落的边框属性时,调用该方法setBorderAttr,提示已经过时,请问有替代的方法吗

@ouchli 您需要从 "ParagraphFormat"中获取边框:

例如

para.getParagraphFormat().getBorders().getTop().setLineStyle(LineStyle.DOT_DASH);
para.getParagraphFormat().getBorders().getTop().setColor(Color.BLUE);

你好,请问如何获取文档章节标签的字体呢
image.png (649 字节)

在上图章节标题中,标签"1"的字体是Arial,标题文本"范围"的字体是宋体,
我理解使用paragraph.getRuns().get(0).getFont().getName()方法获取到的字体是标题文本的字体"宋体";
而使用paragraph.getListLabel().getFont().getName()方法应该获取到标签的字体,但实际上该方法获取到的字体仍是宋体,
请问该如何获取标签的字体

@ouchli paragraph.getListLabel().getFont().getName() 通常适用于列表标签。您可以尝试使用

para.getListFormat().getListLevel().getFont()

如果仍有问题,请在此处附上输入文件。

获取到的字体和文档中显示的仍然不一样
image.png (52.4 KB)
文件如下
测试文件.docx (27.7 KB)

@ouchli 当我在 MS Word 中打开文档时,发现标签使用的是 Arial 字体。我认为 WPS 默认使用 Times New Roman,但我们模仿 MS Word 的行为,这是不一样的。

好的,明白了,谢谢~,,,,,

你好,如果我想获取全文中<>括起来的内容,可以使用正则匹配,通过document.getRange().replace()方法来获取,但是该方法只能在一个node中匹配正则
举个例子:
假设我要获取<>括起来的内容,我设置正则为<.*?>
此时调用document.getRange().replace()方法去匹配,当存在段落时,可以匹配到结果
但是当<>括起来的是多个段落时,就匹配不到了, 如:
<xxx,
xxx
xxxx>
请问我要如何才能获取到多个段落匹配的正则结果呢

@ouchli 您可以尝试在 <> 内的文本中添加书签来实现这一效果。

Document doc = new Document("input.docx");

FindReplaceOptions options = new FindReplaceOptions();
options.setReplacingCallback(new FindAndInsertBookmark("bookmark", true));
doc.getRange().replace("<", "", options);

options.setReplacingCallback(new FindAndInsertBookmark("bookmark", false));
doc.getRange().replace(">", "", options);

Bookmark bookmark = doc.getRange().getBookmarks().get("bookmark");
bookmark.setText("");

DocumentBuilder builder = new DocumentBuilder(doc);
builder.moveToBookmark("bookmark");
builder.writeln("New text");

doc.getRange().getBookmarks().remove("bookmark");

doc.save("output.docx");

private static class FindAndInsertBookmark implements IReplacingCallback {
    private String bmName;
    private boolean isStart;

    public FindAndInsertBookmark(String bmName, Boolean isStart) {
        this.bmName = bmName;
        this.isStart = isStart;
    }

    @Override
    public int replacing(ReplacingArgs e) {
        Node currentNode = e.getMatchNode();

        if (e.getMatchOffset() > 0)
            currentNode = splitRun((Run) currentNode, e.getMatchOffset());

        ArrayList<Run> runs = new ArrayList<>();

        int remainingLength = e.getMatch().group().length();
        while (remainingLength > 0 && currentNode != null && currentNode.getText().length() <= remainingLength) {
            runs.add((Run) currentNode);
            remainingLength -= currentNode.getText().length();

            do {
                currentNode = currentNode.getNextSibling();
            } while (currentNode != null && currentNode.getNodeType() != NodeType.RUN);
        }

        if (currentNode != null && remainingLength > 0) {
            splitRun((Run) currentNode, remainingLength);
            runs.add((Run) currentNode);
        }

        Run run = runs.get(0);
        if (isStart) {
            run.getParentNode().insertBefore(new BookmarkStart(run.getDocument(), bmName), run);
        } else {
            run.getParentNode().insertAfter(new BookmarkEnd(run.getDocument(), bmName), run);
        }

        return ReplaceAction.SKIP;
    }
}

private static Run splitRun(Run run, int position) {
    Run afterRun = (Run)run.deepClone(true);
    run.getParentNode().insertAfter(afterRun, run);
    afterRun.setText(run.getText().substring(position));
    run.setText(run.getText().substring(0, position));
    return afterRun;
}

谢谢你的回答,还是有点看不太懂,如你所说加入书签后如何进行正则的搜索呢,烦请给一个例子,谢谢~

@ouchli 创建书签时,可以通过代码 doc.getRange().getBookmarks().get("bookmark").getText(); 获取 <> 中的书签内容。

我还有一个问题,得到书签中内容后,如何获取书签所属的段落信息呢,以及如何获取书签中内容的字体信息呢

@ouchli 您可以使用以下代码获取段落:

Paragraph para = (Paragraph) bookmark.getBookmarkStart().getAncestor(NodeType.PARAGRAPH);

and if there is several paragraph you can use getNextSibling.

你好,请问文档–》选项对应的设置是哪个对象呢,如下图所示:
image.png (16.1 KB)
image.png (39.5 KB)

我想设置上图所示的选项,该如何设置呢

@ouchli 这里是

doc.getCompatibilityOptions().getUlTrailSpace()

检查所有兼容性选项 CompatibilityOptions | Aspose.Words for Java

谢谢回答
再问一个问题,有这样一个场景,我想设置文档某段文字的字体颜色,代码运行后通过代码查看字体颜色是设置成功了,但是看实际修订后的文档字体颜色却没变,请问这是什么原因:
代码如下:

Node node = nodes.get(0);
FindReplaceOptions opt = new FindReplaceOptions();
Font applyFont = opt.getApplyFont();
Color blue = new Color(0, 0, 255);
applyFont.setColor(blue);
try {
    node.getRange().replace(examStr, examStr, opt);
} catch (Exception e) {
    throw new Exception(e.getMessage());
}

@ouchli 不幸的是,我无法用您提供的代码重现这个问题。你能提供更多关于你正在做的步骤的信息吗?

请问如何移除文档第一页中存在的分页符呢