代码如下:
//插入续表题目
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
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 遗憾的是,目前还没有预计的时间。该问题正在排队等待分析。