Aspose java 新插入一个Pragraph以后获取新paragraph的getEndPageIndex一直为0

代码如下:

//插入续表题目
table.getParentNode().insertAfter(continueNameParagraph, table);
doc.updatePageLayout();
//判断续表题目是否和之前的续表在同一个页面里。如果在同一个页面里的话,就不断insert一个paragraph,直到续表的题目到下一页
while (collector.getEndPageIndex(continueNameParagraph) == endPageIndex) {
    continueNameParagraph.getParentNode().insertAfter(new Paragraph(doc),continueNameParagraph);
}

获取这个collector.getEndPageIndex(continueNameParagraph)一直是0。不应该是2。正常来说不是0

@qhkyqhfe 我想 Aspose java word layoutCollector.getEndPageIndex 识别错误 - #7 by vyacheslav.deryushev 的回答可以帮到您。

package com.crane.wordformat;

import com.aspose.words.*;

import javax.swing.*;


public class testFormat {
    public static void main(String[] args) throws Exception {
        License license = new License();
        license.setLicense("C:\\\\Users\\\\11964\\\\Desktop\\\\Aspose.Words.Java.lic");

        LoadOptions loadOptions = new LoadOptions();
        loadOptions.getLanguagePreferences().setDefaultEditingLanguage(EditingLanguage.CHINESE_PRC);
        Document doc = new Document("C:\\Users\\11964\\Desktop\\测试粗排.docx", loadOptions);

        doc.getCompatibilityOptions().optimizeFor(MsWordVersion.WORD_2013);

        NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
        LayoutCollector layoutCollector = new LayoutCollector(doc);
        for (Table table : (Iterable<Table>) tables) {
            Row[] rows = table.getRows().toArray();
            int endIndex = layoutCollector.getEndPageIndex(rows[0]);
            for (int index = 0; index < rows.length; index++) {
                if (layoutCollector.getEndPageIndex(rows[index]) != endIndex) {
                    //split table
                    Table newTable = new Table(doc);
                    Row splitRow = rows[index];
                    Row tmp_row = table.getLastRow();
                    while(tmp_row != splitRow) {
                        newTable.appendChild(tmp_row);
                        tmp_row = table.getLastRow();
                    }
                    newTable.appendChild(tmp_row);
                    //add table title
                    Paragraph tableTitleParagraph = new Paragraph(doc);
                    tableTitleParagraph.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
                    Run run = new Run(doc);
                    run.setText("表名");
                    tableTitleParagraph.appendChild(run);
                    //insert title
                    table.getParentNode().appendChild(tableTitleParagraph);
                    table.getParentNode().insertAfter(tableTitleParagraph, table);
                    //insert new table
                    tableTitleParagraph.getParentNode().appendChild(newTable);
                    tableTitleParagraph.getParentNode().insertAfter(newTable, tableTitleParagraph);
                    //get new paragraph page index ,always 0, which is incorrect
                    int titleIndex = layoutCollector.getEndPageIndex(tableTitleParagraph);
                    System.out.println(titleIndex);
                    break;
                }
            }
        }
        doc.save("C:\\\\Users\\\\11964\\\\Desktop\\\\output.pdf");
        doc.save("C:\\\\Users\\\\11964\\\\Desktop\\\\output.docx");
    }
}

您好,这是我的实例代码
这个是我的docx
目前java word版本是24.6
还是无法正确识别新insert的paragraph的pageIndex
下面是测试文档
测试粗排.docx (32.6 KB)

@qhkyqhfe 手动或通过 Aspose.Words 编辑文档后,需要清除布局收集器数据并更新页面布局。有关详细信息,请查看以下链接:

请更新您的代码:

layoutCollector.clear();
doc.updatePageLayout();

int titleIndex = layoutCollector.getEndPageIndex(tableTitleParagraph);

您好,事实上,采用您的代码也无济于事。我的代码如下:

package com.crane.wordformat;

