Split PDF into multiple PDFs using iTextsharp
Solution 1
You're looping through the pdf and creating a new document every time you advance a page. You'll need to keep track of your pages so that you perform split only every 50 pages. Personally I would put that in a separate method and call it from your loop. Something like this:
private void ExtractPages(string sourcePDFpath, string outputPDFpath, int startpage, int endpage)
{
PdfReader reader = null;
Document sourceDocument = null;
PdfCopy pdfCopyProvider = null;
PdfImportedPage importedPage = null;
reader = new PdfReader(sourcePDFpath);
sourceDocument = new Document(reader.GetPageSizeWithRotation(startpage));
pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream(outputPDFpath, System.IO.FileMode.Create));
sourceDocument.Open();
for (int i = startpage; i <= endpage; i++)
{
importedPage = pdfCopyProvider.GetImportedPage(reader, i);
pdfCopyProvider.AddPage(importedPage);
}
sourceDocument.Close();
reader.Close();
}
So in your original code loop through your pdf and every 50 pages call the above method. You'll just need to add variables in your block to keep track of the start/end pages.
Solution 2
this will be of use. very much matches your requirement
http://www.codeproject.com/Articles/559380/SplittingplusandplusMergingplusPdfplusFilesplusinp
Solution 3
Here is a shorter solution. Haven't tested which method has the better performance.
private void ExtractPages(string sourcePDFpath, string outputPDFpath, int startpage, int endpage)
{
var pdfReader = new PdfReader(sourcePDFpath);
try
{
pdfReader.SelectPages($"{startpage}-{endpage}");
using (var fs = new FileStream(outputPDFpath, FileMode.Create, FileAccess.Write))
{
PdfStamper stamper = null;
try
{
stamper = new PdfStamper(pdfReader, fs);
}
finally
{
stamper?.Close();
}
}
}
finally
{
pdfReader.Close();
}
}
Related videos on Youtube
Billy
Updated on July 09, 2022Comments
-
Billy almost 2 years
public int SplitAndSave(string inputPath, string outputPath) { FileInfo file = new FileInfo(inputPath); string name = file.Name.Substring(0, file.Name.LastIndexOf(".")); using (PdfReader reader = new PdfReader(inputPath)) { for (int pagenumber = 1; pagenumber <= reader.NumberOfPages; pagenumber++) { string filename = pagenumber.ToString() + ".pdf"; Document document = new Document(); PdfCopy copy = new PdfCopy(document, new FileStream(outputPath + "\\" + filename, FileMode.Create)); document.Open(); copy.AddPage(copy.GetImportedPage(reader, pagenumber)); document.Close(); } return reader.NumberOfPages; } }
I want to split the Pdf in to multiple PDFs with 50 pages interval.(Suppoose If there are 400 pages PDF, I want 8 pdfs). The above code is splitting every page into a pdf. Please help me...I'm using asp.net with iTextSharp.
-
Can Sahin about 9 yearsHint: If you only want a new document every 50 pages, why do you create a new document during every single loop iteration?
-
-
Billy over 10 yearsI've used the above codeproject code and I'm getting error :"Access to the path denied";
-
RohitWagh over 10 yearsthis means u do not have rights to write to the folder you are writing the pdf at.
-
mkl over 5 yearsThe most relevant advantage of your solution is that it keeps document level data (meta data, document level attachments,...), it being shorter merely is a nice side effect.
-
blaze_125 about 3 years@mkl I have found PDFCopy to be better at keeping XmpMetadata and everything else intact.
-
mkl about 3 years
PdfCopy
better thanPdfStamper
? That sounds implausible. Only possible in cases wherePdfCopy
by chance repairs some issue whilePdfStamper
keeps the issue as is. Unless i overlooked something... ;)