Разделить PDF по главам из оглавления - PullRequest
1 голос
/ 16 апреля 2020

Я использую GemBox.Pdf , и мне нужно извлечь отдельные главы в файле PDF в виде отдельных файлов PDF.

Первая страница (может быть, вторая страница также) содержит TO C (оглавление), и мне нужно разделить остальные страницы PDF на его основе:

PDF file with Chapters and Table Of Contents

Кроме того, те документы PDF, которые разделены, должны быть названным в качестве глав, которые они содержат.
Я могу разделить PDF на основе количества страниц для каждого документа (я понял это, используя этот пример ):

using (var source = PdfDocument.Load("Chapters.pdf"))
{
    int pagesPerSplit = 3;
    int count = source.Pages.Count;

    for (int index = 1; index < count; index += pagesPerSplit)
    {
        using (var destination = new PdfDocument())
        {
            for (int splitIndex = 0; splitIndex < pagesPerSplit; splitIndex++)
                destination.Pages.AddClone(source.Pages[index + splitIndex]);

            destination.Save("Chapter " + index + ".pdf");
        }
    }
}

Но я не могу понять, как читать и обрабатывать это ТО C и включать в него разделение на главы по его элементам.

1 Ответ

2 голосов
/ 16 апреля 2020

Вы должны выполнить итерацию по закладкам документа ( контуры ) и разбить его на основе целевых страниц закладок.

Например, попробуйте это:

using (var source = PdfDocument.Load("Chapters.pdf"))
{
    PdfOutlineCollection outlines = source.Outlines;

    PdfPages pages = source.Pages;
    Dictionary<PdfPage, int> pageIndexes = pages
        .Select((page, index) => new { page, index })
        .ToDictionary(item => item.page, item => item.index);

    for (int index = 0, count = outlines.Count; index < count; ++index)
    {
        PdfOutline outline = outlines[index];
        PdfOutline nextOutline = index + 1 < count ? outlines[index + 1] : null;

        int pageStartIndex = pageIndexes[outline.Destination.Page];
        int pageEndIndex = nextOutline != null ?
            pageIndexes[nextOutline.Destination.Page] :
            pages.Count;

        using (var destination = new PdfDocument())
        {
            while (pageStartIndex < pageEndIndex)
            {
                destination.Pages.AddClone(pages[pageStartIndex]);
                ++pageStartIndex;
            }

            destination.Save($"{outline.Title}.pdf");
        }
    }
}

Обратите внимание, что из скриншота видно, что закладки вашей главы содержат номер заказа (римские цифры). При необходимости вы можете легко удалить те с чем-то вроде этого:

destination.Save($"{outline.Title.Substring(outline.Title.IndexOf(' ') + 1)}.pdf");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...