从 Table 个目录中按章节拆分 PDF
Split PDF by chapters from Table Of Contents
我正在使用 GemBox.Pdf,我需要将 PDF 文件中的各个章节提取为单独的 PDF 文件。
第一页(也可能是第二页)包含目录(Table 的目录),我需要根据它拆分其余的 PDF 页面:
此外,那些被分割的 PDF 文档,应该按照它们包含的章节来命名。
我可以根据每个文档的页数拆分 PDF(我使用 this example 计算得出):
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");
}
}
}
但我无法弄清楚如何阅读和处理该目录并根据其项目合并章节拆分。
您应该遍历文档的书签 (outlines) 并根据书签目标页面拆分它。
例如,试试这个:
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");
我正在使用 GemBox.Pdf,我需要将 PDF 文件中的各个章节提取为单独的 PDF 文件。
第一页(也可能是第二页)包含目录(Table 的目录),我需要根据它拆分其余的 PDF 页面:
此外,那些被分割的 PDF 文档,应该按照它们包含的章节来命名。
我可以根据每个文档的页数拆分 PDF(我使用 this example 计算得出):
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");
}
}
}
但我无法弄清楚如何阅读和处理该目录并根据其项目合并章节拆分。
您应该遍历文档的书签 (outlines) 并根据书签目标页面拆分它。
例如,试试这个:
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");