web-dev-qa-db-fra.com

Divisé PDF iTextsharp en plusieurs PDF

public int SplitAndSave(string inputPath, string outputPath)
    {
        FileInfo file = new FileInfo(inputPath);
        string name = file.Name.Substring(0, file.Name.LastIndexOf("."));

        using (PdfReader reader = new PdfReader(inputPath))
        {

            for (int pagenumber = 1; pagenumber <= reader.NumberOfPages; pagenumber++)
            {
                string filename = pagenumber.ToString() + ".pdf";

                Document document = new Document();
                PdfCopy copy = new PdfCopy(document, new FileStream(outputPath + "\\" + filename, FileMode.Create));

                document.Open();

                copy.AddPage(copy.GetImportedPage(reader, pagenumber));

                document.Close();
            }
            return reader.NumberOfPages;
        }

    }

Je souhaite diviser le fichier PDF en plusieurs fichiers PDF avec un intervalle de 50 pages (Supposons que le fichier PDF compte 400 pages, je veux 8 fichiers PDF). Le code ci-dessus divise chaque page en un pdf. S'il vous plaît, aidez-moi ... J'utilise asp.net avec iTextSharp.

13
Billy

Vous parcourez le pdf et créez un nouveau document à chaque fois que vous avancez d'une page. Vous devrez garder une trace de vos pages afin de ne scinder que toutes les 50 pages. Personnellement, je mettrais cela dans une méthode séparée et l'appellerais de votre boucle. Quelque chose comme ça:

private void ExtractPages(string sourcePDFpath, string outputPDFpath, int startpage,  int endpage)
{
    PdfReader reader = null;
    Document sourceDocument = null;
    PdfCopy pdfCopyProvider = null;
    PdfImportedPage importedPage = null;

    reader = new PdfReader(sourcePDFpath);
    sourceDocument = new Document(reader.GetPageSizeWithRotation(startpage));
    pdfCopyProvider = new PdfCopy(sourceDocument, new System.IO.FileStream(outputPDFpath, System.IO.FileMode.Create));

    sourceDocument.Open();

    for (int i = startpage; i <= endpage; i++)
    {
        importedPage = pdfCopyProvider.GetImportedPage(reader, i);
        pdfCopyProvider.AddPage(importedPage);
    }
    sourceDocument.Close();
    reader.Close();
}

Donc dans votre code original, parcourez votre pdf et appelez la méthode ci-dessus toutes les 50 pages. Vous aurez juste besoin d'ajouter des variables dans votre bloc pour garder une trace des pages de début/fin. 

12
ovaltein
4
RohitWagh

Voici une solution plus courte. N'a pas testé quelle méthode a la meilleure performance. 

private void ExtractPages(string sourcePDFpath, string outputPDFpath, int startpage, int endpage)
{
  var pdfReader = new PdfReader(sourcePDFpath);
  try
  {
    pdfReader.SelectPages($"{startpage}-{endpage}");
    using (var fs = new FileStream(outputPDFpath, FileMode.Create, FileAccess.Write))
    {
      PdfStamper stamper = null;
      try
      {
        stamper = new PdfStamper(pdfReader, fs);
      }
      finally
      {
        stamper?.Close();
      }
    }
  }
  finally
  {
    pdfReader.Close();
  }
}
0
MovGP0