Exemplo n.º 1
0
        public static bool CombineCoverAndInsideCover(List <CockleFilePdf> files, string src)
        {
            try
            {
                using (var stream = new System.IO.FileStream(src, System.IO.FileMode.Create))
                {
                    // initiate iTextSharp processes
                    iTextSharp.text.Document    pdfdoc  = new iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER);
                    iTextSharp.text.pdf.PdfCopy pdfcopy = new iTextSharp.text.pdf.PdfCopy(pdfdoc, stream);
                    pdfdoc.Open();

                    // merge pdfs in folder
                    CockleFilePdf f;
                    for (int i = 0; i < files.Count; i++)
                    {
                        f = files[i];
                        // read file
                        iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(f.FullName);
                        int filePageCount = reader.NumberOfPages;
                        pdfcopy.AddDocument(new iTextSharp.text.pdf.PdfReader(reader));
                    }
                    pdfcopy.Close();
                    pdfdoc.CloseDocument();
                }
                return(true);
            }
            catch (Exception excpt) { System.Diagnostics.Debug.WriteLine(excpt); return(false); }
        }
Exemplo n.º 2
0
        private void SaveFile(int desde)
        {
            if (CDPSession.Current.File == null)
            {
                return;
            }

            var pageCount   = GetPageCount();
            var currentPage = 1;

            CDPSession.Current.File.InputStream.Position = 0;

            using (var ms = new MemoryStream())
            {
                CDPSession.Current.File.InputStream.CopyTo(ms);
                var reader = new iTextSharp.text.pdf.PdfReader(ms.ToArray());

                for (var i = 1; i <= pageCount; i++)
                {
                    var newFile = string.Format("{0}{1}.pdf", _folder, desde);
                    var doc     = new iTextSharp.text.Document(reader.GetPageSizeWithRotation(currentPage));
                    var pdfCpy  = new iTextSharp.text.pdf.PdfCopy(doc, new System.IO.FileStream(newFile, System.IO.FileMode.Create));

                    doc.Open();
                    for (var j = 1; j <= 4; j++)
                    {
                        iTextSharp.text.pdf.PdfImportedPage page = pdfCpy.GetImportedPage(reader, currentPage);
                        //pdfCpy.SetFullCompression();
                        pdfCpy.AddPage(page);
                        currentPage += 1;
                    }

                    desde++;
                    doc.Close();
                    pdfCpy.Close();
                }

                reader.Close();
            }
        }
        public string ReorderBookmarks()
        {
            string result = "";

            iTextSharp.text.pdf.PdfReader reader;
            string tempSavePath;

            System.IO.FileStream                 fs;
            iTextSharp.text.Document             document;
            iTextSharp.text.pdf.PdfCopy          copier;
            IList <Dictionary <string, object> > bookmarkList;
            Bookmark firstBookmark;
            SortedList <long, Bookmark> byStartPages;
            SortedList <long, Bookmark> byIndexNumbers;
            Bookmark thisBookmark;
            Bookmark previousBookmark;
            long     totalPages;
            long     currentPages;
            IList <Dictionary <string, object> > newBookmarkList;

            // check to see if file is open by another process
            string quickCheck = System.IO.Path.GetDirectoryName(path) + "\\~" + System.IO.Path.GetFileNameWithoutExtension(path) + System.IO.Path.GetExtension(path);
            long   safeNumber = 1;

            while (System.IO.File.Exists(quickCheck))
            {
                quickCheck  = System.IO.Path.GetDirectoryName(path) + "\\~" + System.IO.Path.GetFileNameWithoutExtension(path) + "(" + safeNumber + ")" + System.IO.Path.GetExtension(path);
                safeNumber += 1;
            }
            bool isSafe = false;

            while (!isSafe)
            {
                try
                {
                    System.IO.File.Move(path, quickCheck);
                    System.IO.File.Move(quickCheck, path);
                    isSafe = true;
                }
                catch
                {
                    System.Windows.Forms.MessageBoxButtons buttons    = System.Windows.Forms.MessageBoxButtons.OKCancel;
                    System.Windows.Forms.DialogResult      diagResult = System.Windows.Forms.MessageBox.Show(path + " is being used by another process. Please close that process and click Ok.", "File in Use", buttons);
                    if (diagResult == System.Windows.Forms.DialogResult.Cancel)
                    {
                        result = "File in use.";
                        return(result);
                    }
                }
            }

            // initalizing reader
            reader       = new iTextSharp.text.pdf.PdfReader(path);
            bookmarkList = iTextSharp.text.pdf.SimpleBookmark.GetBookmark(reader);
            totalPages   = reader.NumberOfPages;

            // empty bookmark list
            if (bookmarkList == null)
            {
                reader.Close();
                System.Windows.Forms.MessageBox.Show("No bookmarks detected.");
                result = "Error";
                return(result);
            }

            // get all bookmarks and add them to a list sorted by start pages and another list sorted by index numbers
            byStartPages   = new SortedList <long, Bookmark>();
            byIndexNumbers = new SortedList <long, Bookmark>();
            long index = 0;

            AddBookmarkToSortedLists(bookmarkList, byStartPages, byIndexNumbers, index);

            // get end pages
            previousBookmark = null;
            foreach (KeyValuePair <long, Bookmark> element in byStartPages)
            {
                if (previousBookmark == null)
                {
                    previousBookmark = element.Value;
                }
                else
                {
                    previousBookmark.SetEndPage(element.Key - 1);
                    previousBookmark = element.Value;
                }
                element.Value.SetPriority(GetPriorityFromList(priorityList, element.Value.GetName()));
            }
            previousBookmark.SetEndPage(totalPages);

            // sort bookmarks by priority or sort by index
            if (prioritizeBookmarks)
            {
                firstBookmark = ReorderNodesByPriority(byIndexNumbers);
            }
            else
            {
                firstBookmark = ReorderNodesByIndex(byIndexNumbers);
            }

            // create a new pdf document
            newBookmarkList = new List <Dictionary <string, object> >();
            tempSavePath    = System.IO.Path.GetDirectoryName(path) + "\\" + System.IO.Path.GetFileNameWithoutExtension(path) + " - Sorted.pdf";
            long saveCount = 0;

            while (System.IO.File.Exists(tempSavePath))
            {
                saveCount++;
                tempSavePath = System.IO.Path.GetDirectoryName(path) + "\\" + System.IO.Path.GetFileNameWithoutExtension(path) + " - Sorted(" + saveCount + ").pdf";
            }
            fs       = new System.IO.FileStream(tempSavePath, System.IO.FileMode.Create);
            document = new iTextSharp.text.Document();
            copier   = new iTextSharp.text.pdf.PdfCopy(document, fs);
            document.Open();
            thisBookmark = firstBookmark;
            currentPages = 0;
            long firstBookmarkedPage = byStartPages.ElementAt(0).Key;

            if (firstBookmarkedPage > 1)
            {
                for (int i = 1; i < firstBookmarkedPage; i++)
                {
                    copier.AddPage(copier.GetImportedPage(reader, i));
                    currentPages++;
                }
            }
            while (thisBookmark != null)
            {
                int startPage = (int)thisBookmark.GetStartPage();
                int endPage   = (int)thisBookmark.GetEndPage();
                for (int i = startPage; i <= endPage; i++)
                {
                    copier.AddPage(copier.GetImportedPage(reader, i));
                }
                if (startPage != currentPages + 1)
                {
                    thisBookmark.ChangePage(currentPages + 1);
                }
                currentPages += (endPage - startPage) + 1;
                newBookmarkList.Add(thisBookmark.GetDictionary());
                thisBookmark = thisBookmark.GetNextNode();
            }
            copier.Outlines = newBookmarkList;
            copier.Close();
            document.Close();
            fs.Close();
            reader.Close();

            reader = new iTextSharp.text.pdf.PdfReader(path);
            IList <Dictionary <string, object> > currentBookmarkList = iTextSharp.text.pdf.SimpleBookmark.GetBookmark(reader);

            reader.Close();

            // delete original and rename sorted file to original name
            if (totalPages != currentPages)
            {
                result = "The number of pages in the new document(s) does not match the number of pages in the old document. Aborting overwrite.";
                return(result);
            }
            if (bookmarkList.Count != currentBookmarkList.Count)
            {
                result = "Bookmark count of original file does not match bookmark count of file being replaced. Aborting overwrite.";
                return(result);
            }
            try
            {
                System.IO.File.Delete(path);
                System.IO.File.Move(tempSavePath, path);
            }
            catch
            {
                result = "Could not overwrite. Sorted bookmarks saved as " + tempSavePath;
            }

            return(result);
        }
