如何将PDF文档拆分成小文档

Ars*_*ldi 3 c# pdf itext .net-core itext7

我需要将一个文档拆分成几个小文档。例如,如果文档有 7 页,我需要生成 7 个 pdf。

在 iTextSharp 中,我使用了以下代码,效果很好。但是,在 iText 7 中不可能以相同的方式进行。

iTextSharp 旧代码

var reader = new PdfReader(src);
for (int i = 1; i <= reader.NumberOfPages; i++)
{
    var document = new Document();
    var copy = new PdfCopy(document, new FileStream(result + i + ".pdf", FileMode.Create));
    document.Open();
    copy.AddPage(copy.GetImportedPage(reader, i));
    document.Close();
}
Run Code Online (Sandbox Code Playgroud)

iText 7,但不工作


我发现的第一个问题PdfSplitter,可以将我的 pdf 分成小 pdf。但是,即使我的测试 pdf 也有 7 页,甚至GetNumberOfPages()返回数字 7,拆分文档的数量也只是 1。

在此链接文档中,以某种方式显示了如何拆分文档。但是,我不知道如何制作与上述方法类似的方法-getNextPdfWriter

第二个问题
即使我只有一个文件,它也是空的。我想知道如何设置合适的作者来创建正确的 pdf。分别是如何设置 reader 来读取拆分文档的内容。

string result = outputPath + @"/page00";
using (pdfDocument = new PdfDocument(new PdfReader(pdfPath)))
{

    var splitter = new PdfSplitter(pdfDocument);
    var splittedDocs = splitter.SplitByPageCount(pdfDocument.GetNumberOfPages());

    for (int i = 0; i < pdfDocument.GetNumberOfPages(); i++)
    {
        //how to set reader to read the content of splitted docs. Or how to set writer for splitted doc.
        var pdfDoc = new PdfDocument(new PdfWriter(new FileStream(result + i + ".pdf", FileMode.Create)));
        pdfDoc.Close();
        splittedDocs[i].Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使用 iText 7 在 .NET 核心中正确地将文档拆分为小文档

Ars*_*ldi 7

嗯,这很容易。根据链接的文档,我做了以下事情:

创建自定义拆分器覆盖 PdfSplitter 的功能。

class CustomSplitter : PdfSplitter
{
      private int _order;
      private readonly string _destinationFolder;
    
      public CustomSplitter(PdfDocument pdfDocument, string destinationFolder) : base(pdfDocument)
      {
          _destinationFolder = destinationFolder;
          _order = 0;
      }
    
      protected override PdfWriter GetNextPdfWriter(PageRange documentPageRange)
      {
           return new PdfWriter(_destinationFolder + "splitDocument1_" +  _order++ + ".pdf");
      }
}
Run Code Online (Sandbox Code Playgroud)

然后只需使用它来拆分 PDF 文档。不要忘记关闭拆分的文档。我想指出一件事。 SplitByPageCount- 根据应该拆分的数量需要多少。SplitByPageCount(1)将 PDF 文档拆分为一页。我真的误解了这个方法。

using (var pdfDoc = new PdfDocument(new PdfReader("doc.pdf")))
{
     var outputDir = @"C:\";
     var splitter = new CustomSplitter(pdfDoc, outputDir);
     var splittedDocs = splitter.SplitByPageCount(1);

     foreach (var splittedDoc in splittedDocs)
     {
         splittedDoc.Close();
     }
}
Run Code Online (Sandbox Code Playgroud)

结果是几个pdf。