LayoutCollector.getStartPageIndex 获取某一个row页码数字错误

test续表.docx (17.6 KB)

你好,我在尝试获取上面这个文件中table中所有row所处在的页码索引。但是我发现第一页倒数两行都错位了。

请问这个情况如何解决呢?我的版本号是aspose java 24.1

@qhkyqhfe 通过这个简单的代码,我在 24.1 版中得到了正确的结果。

Document doc = new Document("input.docx");
LayoutCollector layoutCollector = new LayoutCollector(doc);
Table table = (Table) doc.getChild(NodeType.TABLE, 0,true);
for (Row row : table.getRows()) {
    int rowPageIndex = layoutCollector.getStartPageIndex(row);
    System.out.println("Page index: " + rowPageIndex + ", Row text: " + row.getText());
}
Page index: 1, Row text: (0.0000)(0.0556)(0.0000)(0.0558)
Page index: 1, Row text: Duality0.0002***0.4338***0.0002***0.4428***

能否提供您用于测试的代码,以帮助我们重现问题?

这是按照您的代码运行的日志输出:
log.pdf (23.6 KB)
可以看到和您的输出不一样

代码文件如下:
代码.pdf (12.7 KB)

@qhkyqhfe 我用 MacBook 仍然无法重现这个问题。以下是完整的输出结果:

(1) (2) (3) (4)  
Page index: 1, Row text:  OLS-1 OLS-2 OLS-3 OLS-4  
Page index: 1, Row text: 变量名 Strategy-express Strategy-behave Strategy-express Strategy-behave  
Page index: 1, Row text: Ins 0.0001*** 0.2100*** 0.0001*** 0.1440***  
Page index: 1, Row text:  (0.0000) (0.0728) (0.0000) (0.0755)  
Page index: 1, Row text: Ins×MI   0.0000** 0.1543***  
Page index: 1, Row text:    (0.0000) (0.0401)  
Page index: 1, Row text: MI   0.0000** -0.1505***  
Page index: 1, Row text:    (0.0000) (0.0294)  
Page index: 1, Row text: Size 0.0001*** 0.4187*** 0.0001*** 0.4231***  
Page index: 1, Row text:  (0.0000) (0.0244) (0.0000) (0.0244)  
Page index: 1, Row text: Age -0.0002*** -0.5792*** -0.0002*** -0.5568***  
Page index: 1, Row text:  (0.0000) (0.0895) (0.0000) (0.0897)  
Page index: 1, Row text: Soe -0.0002*** -0.8921*** -0.0002*** -0.9105***  
Page index: 1, Row text:  (0.0000) (0.0556) (0.0000) (0.0558)  
Page index: 1, Row text: Duality 0.0002*** 0.4338*** 0.0002*** 0.4428***  
Page index: 2, Row text:  (0.0000) (0.0586) (0.0000) (0.0585)  
Page index: 2, Row text: Lev -0.0007*** -2.4121*** -0.0007*** -2.4044***  
Page index: 2, Row text:  (0.0001) (0.1593) (0.0001) (0.1592)  
Page index: 2, Row text: Roa 0.0014*** -5.2780* 0.0014*** -5.2373***  
Page index: 2, Row text:  (0.0002) (0.4191) (0.0002) (0.4185)  
Page index: 2, Row text: Growth -0.0000 2.0826*** -0.0000 2.0786***  
Page index: 2, Row text:  (0.0000) (0.0655) (0.0000) (0.0655)  
Page index: 2, Row text: Boardsize 0.0002*** -0.0936 0.0002*** -0.1164  
Page index: 2, Row text:  (0.0001) (0.1421) (0.0001) (0.1422)  
Page index: 2, Row text: Top5 0.0000*** 0.0047** 0.0000*** 0.0049**  
Page index: 2, Row text:  (0.0000) (0.0022) (0.0000) (0.0022)  
Page index: 2, Row text: Investor -0.0000*** -0.0127*** -0.0000*** -0.0129***  
Page index: 2, Row text:  (0.0000) (0.0016) (0.0000) (0.0016)  
Page index: 2, Row text: Indirector 0.0000*** -0.0007 0.0000*** -0.0012  
Page index: 2, Row text:  (0.0000) (0.0048) (0.0000) (0.0048)  
Page index: 2, Row text: lawindex 0.0001*** -0.1287*** 0.0000*** -0.0549***  
Page index: 2, Row text:  (0.0000) (0.0101) (0.0000) (0.0184)  
Page index: 2, Row text: gdpgrowth -0.0000 -0.0088 -0.0000 -0.0108  
Page index: 2, Row text:  (0.0000) (0.0084) (0.0000) (0.0084)  
Page index: 2, Row text: 常数项 -0.0046*** 31.6457*** -0.0047*** 32.5000***  
Page index: 2, Row text:  (0.0003) (0.6735) (0.0003) (0.6908)  
Page index: 2, Row text: 年份固定效应 固定 固定 固定 固定  
Page index: 2, Row text: 行业固定效应 固定 固定 固定 固定  
Page index: 2, Row text: R2 0.4004 0.1595 0.4006 0.1607  
Page index: 2, Row text: 观测值 25172 25172 25172 25172

