itextsharp coupe les pages d’un document pdf

J’ai un document pdf qui contient des champs de formulaire que je remplis par programme avec c #. En fonction de trois conditions, je dois couper (supprimer) certaines pages de ce document.

Est-ce possible de faire?

pour la condition 1: je dois conserver les pages 1 à 4 mais supprimer les pages 5 et 6

pour la condition 2: je dois garder les pages 1-4 mais supprimer 5 et garder 6

pour la condition 3: je dois conserver les pages 1-5 mais supprimer 6

Au lieu de supprimer des pages d’un document, vous créez en réalité un nouveau document et importez uniquement les pages que vous souhaitez conserver. Vous trouverez ci-dessous une application WinForms complète qui fonctionne de la sorte (en ciblant iTextSharp 5.1.1.0). Le dernier paramètre de la fonction removePagesFromPdf est un tableau de pages à conserver.

Le code ci-dessous fonctionne à partir de fichiers physiques mais il serait très facile de convertir en quelque chose basé sur des stream afin que vous n’ayez pas à écrire sur le disque si vous ne le souhaitez pas.

 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 ssortingng sourceFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); ssortingng sourceFile = Path.Combine(sourceFolder, "Test.pdf"); ssortingng 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(Ssortingng sourceFile, Ssortingng 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(); } } } } } } 

Utilisez PdfReader.SelectPages () associé à PdfStamper. Le code ci-dessous utilise iTextSharp 5.5.1.

 public void SelectPages(ssortingng inputPdf, ssortingng pageSelection, ssortingng outputPdf) { using (PdfReader reader = new PdfReader(inputPdf)) { reader.SelectPages(pageSelection); using (PdfStamper stamper = new PdfStamper(reader, File.Create(outputPdf))) { stamper.Close(); } } } 

Ensuite, vous appelez cette méthode avec la sélection de page correcte pour chaque condition.

Condition 1:

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

Condition 2:

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

ou

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

Condition 3:

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

Voici le commentaire du code source iTextSharp sur ce qui constitue une sélection de page. C’est dans la classe SequenceList qui est utilisée pour traiter une sélection de page:

 /** * This class expands a ssortingng into a list of numbers. The main use is to select a * range of pages. * 

* The general systax is:
* [!][o][odd][e][even]start-end *

* 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. */

Voici le code que j’utilise pour copier tout sauf la dernière page d’un PDF existant. Tout est dans les stream de mémoire. La variable pdfByteArray est un octet [] du pdf original obtenu avec ms.ToArray (). pdfByteArray est écrasé avec le nouveau 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();