Ejemplo n.º 1
0
        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;
            }
        }
Ejemplo n.º 2
0
        public void TestPageRangeParser()
        {
            string pagesDisplay      = "4:1–4:39";
            string itemNumberOfPages = "39";
            var    parser            = new PageRangeParser(pagesDisplay, itemNumberOfPages);
            bool   resultA           = false;

            Assert.IsTrue(resultA);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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;
        }