ABCPDF: Split PDF files into single page PDF files

2019-05-07 18:03发布

I am using ABCpdf tool and I am trying to split 1TB of PDF files (so efficiency is a concern) into single page PDF files.

I have tried the following:

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();

This one is very fast BUT it does not keep the rotated pages and they NEED to be. I tried to rotate them manually but this very quickly got a bit messy and they did not come out the precise way as they were in the original document.

I have also tried:

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();

This one is about 6 times slower(on large documents) than the first one BUT it keeps the formatting of the rotated pages and that is important. The problem with this one is that I have to append the whole document and remove all the unwanted pages again. This is done for all pages in the file which is very inefficient.

Can anybody help me on this matter?

标签: c# abcpdf
2条回答
在下西门庆
2楼-- · 2019-05-07 18:49

There is an updated solution for this, (latest version of > ABCpdf 9.0) this is an efficient and faster way of doing.

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

Pass arguments of type int[] pages or a string comma or space separated page numbers that you want to split to REMAPPAGES method (above code sb is stringbuilder) and save.

查看更多
成全新的幸福
3楼-- · 2019-05-07 18:56

So I talked to the support at WebSuperGoo (The creators of ABCpdf) and they gave me the following:

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();

This solution is equal to my first solution but it incorporates the page rotation and is very fast.

I hope this can help others as well.

查看更多
登录 后发表回答