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); } }
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); }
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); }