2011-07-11 161 views
5

Estamos utilizando itextsharp para crear un único PDF a partir de múltiples archivos PDF. ¿Cómo inserto una página nueva en un archivo PDF que ya tiene varias páginas en el archivo? Cuando uso Agregar página está sobreescribiendo las páginas existentes y solo guarda la página 1 que fue seleccionada.Insertar página en PDF existente usando itextsharp

Aquí está el código que estoy usando para añadir la página a la PDF existente:

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 <= reader.NumberOfPages; p++) 
       { 
        if (pagesToExtract.FindIndex(s => 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(); 

Respuesta

1

Usted podría utilizar algo como esto, donde src es el IEnumerable<string> de entrada nombres de archivos PDF. Solo asegúrese de que su archivo pdf existente sea una de esas fuentes. La clase PdfConcatenate se encuentra en la última versión de iTextSharp.

 
var result = "combined.pdf"; 
var fs = new FileStream(result, FileMode.Create); 
var conc = new PdfConcatenate(fs, true); 
foreach(var s in src) { 
    var r = new PdfReader(s); 
    conc.AddPages(r); 
} 
conc.Close(); 
+0

Estoy tratando de obtener sólo ciertas páginas de un archivo PDF de origen y añadirlos a un archivo PDF existente. El único problema es que no lo está agregando al PDF existente, sino solo al escribirlo. –

+0

@Rob: por alguna razón no obtuve eso de la pregunta original. ¿Podría reformularse su problema como una necesidad de combinar ciertas (incluidas todas) las páginas de los documentos fuente en un solo archivo? ¿Quiere decir que un PDF existente se convierte en una de esas fuentes con todas las páginas requeridas? –

2

PdfCopy está diseñada para uso con un vacío Document. Debe agregar todo lo que desee, una página a la vez.

La alternativa es usar PdfStamper.InsertPage(pageNum, rectangle) y luego dibujar un PdfImportedPage en esa nueva página.

Tenga en cuenta que PdfImportedPage sólo incluye el contenido de la página, no las anotaciones o información a nivel de documento ("estructura del documento", javascripts a nivel de documento, etc.) que la página puede haber utilizado originalmente ... a menos que utilice una con PdfCopy.

Un Stamper probablemente sería más eficiente y usaría menos código, pero PdfCopy importará toda la información del nivel de página, no solo los contenidos de la página.

Esto podría ser importante, es posible que no. Depende de qué página intente importar.

+0

¡Esta respuesta funciona perfecto en mi caso! Necesitaba agregar 'n' páginas en blanco a un PDF existente. 'PdfStamper.InsertPage' fue el camino. ¡Gracias! – Nicolocodev

3

He probado este código, y funciona para mí, pero no se olvide de hacer algunas validaciones del número de páginas y la existencia de los caminos que utiliza

Aquí está el código:

private static void AppendToDocument(string sourcePdfPath, string outputPdfPath, List<int> 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(); 
    } 
5

Este código funciona. Necesita tener un archivo diferente para generar los resultados.

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<int>(); 
       for (int i = 0; i < pdfReader.NumberOfPages; i++) 
       { 
        pages.Add(i); 
       } 

       pdfReader.SelectPages(pages); 
       pdfConcat.AddPages(pdfReader); 

       pdfReader = new PdfReader(sourceDocumentStream2); 

       pages = new List<int>(); 
       for (int i = 0; i < pdfReader.NumberOfPages; i++) 
       { 
        pages.Add(i); 
       } 

       pdfReader.SelectPages(pages); 
       pdfConcat.AddPages(pdfReader); 

       pdfReader.Close(); 
       pdfConcat.Close(); 
      } 
     } 
    } 
} 
+0

Este código funciona solo necesita corregir un pequeño error para (int i = 0; i

1

Had para igualar el número de páginas con un múltiplo de 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); 
} 
Cuestiones relacionadas