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