protected void ManipulatePdf(String dest) { MemoryStream baos = new MemoryStream(); PdfDocument pdfDoc = new PdfDocument(new PdfWriter(baos)); Document doc = new Document(pdfDoc); // Copier contains the additional logic to copy acroform fields to a new page. // PdfPageFormCopier uses some caching logic which can potentially improve performance // in case of the reusing of the same instance. PdfPageFormCopier formCopier = new PdfPageFormCopier(); // Copy all merging file's pages to the temporary pdf file Dictionary <String, PdfDocument> filesToMerge = InitializeFilesToMerge(); Dictionary <int, String> toc = new Dictionary <int, String>(); int page = 1; foreach (KeyValuePair <String, PdfDocument> entry in filesToMerge) { PdfDocument srcDoc = entry.Value; int numberOfPages = srcDoc.GetNumberOfPages(); toc.Add(page, entry.Key); for (int i = 1; i <= numberOfPages; i++, page++) { Text text = new Text(String.Format("Page {0}", page)); srcDoc.CopyPagesTo(i, i, pdfDoc, formCopier); // Put the destination at the very first page of each merged document if (i == 1) { text.SetDestination("p" + page); PdfOutline rootOutLine = pdfDoc.GetOutlines(false); PdfOutline outline = rootOutLine.AddOutline("p" + page); outline.AddDestination(PdfDestination.MakeDestination(new PdfString("p" + page))); } doc.Add(new Paragraph(text) .SetFixedPosition(page, 549, 810, 40) .SetMargin(0) .SetMultipliedLeading(1)); } } PdfDocument tocDoc = new PdfDocument(new PdfReader(SRC3)); tocDoc.CopyPagesTo(1, 1, pdfDoc, formCopier); tocDoc.Close(); // Create a table of contents float tocYCoordinate = 750; float tocXCoordinate = doc.GetLeftMargin(); float tocWidth = pdfDoc.GetDefaultPageSize().GetWidth() - doc.GetLeftMargin() - doc.GetRightMargin(); foreach (KeyValuePair <int, String> entry in toc) { Paragraph p = new Paragraph(); p.AddTabStops(new TabStop(500, TabAlignment.LEFT, new DashedLine())); p.Add(entry.Value); p.Add(new Tab()); p.Add(entry.Key.ToString()); p.SetAction(PdfAction.CreateGoTo("p" + entry.Key)); doc.Add(p .SetFixedPosition(pdfDoc.GetNumberOfPages(), tocXCoordinate, tocYCoordinate, tocWidth) .SetMargin(0) .SetMultipliedLeading(1)); tocYCoordinate -= 20; } foreach (PdfDocument srcDocument in filesToMerge.Values) { srcDocument.Close(); } doc.Close(); PdfDocument resultDoc = new PdfDocument(new PdfWriter(dest)); PdfDocument srcPdfDoc = new PdfDocument(new PdfReader(new MemoryStream(baos.ToArray()), new ReaderProperties())); srcPdfDoc.InitializeOutlines(); // Create a copy order list and set the page with a table of contents as the first page int tocPageNumber = srcPdfDoc.GetNumberOfPages(); List <int> copyPagesOrderList = new List <int>(); copyPagesOrderList.Add(tocPageNumber); for (int i = 1; i < tocPageNumber; i++) { copyPagesOrderList.Add(i); } srcPdfDoc.CopyPagesTo(copyPagesOrderList, resultDoc, formCopier); srcPdfDoc.Close(); resultDoc.Close(); }
private static void MergePdfs(List <string> InFiles, string OutFile) { PdfDocument pdfDoc = new PdfDocument(new PdfWriter(OutFile)); pdfDoc.InitializeOutlines(); //PdfMerger merger = new PdfMerger(pdfDoc, false, false); PdfOutline rootOutline = pdfDoc.GetOutlines(true); string parentTitle = Path.GetFileNameWithoutExtension(OutFile); PdfOutline parent = rootOutline.AddOutline(parentTitle); //parent.AddAction(PdfAction.CreateGoTo( // PdfExplicitRemoteGoToDestination.CreateFit(1))); int pageNumber = 0; foreach (var srcFile in InFiles) { string title = Path.GetFileNameWithoutExtension(srcFile); PdfDocument firstSourcePdf = new PdfDocument(new PdfReader(srcFile)); int pageCount = firstSourcePdf.GetNumberOfPages(); for (int i = 1; i < pageCount + 1; i++) { var page = firstSourcePdf.GetPage(i); int pageRotate = page.GetRotation(); if (pageRotate != 0) { page.SetRotation(0); } PdfPage newPage = firstSourcePdf.GetPage(i).CopyTo(pdfDoc); pdfDoc.AddPage(newPage); } //merger.Merge(firstSourcePdf, 1, firstSourcePdf.GetNumberOfPages()); //firstSourcePdf.CopyPagesTo(1, firstSourcePdf.GetNumberOfPages(), pdfDoc); //int all = pdfDoc.GetNumberOfPages(); PdfExplicitDestination dd = PdfExplicitDestination.CreateFit(pdfDoc.GetPage(pageNumber + 1)); string tt = Guid.NewGuid().ToString(); pdfDoc.AddNamedDestination(tt, dd.GetPdfObject()); PdfOutline kid = parent.AddOutline(title); kid.AddAction(PdfAction.CreateGoTo(new PdfStringDestination(tt))); //kid.AddAction(PdfAction.CreateGoTo( //PdfExplicitRemoteGoToDestination.CreateFit(pageNumber))); var bb = parent.GetAllChildren(); pageNumber += pageCount; firstSourcePdf.Close(); if (pageCount % 2 == 1) { pdfDoc.AddNewPage(iTextPageSize.A4); pageNumber += 1; } } PdfExplicitDestination destToPage3 = PdfExplicitDestination.CreateFit(pdfDoc.GetFirstPage()); string stringDest = Guid.NewGuid().ToString(); pdfDoc.AddNamedDestination(stringDest, destToPage3.GetPdfObject()); parent.AddAction(PdfAction.CreateGoTo(new PdfStringDestination(stringDest))); if (pdfDoc.GetNumberOfPages() % 2 == 1) { pdfDoc.AddNewPage(pageNumber, iTextPageSize.A4); } pdfDoc.Close(); }
private int merge(PdfMerger merger, List <MergeItem> mergeTreeList, int initialPageCount) { int pageCount = initialPageCount; PdfDocument src = null; foreach (MergeItem mi in mergeTreeList) { if (mi.fileItem.ItemType == FILE) { Form1.updateProgressBar(Form1.ProgressBarValue.isIncrement, 1, 0); mi.pageNumber = pageCount; try { src = new PdfDocument(new PdfReader(mi.fileItem.getFullPath)); if (!(KEEP_IMPORT_BOOKMARKS && !ADD_BOOKMARK_FOR_EACH_FILE)) { destPdfOutlines.AddOutline(FILE_MARKER + mi.fileItem.getName()); } merger.Merge(src, 1, src.GetNumberOfPages()); if (src != null && !src.IsClosed()) { logMsgDbLn2("adding file", ("adding (" + src.GetNumberOfPages() + ") pages").PadRight(20) + ":: " + mi.fileItem.getName()); pageCount += src.GetNumberOfPages(); src.Close(); } else { logMsgln(" added(-no-) pages"); } } #pragma warning disable CS0168 // The variable 'ex' is declared but never used catch (Exception ex) #pragma warning restore CS0168 // The variable 'ex' is declared but never used { logMsgFmtln("corrupted PDF found"); if (!CONTINUE_ON_CORRUPT_PDF) { return(-1); } mi.fileItem.ItemType = MISSING; mi.pageNumber = -1; } } if (mi.mergeItems != null) { pageCount = merge(merger, mi.mergeItems, pageCount); if (pageCount < 1) { break; } } } return(pageCount); }