4

我正在使用 ABCpdf 工具,我正在尝试将 1TB 的 PDF 文件(因此效率是一个问题)拆分为单页 PDF 文件。

我尝试了以下方法:

Doc theSrc = new Doc();
theSrc.Read("C://development//pdfSplitter//Bxdfbc91ca-fc05-4315-8c40-798a77431ee0xP.pdf");

for (int i = 1; i <= theSrc.PageCount; i++)
{   
    Doc singlePagePdf = new Doc();
    singlePagePdf.Rect.String = singlePagePdf.MediaBox.String = theSrc.MediaBox.String;
    singlePagePdf.AddPage();
    singlePagePdf.AddImageDoc(theSrc, i, null);
    singlePagePdf.FrameRect();
    singlePagePdf.Save("C://development//pdfSplitter//singlePDF//singlePage"+i+".pdf");
    singlePagePdf.Clear();
}
theSrc.Clear();

这个速度非常快,但它不会保留旋转的页面,它们需要保留。我尝试手动旋转它们,但这很快就变得有点混乱,并且它们并没有像原始文档中那样以精确的方式出现。

我也试过:

Doc theSrc = new Doc();
theSrc.Read("C://development//pdfSplitter//Bxdfbc91ca-fc05-4315-8c40-798a77431ee0xP.pdf");
for (int i = 1; i <= theSrc.PageCount; i++)
{  
    Doc singlePagePdf = new Doc();
    singlePagePdf.Append(theSrc);
    singlePagePdf.RemapPages(i.ToString());
    singlePagePdf.Save("C://development//pdfSplitter//singlePDF//singlePage"+i+".pdf");
    singlePagePdf.Clear();
}
theSrc.Clear();

这个比第一个慢(在大文档上)大约 6 倍,但它保持旋转页面的格式,这很重要。这个问题是我必须附加整个文档并再次删除所有不需要的页面。这是对文件中的所有页面执行的,效率非常低。

有人可以帮我解决这个问题吗?

4

2 回答 2

9

因此,我与 WebSuperGoo(ABCpdf 的创建者)的支持人员进行了交谈,他们给了我以下信息:

Doc theSrc = new Doc();
theSrc.Read("C://development//pdfSplitter//Bxdfbc91ca-fc05-4315-8c40-798a77431ee0xP.pdf");

int srcPagesID = theSrc.GetInfoInt(theSrc.Root, "Pages");
int srcDocRot = theSrc.GetInfoInt(srcPagesID, "/Rotate");

for (int i = 1; i <= theSrc.PageCount; i++)
{   
    Doc singlePagePdf = new Doc();
    singlePagePdf.Rect.String = singlePagePdf.MediaBox.String = theSrc.MediaBox.String;
    singlePagePdf.AddPage();
    singlePagePdf.AddImageDoc(theSrc, i, null);
    singlePagePdf.FrameRect();

    int srcPageRot = theSrc.GetInfoInt(theSrc.Page, "/Rotate");
    if (srcDocRot != 0)
    {
        singlePagePdf.SetInfo(singlePagePdf.Page, "/Rotate", srcDocRot);
    }
    if (srcPageRot != 0)
    {
        singlePagePdf.SetInfo(singlePagePdf.Page, "/Rotate", srcPageRot);
    }

    singlePagePdf.Save("C://development//pdfSplitter//singlePDF//singlePage"+i+".pdf");
    singlePagePdf.Clear();
}
theSrc.Clear();

此解决方案与我的第一个解决方案相同,但它结合了页面旋转并且非常快。

我希望这也可以帮助其他人。

于 2013-08-09T08:46:18.500 回答
8

有一个更新的解决方案,(最新版本> ABCpdf 9.0)这是一种有效且更快的方法。

 using (Doc copyDoc = new Doc())
      {
           copyDoc.Read(filePath);
           copyDoc.RemapPages(sb.ToString());
           copyDoc.Save(tagetFileName);
      }

将要拆分的 int[] pages 类型的参数或字符串逗号或空格分隔的页码传递给 REMAPPAGES 方法(上面的代码 sb 是 stringbuilder)并保存。

于 2014-01-09T00:21:40.233 回答