2011-08-30 64 views
6

Tengo un documento en formato PDF que tiene campos de formulario que estoy completando programáticamente con C#. Dependiendo de tres condiciones, necesito recortar (eliminar) algunas de las páginas de ese documento.itextsharp trimning pdf páginas del documento

¿Es eso posible?

para la condición 1: Necesito guardar las páginas 1-4, pero eliminar las páginas 5 y 6

para la condición 2: Necesito mantener las páginas 1-4, pero eliminar 5 y 6 mantener

para la condición 3: Necesito mantener las páginas 1-5 pero eliminar 6

Respuesta

5

En lugar de eliminar páginas de un documento, lo que realmente hace es crear un nuevo documento y solo importar las páginas que desea conservar. Debajo hay una aplicación WinForms completa que lo hace (apuntando a iTextSharp 5.1.1.0). El último parámetro para la función removePagesFromPdf es una matriz de páginas para mantener.

El siguiente código funciona sin archivos físicos, pero sería muy fácil de convertir a algo basado en secuencias para que no tenga que escribir en el disco si no lo desea.

using System; 
using System.ComponentModel; 
using System.IO; 
using System.Linq; 
using System.Windows.Forms; 
using iTextSharp.text.pdf; 
using iTextSharp.text; 


namespace Full_Profile1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      //The files that we are working with 
      string sourceFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
      string sourceFile = Path.Combine(sourceFolder, "Test.pdf"); 
      string destFile = Path.Combine(sourceFolder, "TestOutput.pdf"); 

      //Remove all pages except 1,2,3,4 and 6 
      removePagesFromPdf(sourceFile, destFile, 1, 2, 3, 4, 6); 
      this.Close(); 
     } 
     public void removePagesFromPdf(String sourceFile, String destinationFile, params int[] pagesToKeep) 
     { 
      //Used to pull individual pages from our source 
      PdfReader r = new PdfReader(sourceFile); 
      //Create our destination file 
      using (FileStream fs = new FileStream(destinationFile, FileMode.Create, FileAccess.Write, FileShare.None)) 
      { 
       using (Document doc = new Document()) 
       { 
        using (PdfWriter w = PdfWriter.GetInstance(doc, fs)) 
        { 
         //Open the desitination for writing 
         doc.Open(); 
         //Loop through each page that we want to keep 
         foreach (int page in pagesToKeep) 
         { 
          //Add a new blank page to destination document 
          doc.NewPage(); 
          //Extract the given page from our reader and add it directly to the destination PDF 
          w.DirectContent.AddTemplate(w.GetImportedPage(r, page), 0, 0); 
         } 
         //Close our document 
         doc.Close(); 
        } 
       } 
      } 
     } 
    } 
} 
2

Aquí está el código que uso para copiar todo menos la última página de un PDF existente. Todo está en flujos de memoria. La variable pdfByteArray es un byte [] del pdf original obtenido mediante ms.ToArray(). pdfByteArray se sobrescribe con el nuevo PDF.

 PdfReader originalPDFReader = new PdfReader(pdfByteArray); 

     using (MemoryStream msCopy = new MemoryStream()) 
     { 
      using (Document docCopy = new Document()) 
      { 
       using (PdfCopy copy = new PdfCopy(docCopy, msCopy)) 
       { 
       docCopy.Open(); 
       for (int pageNum = 1; pageNum <= originalPDFReader.NumberOfPages - 1; pageNum ++) 
       { 
        copy.AddPage(copy.GetImportedPage(originalPDFReader, pageNum)); 
       } 
       docCopy.Close(); 
       } 
      } 

      pdfByteArray = msCopy.ToArray(); 
14

Utilice PdfReader.SelectPages() combinado con PdfStamper. El siguiente código usa iTextSharp 5.5.1.

public void SelectPages(string inputPdf, string pageSelection, string outputPdf) 
{ 
    using (PdfReader reader = new PdfReader(inputPdf)) 
    { 
     reader.SelectPages(pageSelection); 

     using (PdfStamper stamper = new PdfStamper(reader, File.Create(outputPdf))) 
     { 
      stamper.Close(); 
     } 
    } 
} 

Luego llame a este método con la selección de página correcta para cada condición.

Condición 1:

SelectPages(inputPdf, "1-4", outputPdf); 

Condición 2:

SelectPages(inputPdf, "1-4,6", outputPdf); 

o

SelectPages(inputPdf, "1-6,!5", outputPdf); 

Condición 3:

SelectPages(inputPdf, "1-5", outputPdf); 

Aquí está el comentario del código fuente de iTextSharp sobre lo que constituye una selección de página. Esto se encuentra en la clase SequenceList que se utiliza para procesar una selección de página:

/** 
* This class expands a string into a list of numbers. The main use is to select a 
* range of pages. 
* <p> 
* The general systax is:<br> 
* [!][o][odd][e][even]start-end 
* <p> 
* You can have multiple ranges separated by commas ','. The '!' modifier removes the 
* range from what is already selected. The range changes are incremental, that is, 
* numbers are added or deleted as the range appears. The start or the end, but not both, can be ommited. 
*/ 
Cuestiones relacionadas