itextsharp обрезка страниц pdf-документа

У меня есть pdf-документ с полями формы, которые я программно заполняю с помощью c#. В зависимости от трех условий мне нужно обрезать (удалить) некоторые страницы из этого документа.

это возможно сделать?

для условия 1: мне нужно сохранить страницы 1-4, но удалить страницы 5 и 6

для Условия 2: мне нужно сохранить страницы 1-4, но удалить 5 и сохранить 6

для Условия 3: мне нужно сохранить страницы 1-5, но удалить 6

3 ответов


removePagesFromPdf - это массив страниц для хранения.

код ниже работает с физическими файлами, но было бы очень легко конвертировать в что-то на основе потоков, так что вам не нужно писать на диск, если вы не хотите к.

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();
                    }
                }
            }
        }
    }
}

Используйте PdfReader.SelectPages () в сочетании с PdfStamper. Код ниже использует 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();
        }
    }
}

затем вы вызываете этот метод с правильным выбором страницы для каждого условия.

Условие 1:

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

Условие 2:

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

или

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

условие 3:

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

вот комментарий из исходного кода iTextSharp о том, что составляет выбор страницы. Это находится в классе SequenceList, который используется для обработки выбора страницы:

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

вот код, который я использую для копирования всех, кроме последней страницы существующего PDF. Все в потоках памяти. Переменная pdfByteArray - байт [] исходного pdf-файла, полученного с помощью ms.ToArray (). pdfByteArray перезаписывается новым 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();