Word目录页码问题

问题:Word生成的目录不对,不能和PDF文件的目录对应,PDF的目录是正确地。请帮忙看看是什么原因,谢谢。
生成目录的核心代码如下:

string desPath = Path.Combine(reportDesPath, fileName);
Aspose.Words.Document doc = new Aspose.Words.Document(desPath);
doc.UpdateFields();
doc.UpdatePageLayout();
LayoutCollector layoutCollector = new LayoutCollector(doc);//建立布局收集器
List<BookMarkInfo> bookMarkInfos = new List<BookMarkInfo>();
foreach (Field field in doc.Range.Fields)
{
    if (field.Type == FieldType.FieldTOC)
    {
        FieldToc toc = (FieldToc)field;
        toc.UpdatePageNumbers(); //定位toc只更新页码
        toc.Update();
        string name = toc.BookmarkName;
    }
    if (field.Type.Equals(Aspose.Words.Fields.FieldType.FieldHyperlink))
    {
        FieldHyperlink hyperlink = (FieldHyperlink)field;
        if (hyperlink.SubAddress != null && hyperlink.SubAddress.StartsWith("_Toc"))
        {
            Paragraph tocItem = (Paragraph)field.Start.GetAncestor(NodeType.Paragraph);
            string paragraphName = tocItem.ToString(SaveFormat.Text).Trim();
            if (tocItem != null)
            {
                if (tocItem.ParagraphFormat.StyleIdentifier == Aspose.Words.StyleIdentifier.Toc2)
                {
                    Bookmark bookmarkLayout = doc.Range.Bookmarks[hyperlink.SubAddress];
                    if (bookmarkLayout != null)
                    {
                        int pageIndex = layoutCollector.GetStartPageIndex(bookmarkLayout.BookmarkStart);
                        bookMarkInfos.Add(new BookMarkInfo() { PageIndex = pageIndex, BookMarkName = paragraphName });
                    }
                }
            }

        }
    }
}

Word转PDF代码如下:

FontSettings fontSettings = new FontSettings();
fontSettings.SetFontsFolder("C:\\Windows\\Fonts", true);
LoadOptions loadOptions = new LoadOptions();
var doc = new Aspose.Words.Document(wordFilePath);
var pdfPath = wordFilePath.Replace(".docx", ".pdf");
PdfSaveOptions saveOptions = new PdfSaveOptions();
saveOptions.PageMode = PdfPageMode.UseOutlines;
saveOptions.OutlineOptions.HeadingsOutlineLevels = 2;
doc.Save(pdfPath, saveOptions);

@Angela_xu

你好!关于你提到的Word生成的目录页码与PDF不一致的问题,这可能是由于在更新目录时没有正确处理书签或字段的原因。以下是一些解决步骤:

  1. 确保更新所有字段:在生成目录之前,确保调用doc.UpdateFields()doc.UpdatePageLayout(),这将确保所有字段和布局都被更新。

  2. 检查书签:确保在Word文档中,所有需要在目录中显示的内容都有相应的书签,并且这些书签在PDF生成时能够正确识别。

  3. 更新目录页码:在更新目录的代码中,确保调用toc.UpdatePageNumbers()toc.Update(),以确保目录中的页码是最新的。

  4. 调试输出:在更新目录后,输出每个目录项的页码,检查是否与PDF中的页码一致。

以下是一个简化的代码示例,展示如何更新目录和页码:

string desPath = Path.Combine(reportDesPath, fileName);
Aspose.Words.Document doc = new Aspose.Words.Document(desPath);
doc.UpdateFields();
doc.UpdatePageLayout();

foreach (Field field in doc.Range.Fields)
{
    if (field.Type == FieldType.FieldTOC)
    {
        FieldToc toc = (FieldToc)field;
        toc.UpdatePageNumbers();
        toc.Update();
    }
}

doc.Save(pdfPath, saveOptions);

请确保在生成PDF之前,所有的更新都已完成。如果问题仍然存在,请检查Word文档的结构或字段设置,并考虑重新生成目录。希望这些建议能帮助你解决问题!如果还有其他疑问,请随时告诉我!

@Angela_xu 出现问题的原因可能是处理文档的机器上没有输入文档中使用的字体。这些字体是构建文档布局所必需的。如果 Aspose.Words 无法找到文档中使用的字体,则会使用字体替换。由于字体度量标准不同,这可能会导致字体不匹配和文档布局差异,从而导致页面检测错误。您可以实现 IWarningCallback 以在执行字体替换时获取通知。
请参阅我们的文档,了解 Aspose.Words 在何处查找字体:

此外,如果您使用了 LayoutCollector ,请确保您使用正确。如果只需要更新页码,只需使用 doc.UpdateFields();,无需任何其他代码。如果您在使用 LayoutCollector 后对内容进行了操作,则需要在每次更改后使用以下代码:

layoutCollector.Clear();
doc.UpdatePageLayout();

如果问题仍然存在,请在此提供输入和输出文件。我们将进行调查并提供更多结果。