Aspose.Pdf支持按照书签来拆分PDF文档吗?

Aspose.Pdf支持按照书签来拆分PDF文档吗?比如有如下书签:

封面
第一章节
第二章节
第三章节

然后我希望拆分的pdf文件就是xxx_封面.pdf、xxx_第一章节.pdf等等。

如果可以实现的话,我应该用哪个内置方法呢?

@jidesheng

API 中没有直接或内置功能来根据书签分割 PDF 文件。但是,您可以尝试一种解决方法,读取所有书签,逐个提取页面信息,然后使用这些页面创建新的 PDF 文档。请检查以下示例代码片段来读取书签:

我昨天查看了这部分的文档,但是好像没办法根据书签拆分pdf,下面这是我想拆分的pdf,我尝试过使用pdffileeditor来根据每个书签页码计算前一页和下一个书签之间的页码范围来导出,但是结果都不对,比如我有一个书签页码是6,下一个页码是14,那么我应该导出6到13的页面,表示这是某个书签的页面范围。或者aspose中有更简单的办法吗?
例.pdf (1.1 MB)

@jidesheng

请允许我们准备代码片段并调查您的要求的可行性。我们会尽快给您回复。

你好,请问下这个有什么结果了么。

@jidesheng

很抱歉,由于队列中的其他问题,我们无法完成测试。我们现在正在检查,并将很快回复。

@jidesheng

请您检查随附的代码片段和拆分文档,并告诉我们这是否是您正在寻找的内容?

private static Aspose.Pdf.Facades.Bookmark GetNextBookmark(Aspose.Pdf.Facades.Bookmarks bookmarks, Aspose.Pdf.Facades.Bookmark currentBookmark)
{
    foreach (Aspose.Pdf.Facades.Bookmark bookmark in bookmarks)
    {
        if (bookmark == currentBookmark)
        {
            int currentIndex = bookmarks.IndexOf(bookmark);
            if (currentIndex < bookmarks.Count - 1)
            {
                return bookmarks[currentIndex + 1];
            }
        }
    }
    return null;
}

private static void SplitPDFOnBookmarks1(string dataDir)
{
    // Load PDF document
    Document pdfDocument = new Document(dataDir + "input.pdf");

    // Initialize bookmark editor
    Facades.PdfBookmarkEditor bookmarkEditor = new Facades.PdfBookmarkEditor();
    bookmarkEditor.BindPdf(pdfDocument);

    // Extract bookmarks
    Aspose.Pdf.Facades.Bookmarks bookmarks = bookmarkEditor.ExtractBookmarks();

    // Split PDF based on bookmarks
    int startPage = 1;
    foreach (Aspose.Pdf.Facades.Bookmark bookmark in bookmarks)
    {
        int endPage = (GetNextBookmark(bookmarks, bookmark) != null) ? GetNextBookmark(bookmarks, bookmark).PageNumber - 1 : pdfDocument.Pages.Count;

        // Extract pages and save to a new PDF
        Document newPdf = new Document();
        for (int i = startPage; i <= endPage; i++)
        {
            newPdf.Pages.Add(pdfDocument.Pages[i]);
        }

        newPdf.Save($"{dataDir}output_{startPage}_to_{endPage}.pdf");

        // Update startPage for the next iteration
        startPage = endPage + 1;
    }
}

SplitOnBookmarks.zip (2.3 MB)

谢谢!很厉害,代码可以使用的,你们会考虑在将来的版本内置书签拆分功能吗?

@jidesheng

我们担心,由于 PDF 文档结构多种多样,实现这种内置功能并不实际。我们无法动态地实现这样的事情,因为书签可以有多种类型。总是有定制的机会,但我们很难维护这样的内置功能。

不过,关于书签提取,我们将来肯定会丰富API,使其能够更有效地处理书签提取,并提供更多可用于自定义的选项。