How can I combine multiple PDF files excluding page breaks using iTextSharp?

前端 未结 2 1573

I wonder if anyone has done this with iTextSharp, but I would like to combine multiple PDF files into one but leave the page breaks out. For example, I would like to create

2条回答
  •  再見小時候
    2020-12-04 01:45

    For those of you who want the above code in C#, here you go.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using iTextSharp.text;
    using iTextSharp.text.pdf;
    using iTextSharp.text.pdf.parser;
    
    namespace Test.WebService.Support {
    
      public class PDFMerge {
    
        private Rectangle PageSize;
        private float TopMargin;
        private float BottomMargin;
        private float Gap;
        private Document Document = null;
        private PdfWriter Writer = null;
        private float YPosition = 0;
    
        public PDFMerge(Rectangle size, float top, float bottom, float gap) {
          this.PageSize = size;
          this.TopMargin = top;
          this.BottomMargin = bottom;
          this.Gap = gap;
        } // PDFMerge
    
        public void Merge(MemoryStream outputStream, List inputs) {
          try {
            this.OpenDocument(outputStream);
    
            foreach (PdfReader reader in inputs) {
              this.Merge(reader);
            }
          } finally {
            this.CloseDocument();
          }
        } // Merge
    
        private void Merge(PdfReader reader) {
          PdfReaderContentParser parser = new PdfReaderContentParser(reader);
    
          for (int p = 1; p <= reader.NumberOfPages; p++) {
            this.Merge(reader, parser, p);
          }
        } // Merge
    
        private void Merge(PdfReader reader, PdfReaderContentParser parser, int pageIndex) {
          TextMarginFinder Finder = parser.ProcessContent(pageIndex, new TextMarginFinder());
          Rectangle PageSizeToImport = reader.GetPageSize(pageIndex);
          float HeightToImport = Finder.GetHeight();
          float MaxHeight = PageSize.Height - TopMargin - BottomMargin;
    
          if (HeightToImport > MaxHeight) {
            throw new ArgumentException(string.Format("Page {0} content too large; height: {1}, limit: {2}.", pageIndex, HeightToImport, MaxHeight));
          }
    
          if (HeightToImport > YPosition - PageSize.GetBottom(BottomMargin)) {
            this.NewPage();
          } else if (!Writer.PageEmpty) {
            HeightToImport += Gap;
          }
    
          YPosition -= HeightToImport;
    
          PdfImportedPage ImportedPage = Writer.GetImportedPage(reader, pageIndex);
          Writer.DirectContent.AddTemplate(ImportedPage, 0, YPosition - (Finder.GetLly() - PageSizeToImport.Bottom));
        } // Merge
    
        private void OpenDocument(MemoryStream outputStream) {
          Document Document = new Document(PageSize, 36, 36, this.TopMargin, BottomMargin);
          PdfWriter Writer = PdfWriter.GetInstance(Document, outputStream);
          Document.Open();
          this.Document = Document;
          this.Writer = Writer;
          this.NewPage();
        } // OpenDocument
    
        private void CloseDocument() {
          try {
            Document.Close();
          } finally {
            this.Document = null;
            this.Writer = null;
            this.YPosition = 0;
          }
        } // CloseDocument
    
        private void NewPage() {
          Document.NewPage();
          YPosition = PageSize.GetTop(TopMargin);
        } // NewPage
    
      }
    }
    

提交回复
热议问题