使用itextsharp将页面插入现有PDF

我们使用itextsharp从多个PDF文件创建单个PDF。 如何将新页面插入到文件中已有多个页面的PDF文件中? 当我使用添加页面时,它会覆盖现有页面,只保存所选的1页。

以下是我用于将页面添加到现有PDF的代码:

PdfReader reader = new PdfReader(sourcePdfPath); Document document = new Document(reader.GetPageSizeWithRotation(1)); PdfCopy pdfCopy = new PdfCopy(document, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create)); MemoryStream memoryStream = new MemoryStream(); PdfWriter writer = PdfWriter.GetInstance(document, memoryStream); document.AddDocListener(writer); document.Open(); for (int p = 1; p  s == p) == -1) continue; document.SetPageSize(reader.GetPageSize(p)); document.NewPage(); PdfContentByte cb = writer.DirectContent; PdfImportedPage pageImport = writer.GetImportedPage(reader, p); int rot = reader.GetPageRotation(p); if (rot == 90 || rot == 270) { cb.AddTemplate(pageImport, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(p).Height); } else { cb.AddTemplate(pageImport, 1.0F, 0, 0, 1.0F, 0, 0); } pdfCopy.AddPage(pageImport); } pdfCopy.Close(); 

这段代码有效。 您需要使用其他文件来输出结果。

 private static void AppendToDocument(string sourcePdfPath1, string sourcePdfPath2, string outputPdfPath) { using (var sourceDocumentStream1 = new FileStream(sourcePdfPath1, FileMode.Open)) { using (var sourceDocumentStream2 = new FileStream(sourcePdfPath2, FileMode.Open)) { using (var destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create)) { var pdfConcat = new PdfConcatenate(destinationDocumentStream); var pdfReader = new PdfReader(sourceDocumentStream1); var pages = new List(); for (int i = 0; i < pdfReader.NumberOfPages; i++) { pages.Add(i); } pdfReader.SelectPages(pages); pdfConcat.AddPages(pdfReader); pdfReader = new PdfReader(sourceDocumentStream2); pages = new List(); for (int i = 0; i < pdfReader.NumberOfPages; i++) { pages.Add(i); } pdfReader.SelectPages(pages); pdfConcat.AddPages(pdfReader); pdfReader.Close(); pdfConcat.Close(); } } } } 

我已经尝试过这段代码了,它对我有用,但不要忘记对页数和你使用的路径的存在进行一些validation

这是代码:

 private static void AppendToDocument(string sourcePdfPath, string outputPdfPath, List neededPages) { var sourceDocumentStream = new FileStream(sourcePdfPath, FileMode.Open); var destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create); var pdfConcat = new PdfConcatenate(destinationDocumentStream); var pdfReader = new PdfReader(sourceDocumentStream); pdfReader.SelectPages(neededPages); pdfConcat.AddPages(pdfReader); pdfReader.Close(); pdfConcat.Close(); } 

你可以使用这样的东西,其中src是输入pdf文件名的IEnumerable 。 只需确保您现有的pdf文件是其中一个来源。 PdfConcatenate类位于最新的iTextSharp版本中。

 var result =“combined.pdf”;
 var fs = new FileStream(result,FileMode.Create);
 var conc = new PdfConcatenate(fs,true);
 foreach(src中的var s){
     var r = new PdfReader(s);
     conc.AddPages(R);
 }
 conc.Close();

PdfCopy适用于空Document 。 你应该添加你想要的一切,一次一页。

另一种方法是使用PdfStamper.InsertPage(pageNum, rectangle) ,然后将PdfImportedPage绘制到该新页面上。

请注意, PdfImportedPage仅包含页面内容,而不包括页面最初可能使用的注释或文档级信息(“文档结构”,文档级javascripts等)… 除非您使用PdfCopy

压模可能更有效并且使用更少的代码,但PdfCopy将导入所有页面级信息,而不仅仅是页面的内容。

这可能很重要,也可能不重要。 这取决于您尝试导入的页面。

不得不以4的倍数平均页数:

 private static void AppendToDocument(string sourcePdfPath) { var tempFileLocation = Path.GetTempFileName(); var bytes = File.ReadAllBytes(sourcePdfPath); using (var reader = new PdfReader(bytes)) { var numberofPages = reader.NumberOfPages; var modPages = (numberofPages % 4); var pages = modPages == 0 ? 0 : 4 - modPages; if (pages == 0) return; using (var fileStream = new FileStream(tempFileLocation, FileMode.Create, FileAccess.Write)) { using (var stamper = new PdfStamper(reader, fileStream)) { var rectangle = reader.GetPageSize(1); for (var i = 1; i <= pages; i++) stamper.InsertPage(numberofPages + i, rectangle); } } } File.Delete(sourcePdfPath); File.Move(tempFileLocation, sourcePdfPath); }