ABCPDF: Split PDF files into single page PDF files

2019-05-07 18:10发布

问题:

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?

回答1:

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.



回答2:

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.



标签: c# abcpdf