Exemplo n.º 4
0
        public static bool CombineBriefPages_AddingBlanks(
            List <CockleFilePdf> srcFiles, string src, TypeOfBindEnum bind)
        {
            // new attempt Dec 28, to account for divider pages (or any page without text)
            // text has to start on odd-numbered page, if followed by divider page

            // first, add 2 pages for each divider page, to account for front and back.
            // then, when everything is together, cycle through doc to add extra dividers...
            // ... so that text always falls on odd-numbered page


            // should work for both Saddle Stitch and Perfect Bind


            // create new list without cover, ordered by rank
            List <CockleFilePdf> files = new List <CockleFilePdf>(
                srcFiles
                .Where(f => f.FileType != SourceFileTypeEnum.Cover)
                .Where(f => f.FileType != SourceFileTypeEnum.InsideCv)
                .Where(f => f.FileType != SourceFileTypeEnum.SidewaysPage)
                .Where(f => f.FileType != SourceFileTypeEnum.Brief_Foldout)
                .Where(f => f.FileType != SourceFileTypeEnum.Brief_ZFold)
                .Where(f => f.FileType != SourceFileTypeEnum.App_Foldout)
                .Where(f => f.FileType != SourceFileTypeEnum.App_ZFold)
                .Where(f => f.FileType != SourceFileTypeEnum.Unrecognized)
                .OrderBy(f => f.Rank));

            if (files.Count < 1)
            {
                return(false);
            }

            // what if files.Count == 1 ??? just return ???

            int  pageCount         = 0;
            bool hasDividers       = false;
            bool firstAppFileFound = false;
            int  firstPageOfApp    = -1;

            try
            {
                using (var stream = new System.IO.FileStream(src, System.IO.FileMode.Create))
                {
                    // initiate iTextSharp processes
                    iTextSharp.text.Document    pdfdoc  = new iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER);
                    iTextSharp.text.pdf.PdfCopy pdfcopy = new iTextSharp.text.pdf.PdfCopy(pdfdoc, stream);
                    pdfdoc.Open();

                    // merge pdfs in folder
                    CockleFilePdf f;
                    for (int i = 0; i < files.Count; i++)
                    {
                        f = files[i];
                        // read file
                        iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(f.FullName);
                        int filePageCount = reader.NumberOfPages;

                        // set up pdfstamper
                        iTextSharp.text.pdf.PdfStamper stamper = new iTextSharp.text.pdf.PdfStamper(reader, stream);

                        // look for divider pages here, add blank if exists
                        List <int> divider_pages = new List <int>();
                        iTextSharp.text.pdf.parser.PdfReaderContentParser parser = new iTextSharp.text.pdf.parser.PdfReaderContentParser(reader);
                        for (int j = 1; j <= reader.NumberOfPages; j++)
                        {
                            iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy extract = new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy();
                            var    extractedText = parser.ProcessContent(j, extract);
                            string textFromPage  = extractedText.GetResultantText();

                            int cnt     = textFromPage.ToCharArray().Count();
                            int mch_cnt = System.Text.RegularExpressions.Regex.Matches(textFromPage, @"A(PPENDIX|ppendix)").Count;

                            if (System.Text.RegularExpressions.Regex.Matches(textFromPage, @"\S").Count == 0)
                            {
                                // collect blank pages
                                divider_pages.Add(j);
                            }
                            else if (cnt < 50 && mch_cnt > 0)
                            {
                                // collect other divider pages
                                divider_pages.Add(j);
                            }
                        }
                        if (divider_pages.Count > 0)
                        {
                            hasDividers = true;

                            int k = 0; // adjust for total page number change
                            foreach (int page in divider_pages)
                            {
                                stamper.InsertPage(page + k, reader.GetPageSizeWithRotation(1));
                                filePageCount = reader.NumberOfPages;
                                k++;
                            }
                        }

                        // add blank page if needed to make even number
                        if (files[i].FileType == SourceFileTypeEnum.Index ||
                            files[i].FileType == SourceFileTypeEnum.Brief ||
                            files[i].FileType == SourceFileTypeEnum.App_Index ||
                            files[i].FileType == SourceFileTypeEnum.Motion ||
                            files[i].FileType == SourceFileTypeEnum.Divider_Page)
                        {
                            f.AssignNeedsBlankPage(files, reader.NumberOfPages);
                            if (f.NeedsBlankPage)
                            {
                                //PdfStamper stamper2 = new PdfStamper(reader, stream);
                                stamper.InsertPage(reader.NumberOfPages + 1, reader.GetPageSizeWithRotation(1));
                                filePageCount = reader.NumberOfPages;
                            }
                        }

                        // with last document in 'files', add extra pages to make divisible by 4
                        if (bind == TypeOfBindEnum.SaddleStitch && i == files.Count - 1)
                        {
                            if (bind == TypeOfBindEnum.SaddleStitch &&
                                (pageCount + reader.NumberOfPages) % 4 != 0)
                            {
                                //PdfStamper stamper3 = new PdfStamper(reader, stream);
                                while ((pageCount + reader.NumberOfPages) % 4 != 0)
                                {
                                    stamper.InsertPage(reader.NumberOfPages + 1, reader.GetPageSizeWithRotation(1));
                                }
                            }
                        }

                        // get first page of first app file
                        if (!firstAppFileFound && files[i].FileType == SourceFileTypeEnum.App_File)
                        {
                            firstAppFileFound = true;
                            firstPageOfApp    = pageCount + 1;
                        }

                        // add document to 'src'
                        pdfcopy.AddDocument(new iTextSharp.text.pdf.PdfReader(reader));
                        pageCount += reader.NumberOfPages;
                    }

                    pdfcopy.Close();
                    pdfdoc.CloseDocument();
                }

                // final cycle, if dividers, to make sure text starts on odd-sided pages
                if (bind == TypeOfBindEnum.PerfectBind && hasDividers)
                {
                    string dest = (System.IO.Path.GetDirectoryName(src) + @"\temp " + DateTime.Now.ToString("ddMMyyyyhhmmssffff"));

                    using (var stream = new System.IO.FileStream(dest, System.IO.FileMode.Create))
                    {
                        iTextSharp.text.pdf.PdfReader  reader  = new iTextSharp.text.pdf.PdfReader(src);
                        iTextSharp.text.pdf.PdfStamper stamper = new iTextSharp.text.pdf.PdfStamper(reader, stream);

                        // get all blank pages in appendix
                        iTextSharp.text.pdf.parser.PdfReaderContentParser parser = new iTextSharp.text.pdf.parser.PdfReaderContentParser(reader);
                        List <List <int> > groupsOfBlanks = new List <List <int> >();
                        List <int>         group_list     = new List <int>();
                        int x;
                        for (x = firstPageOfApp; x <= reader.NumberOfPages; x++)
                        {
                            iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy extract = new iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy();
                            var    extractedText = parser.ProcessContent(x, extract);
                            string textFromPage  = extractedText.GetResultantText();
                            // find blank pages and cluster into group_list
                            if (System.Text.RegularExpressions.Regex.Matches(textFromPage, @"\S").Count == 0)
                            {
                                // capture blank page cluster (??? but what if only 1 page ???)
                                if (group_list.Count == 0 || group_list.Contains(x - 1))
                                {
                                    group_list.Add(x);
                                }
                            }
                            else
                            {
                                // find first page after cluster
                                if (group_list.Count > 0)
                                {
                                    if (group_list.Last() % 2 == 1)
                                    {
                                        // add blank page
                                        stamper.InsertPage(group_list.Last() + 1, reader.GetPageSizeWithRotation(1));
                                    }
                                }
                                // clear list
                                group_list.Clear();
                            }
                        }
                        stamper.Close();
                        reader.Close();
                    }
                    System.IO.File.Delete(src);
                    System.IO.File.Move(dest, src);
                }
            }
            catch (Exception excpt)
            {
                System.Diagnostics.Debug.WriteLine(excpt); return(false);
            }
            return(true);
        }