import com.aspose.words.*;

import javax.swing.*;


public class testFormat {
    public static void main(String[] args) throws Exception {
        License license = new License();
        license.setLicense("C:\\\\Users\\\\11964\\\\Desktop\\\\Aspose.Words.Java.lic");
        LoadOptions loadOptions = new LoadOptions();
        loadOptions.getLanguagePreferences().setDefaultEditingLanguage(EditingLanguage.CHINESE_PRC);
        Document doc = new Document("C:\\Users\\11964\\Desktop\\test_table.docx", loadOptions);
        doc.getCompatibilityOptions().optimizeFor(MsWordVersion.WORD_2019);
        LayoutCollector layoutCollector = new LayoutCollector(doc);
        NodeCollection tables = doc.getChildNodes(NodeType.TABLE, true);
        for (Table table : (Iterable<Table>) tables) {
            Row[] rows = table.getRows().toArray();
            int endIndex = layoutCollector.getEndPageIndex(rows[0]);
            for (int index = 0; index < rows.length; index++) {
                if (layoutCollector.getEndPageIndex(rows[index]) != endIndex) {
                    //split table
                    Table newTable = new Table(doc);
                    Row splitRow = rows[index];
                    Row tmp_row = table.getLastRow();
                    while(tmp_row != splitRow) {
                        newTable.appendChild(tmp_row);
                        tmp_row = table.getLastRow();
                    }
                    newTable.appendChild(tmp_row);
                    //add table title
                    Paragraph tableTitleParagraph = new Paragraph(doc);
                    tableTitleParagraph.getParagraphFormat().setAlignment(ParagraphAlignment.CENTER);
                    Run run = new Run(doc);
                    run.setText("表名");
                    tableTitleParagraph.appendChild(run);
                    //insert title
                    table.getParentNode().appendChild(tableTitleParagraph);
                    table.getParentNode().insertAfter(tableTitleParagraph, table);
                    //insert new table
                    tableTitleParagraph.getParentNode().appendChild(newTable);
                    tableTitleParagraph.getParentNode().insertAfter(newTable, tableTitleParagraph);
                    //get new paragraph page index ,always 0, which is incorrect
                    layoutCollector.clear();
                    doc.updatePageLayout();
                    int titleIndex = layoutCollector.getEndPageIndex(tableTitleParagraph);
                    System.out.println(titleIndex);
                    break;
                }
            }
        }
        doc.save("C:\\\\Users\\\\11964\\\\Desktop\\\\output.pdf");
        doc.save("C:\\\\Users\\\\11964\\\\Desktop\\\\output.docx");
    }
}

我的测试文档如下:
test_table.docx (89.1 KB)

您可以看到,我试图对每一个跨页的表进行分割,并且在跨页的最上边增加一个“表名”的段落。可是表5.6下面的“表名”段落依然落到了上一页。这个是错误的。正确的做法应该是在下一页。

@qhkyqhfe 这是预料之中的,因为有些行的高度不同,当你分割它们并改变位置时,仍有一些空间可以移动段落或其他表格中的一些内容。MS Word 没有任何关于页面索引的信息,而当我们使用 LayoutCollector 时,我们使用固定页面格式(如 PDF)来获取一些关于页面的信息。正如你在 PDF 文件输出中看到的那样,新段落显示在新页面上。

请问我如何word设置为固定页面格式呢?还是说这个东西实践上就无法实现的。因为我需要实现一个将表格分割的功能,并且表格之间的文字必须在页面的最顶部。所以固定页面这个对我的产品来说很重要

@qhkyqhfe 我创建了一个 WORDSNET-27174 问题,涉及重新打开 docx 文件并将其保存为 pdf 后,段落位置仍然不同。分析之后,我们将为您提供更多信息。

谢谢您。请问有预计解决时间吗

@qhkyqhfe 遗憾的是,目前还没有预计的时间。该问题正在排队等待分析。