private void OnSplitPdfCmdExecute() { string destinationPath = string.Empty; PageRangeParser pageRangeParser = null; IsBusy = true; bool isValid = ViewIsValid(out pageRangeParser); if (isValid) { if (SaveType == SaveOptions.UseSourceFolder) { destinationPath = string.Format("{0}\\{1}", PdfFiles.First().Info.DirectoryName, BaseFileName); } else if (SaveType == SaveOptions.UseCustomFolder) { destinationPath = string.Format("{0}\\{1}", DestinationFolder, BaseFileName); } splitBackgroundWorker.RunWorkerAsync(new object[] { PdfFiles.First(), pageRangeParser, destinationPath, OverwriteFile }); } else { IsBusy = false; } }
public void TestPageRangeParser() { string pagesDisplay = "4:1–4:39"; string itemNumberOfPages = "39"; var parser = new PageRangeParser(pagesDisplay, itemNumberOfPages); bool resultA = false; Assert.IsTrue(resultA); }
private bool ViewIsValid(out PageRangeParser pageRangeParser) { bool isValid = false; string errorMsg = string.Empty; pageRangeParser = null; ClearViewErrors(); if (PdfFiles.Count == 0) { ProgressStatus = "Please select a PDF file to split using the + button or [ Ins ]."; } else if (PdfFiles.First().IsLocked) { ProgressStatus = "Please unlock the PDF file by clicking the lock button in the list or [ Ctrl+U ]."; } else { if (FileHelpers.FileNameIsValid(BaseFileName, out errorMsg) != Define.Success) { SetErrors("BaseFileName", new List <ValidationResult>() { new ValidationResult(false, errorMsg) }); } if (SaveType == SaveOptions.UseCustomFolder && FileHelpers.FolderIsValid(DestinationFolder, out errorMsg) != Define.Success) { SetErrors("DestinationFolder", new List <ValidationResult>() { new ValidationResult(false, errorMsg) }); } errorMsg = string.Empty; if (SplitMethod == DocSplitMethod.Interval) { if (string.IsNullOrEmpty(PageInterval)) { errorMsg = "Split page interval is required."; } else { pageRangeParser = new PageRangeParser(PdfFiles.First().Reader.NumberOfPages, int.Parse(PageInterval)); if (pageRangeParser.Validate() != Define.Success) { errorMsg = pageRangeParser.ErrorMsg; } } if (errorMsg != string.Empty) { SetErrors("PageInterval", new List <ValidationResult>() { new ValidationResult(false, errorMsg) }); } } else if (SplitMethod == DocSplitMethod.Range) { if (string.IsNullOrEmpty(PageRange)) { errorMsg = "Split page range is required."; } else { pageRangeParser = new PageRangeParser(PdfFiles.First().Reader.NumberOfPages, PageRange); if (pageRangeParser.Validate() != Define.Success) { errorMsg = pageRangeParser.ErrorMsg; } } if (errorMsg != string.Empty) { SetErrors("PageRange", new List <ValidationResult>() { new ValidationResult(false, errorMsg) }); } } isValid = !HasErrors; } return(isValid); }
private void SplitWorkerDoWork(object sender, DoWorkEventArgs e) { object[] args = (object[])e.Argument; PdfFile pdfFile = (PdfFile)args[0]; PageRangeParser pageRangeParser = (PageRangeParser)args[1]; string destinationPath = (string)args[2]; bool overwriteFile = (bool)args[3]; FileStream outFileStream = null; Document destinationDoc = null; PdfCopy pdfCopy = null; int skippedFiles = 0; string exportFileName = string.Empty; string errorMsg = string.Empty; int exportFileCnt = 0, totalNumberOPages = 0, pageCnt = 0; EasySplitAndMergePdf.Helper.PageRange[] pageRanges = null; if (pageRangeParser.TryParse(out pageRanges) != Define.Success) { errorMsg = "An error occurred while parsing PDF page ranges" + pageRangeParser.ErrorMsg; } else if ((totalNumberOPages = pageRanges.Sum(range => range.PageCount)) < 1) { errorMsg = "The number of PDF pages to extract from source file is zero."; } else { pdfFile.Reader.RemoveUnusedObjects(); while (exportFileCnt < pageRanges.Length && !splitBackgroundWorker.CancellationPending) { exportFileName = destinationPath + (exportFileCnt + 1).ToString("D4") + ".pdf"; if (FileHelpers.FileIsAvailable(exportFileName, overwriteFile, out outFileStream, out errorMsg) == Define.Success) { destinationDoc = new Document(); pdfCopy = new PdfCopy(destinationDoc, outFileStream); destinationDoc.Open(); splitBackgroundWorker.ReportProgress(pageCnt * 100 / totalNumberOPages, string.Format("Creating and processing PDF file: {0}", exportFileName)); if (pageRanges[exportFileCnt].Pages != null) { int pageArrayIndex = 0; while (pageArrayIndex < pageRanges[exportFileCnt].Pages.Length && !splitBackgroundWorker.CancellationPending) { destinationDoc.SetPageSize(pdfFile.Reader.GetPageSizeWithRotation(pageRanges[exportFileCnt].Pages[pageArrayIndex])); destinationDoc.NewPage(); pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfFile.Reader, pageRanges[exportFileCnt].Pages[pageArrayIndex])); splitBackgroundWorker.ReportProgress(++pageCnt * 100 / totalNumberOPages); pageArrayIndex++; } } else if (pageRanges[exportFileCnt].PageFrom <= pageRanges[exportFileCnt].PageTo) { int pageNumber = pageRanges[exportFileCnt].PageFrom; while (pageNumber <= pageRanges[exportFileCnt].PageTo && !splitBackgroundWorker.CancellationPending) { destinationDoc.SetPageSize(pdfFile.Reader.GetPageSizeWithRotation(pageNumber)); destinationDoc.NewPage(); pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfFile.Reader, pageNumber)); splitBackgroundWorker.ReportProgress(++pageCnt * 100 / totalNumberOPages); pageNumber++; } } else if (pageRanges[exportFileCnt].PageFrom > pageRanges[exportFileCnt].PageTo) { int pageNumber = pageRanges[exportFileCnt].PageFrom; while (pageNumber >= pageRanges[exportFileCnt].PageTo && !splitBackgroundWorker.CancellationPending) { destinationDoc.SetPageSize(pdfFile.Reader.GetPageSizeWithRotation(pageNumber)); destinationDoc.NewPage(); pdfCopy.AddPage(pdfCopy.GetImportedPage(pdfFile.Reader, pageNumber)); splitBackgroundWorker.ReportProgress(++pageCnt * 100 / totalNumberOPages); pageNumber--; } } //Exception on document.Close() when doc is empty //if (pages.Count == 0) { throw new IOException("The document has no pages.") }; //When canceling pages.Count could be zero therefore skip cleanup. if (destinationDoc != null && !splitBackgroundWorker.CancellationPending) { destinationDoc.Close(); destinationDoc.Dispose(); destinationDoc = null; } if (pdfCopy != null && !splitBackgroundWorker.CancellationPending) { pdfCopy.Close(); pdfCopy.Dispose(); pdfCopy = null; } if (outFileStream != null) { outFileStream.Close(); outFileStream.Dispose(); outFileStream = null; } } else { skippedFiles++; Debug.WriteLine(string.Format("File: {0}, error: {1}", exportFileName, errorMsg)); } exportFileCnt++; } } if (string.IsNullOrEmpty(errorMsg) && exportFileCnt == pageRanges.Length && skippedFiles == 0) { errorMsg = string.Format("Successfully created {0} PDF export files.", pageRanges.Length); } else if (skippedFiles > 0) { errorMsg = string.Format("Created {0} PDF export files, skipped {1} PDF files.", pageRanges.Length - skippedFiles, skippedFiles); } if (splitBackgroundWorker.CancellationPending) { e.Cancel = true; } e.Result = errorMsg; }