使用 iTextsharp 将 PDF 拆分为多个 PDF

本文关键字:PDF 拆分 使用 iTextsharp | 更新日期: 2023-09-27 18:31:12

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

我想将 PDF 拆分为多个 PDF 以 50 页间隔。(如果有 400 页的 PDF,我想要 8 个 pdf)。上面的代码将每个页面拆分为pdf。请帮帮我...我正在将 asp.net 与iTextSharp一起使用。

使用 iTextsharp 将 PDF 拆分为多个 PDF

每次前进页面时,您都会循环浏览 pdf 并创建一个新文档。 您需要跟踪您的页面,以便仅每 50 页执行一次拆分。 就个人而言,我会将其放在一个单独的方法中,并从您的循环中调用它。 像这样:

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

因此,在您的原始代码中循环访问您的 pdf,每 50 页调用上述方法。 您只需要在块中添加变量即可跟踪开始/结束页面。

这将

很有用。 非常符合您的要求

http://www.codeproject.com/Articles/559380/SplittingplusandplusMergingplusPdfplusFilesplusinp

这是一个较短的解决方案。尚未测试哪种方法具有更好的性能。

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

我遇到了同样的问题,但想将iText7用于.NET。在这个具体案例中,这段代码对我有用:

1st:实现自己的PdfSplitter

 public class MyPdfSplitter : PdfSplitter
 {
    private readonly string _destFolder;
    private int _pageNumber;
    public MyPdfSplitter(PdfDocument pdfDocument, string destFolder) : base(pdfDocument)
    {
        _destFolder = destFolder;
    }
    protected override PdfWriter GetNextPdfWriter(PageRange documentPageRange)
    {
        _pageNumber++;
        return new PdfWriter(Path.Combine(_destFolder, $"p{_pageNumber}.pdf"));
    }
}

第二:使用它来拆分您的PDF

using (var pdfDoc = new PdfDocument(new PdfReader(filePath)))
{
    var splitDocuments = new MyPdfSplitter(pdfDoc, targetFolder).SplitByPageCount(1);
    foreach (var splitDocument in splitDocuments)
    {
        splitDocument.Close();
    }
 }

从 Java 迁移的代码示例:https://itextpdf.com/en/resources/examples/itext-7/splitting-pdf-file

希望这对其他人有帮助!