出现这个问题的原因可能是文档中使用的字体在您处理文档的环境中不可用。
MS Word 文档是流程文档,不包含任何文档布局信息。MS Word 或 Open Office 等消费者应用程序会在运行中构建文档布局。Aspose.Words 在将文档渲染为固定页面格式(PDF、XPS、图像等)时,会使用自己的布局引擎来构建文档布局。同样的布局引擎还用于通过 LayoutCollector 和 LayoutEnumerator 类提供文档布局信息。
要建立正确的文档布局,需要原始文档中使用的字体。如果 Aspose.Words 无法找到文档中使用的字体,则会使用替代字体。这可能会导致布局差异(LayoutCollector 返回的页码不正确),因为替换字体可能具有不同的字体度量。您可以实现 IWarningCallback,以便在执行字体替换时获得通知。

shikaijiedeMacBook-Pro:word-formatter shikaijie$ /usr/bin/env /Users/shikaijie/Library/Java/JavaVirtualMachines/corretto-17.0.10/Contents/Home/bin/java @/var/folders/xv/ht70fjjd21nf3xc23vbc5f8w0000gn/T/cp_dne2a0m6c8rdppn9uy0vc6ewo.argfile com.crane.wordformat.test
(1)(2)(3)(4)2, Row text:
Page index: 2, Row text: OLS-1OLS-2OLS-3OLS-4
Page index: 2, Row text: 变量名Strategy-expressStrategy-behaveStrategy-expressStrategy-behave
Page index: 2, Row text: Ins0.00010.21000.00010.1440
Page index: 2, Row text: (0.0000)(0.0728)(0.0000)(0.0755)
Page index: 2, Row text: Ins×MI0.00000.1543*
Page index: 2, Row text: (0.0000)(0.0401)
Page index: 2, Row text: MI0.0000**-0.1505***
Page index: 2, Row text: (0.0000)(0.0294)
Page index: 2, Row text: Size0.00010.41870.00010.4231
Page index: 2, Row text: (0.0000)(0.0244)(0.0000)(0.0244)
Page index: 2, Row text: Age-0.0002***-0.5792***-0.0002***-0.5568***
Page index: 2, Row text: (0.0000)(0.0895)(0.0000)(0.0897)
Page index: 2, Row text: Soe-0.0002***-0.8921***-0.0002***-0.9105***
Page index: 2, Row text: (0.0000)(0.0556)(0.0000)(0.0558)
Page index: 2, Row text: Duality0.00020.43380.00020.4428
Page index: 2, Row text: (0.0000)(0.0586)(0.0000)(0.0585)
Page index: 2, Row text: Lev-0.0007***-2.4121***-0.0007***-2.4044***
Page index: 2, Row text: (0.0001)(0.1593)(0.0001)(0.1592)
Page index: 2, Row text: Roa0.0014***-5.27800.0014**-5.2373***

这是在我mac上的输出。全部的index都是2。确实是有问题的

package com.crane.wordformat;

import com.aspose.words.Document;
import com.aspose.words.FontSettings;
import com.aspose.words.FontSourceBase;
import com.aspose.words.IWarningCallback;
import com.aspose.words.LayoutCollector;
import com.aspose.words.NodeType;
import com.aspose.*;
import com.aspose.words.Table;
import com.aspose.words.WarningInfo;
import com.aspose.words.WarningInfoCollection;
import com.aspose.words.WarningType;
import com.aspose.words.Row;
import com.aspose.words.DocumentBuilder;
public class test {

    public static void main(String[] args) throws Exception {
        Document doc = new Document("/Users/shikaijie/Desktop/test续表.docx");
        LayoutCollector layoutCollector = new LayoutCollector(doc);
        Table table = (Table) doc.getChild(NodeType.TABLE, 0,true);
        for (Row row : table.getRows()) {
            int rowPageIndex = layoutCollector.getStartPageIndex(row);
            System.out.println("Page index: " + rowPageIndex + ", Row text: " + row.getText());
        }
    }
}

这是源代码

在我这个测试文档里字体只有Times New Roman,宋体,黑体,mac上肯定都是有的。我感觉不是这个问题。应该是其他问题。我们两个人的电脑结果都是不对的

@qhkyqhfe 使用此代码并检查 pdf 输出,以显示您的桌子的位置。

LoadOptions options = new LoadOptions();
options.getLanguagePreferences().setDefaultEditingLanguage(EditingLanguage.CHINESE_PRC);
Document doc = new Document("input.docx", options);
doc.getLayoutOptions().setTextShaperFactory(HarfBuzzTextShaperFactory.getInstance());
doc.save("output.pdf");

您之前输出的问题已经重现:

Page index: 1, Row text: a(0.0000)a(0.0895)a(0.0000)a(0.0897)aa
Page index: 2, Row text: Soea-0.0002a-0.8921a-0.0002a-0.9105aa
Page index: 2, Row text: a(0.0000)a(0.0556)a(0.0000)a(0.0558)aa

看来您使用 Aspose.Words 时没有获得许可。在这种情况下,水印和文本被添加到文档中,导致输出出现问题。如果是这样,请设置许可证并再次检查结果。