代码之家  ›  专栏  ›  技术社区  ›  Arsiwaldi

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

  •  3
  • Arsiwaldi  · 技术社区  · 7 年前

    我需要将一个文档拆分为几个小文档。例如,如果文档有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();
    }
    

    iText 7,但不工作

    第一个问题
    我发现有 PdfSplitter ,它可以将我的pdf拆分为小pdf。然而,即使是我的测试pdf也有7页,甚至 GetNumberOfPages() 返回数字7,拆分的文档数仅为一个。

    在这个 linked documenation 以某种方式显示了如何拆分文档。然而,我不知道如何制作与上述方法相似的方法- getNextPdfWriter

    第二个问题
    即使我有一个文件,它也是空的。我想知道如何设置合适的编写器来创建正确的pdf。分别介绍如何设置读卡器以读取拆分文档的内容。

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

    问题

    如何在中正确地将文档拆分为小文档。NET core with iText 7

    1 回复  |  直到 7 年前
        1
  •  9
  •   Diego Montania    3 年前

    嗯,这很容易。根据链接文档,我做了以下工作:

    创建自定义拆分器覆盖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");
          }
    }
    

    然后用它来拆分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();
         }
    }
    

    结果是一些PDF。