2011-07-11 1 views
5

Мы используем itextsharp для создания единого PDF-файла из нескольких PDF-файлов. Как вставить новую страницу в PDF-файл с несколькими страницами уже в файле? Когда я использую страницу добавления, она переписывает существующие страницы и сохраняет только 1 страницу, которая была выбрана.Вставить страницу в существующий PDF с помощью itextsharp

Вот код, который я использую, чтобы добавить страницу к существующему PDF:

PdfReader reader = new PdfReader(sourcePdfPath); 
       Document document = new Document(reader.GetPageSizeWithRotation(1)); 
       PdfCopy pdfCopy = new PdfCopy(document, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create)); 
       MemoryStream memoryStream = new MemoryStream(); 
       PdfWriter writer = PdfWriter.GetInstance(document, memoryStream); 
       document.AddDocListener(writer); 
       document.Open(); 

       for (int p = 1; p <= reader.NumberOfPages; p++) 
       { 
        if (pagesToExtract.FindIndex(s => s == p) == -1) continue; 
        document.SetPageSize(reader.GetPageSize(p)); 
        document.NewPage(); 
        PdfContentByte cb = writer.DirectContent; 
        PdfImportedPage pageImport = writer.GetImportedPage(reader, p); 

        int rot = reader.GetPageRotation(p); 
        if (rot == 90 || rot == 270) 
        { 
         cb.AddTemplate(pageImport, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(p).Height); 
        } 
        else 
        { 
         cb.AddTemplate(pageImport, 1.0F, 0, 0, 1.0F, 0, 0); 
        } 

        pdfCopy.AddPage(pageImport); 
       } 

       pdfCopy.Close(); 

ответ

1

Вы могли бы использовать что-то вроде этого, где src является IEnumerable<string> входных Pdf файлов. Просто убедитесь, что ваш существующий pdf-файл является одним из этих источников. Класс PdfConcatenate находится в последней версии iTextSharp.

 
var result = "combined.pdf"; 
var fs = new FileStream(result, FileMode.Create); 
var conc = new PdfConcatenate(fs, true); 
foreach(var s in src) { 
    var r = new PdfReader(s); 
    conc.AddPages(r); 
} 
conc.Close(); 
+0

Я пытаюсь получить только определенные страницы из исходного PDF и добавить их в существующий PDF. Единственная проблема заключается в том, что он не добавляет его в существующий PDF-файл, а только поверх его записи. –

+0

@ Rob: По какой-то причине я не понял этого из первоначального вопроса. Могла ли ваша проблема переформулироваться как необходимость объединить определенные (включая все) страницы из исходных документов в один файл? Это означает, что существующий PDF становится одним из этих источников со всеми требуемыми страницами? –

2

PdfCopy предназначен для использования с пустым Document. Вы должны добавить все, что хотите, по одной странице за раз.

Альтернативой является использование PdfStamper.InsertPage(pageNum, rectangle), а затем нарисовать PdfImportedPage на эту новую страницу.

Обратите внимание, что PdfImportedPage включает только содержимое страницы, а не аннотации или информацию док уровня («Структура документа», JavaScripts док уровня, и т.д.), что страница может быть изначально используется ... , если вы используете один с PdfCopy.

Stamper, вероятно, будет более эффективным и использовать меньше кода, но PdfCopy импортирует всю информацию об уровне страницы, а не только содержимое страницы.

Это может быть важно, возможно, это не так. Это зависит от того, какую страницу вы пытаетесь импортировать.

+0

Этот ответ отлично работает в моем случае! Мне нужно было добавить «n» пустые страницы в существующий PDF. «PdfStamper.InsertPage» был таким. Благодаря! – Nicolocodev

3

Я попробовал этот код, и это работает для меня, но не забудьте сделать некоторые валидации из числа страниц и наличия путей, которые вы используете

вот код:

private static void AppendToDocument(string sourcePdfPath, string outputPdfPath, List<int> neededPages) 
    { 

     var sourceDocumentStream = new FileStream(sourcePdfPath, FileMode.Open); 
     var destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create); 
     var pdfConcat = new PdfConcatenate(destinationDocumentStream); 

     var pdfReader = new PdfReader(sourceDocumentStream); 
     pdfReader.SelectPages(neededPages); 
     pdfConcat.AddPages(pdfReader); 

     pdfReader.Close(); 
     pdfConcat.Close(); 
    } 
5

Этот код работает. Для вывода результатов нужно иметь другой файл.

private static void AppendToDocument(string sourcePdfPath1, string sourcePdfPath2, string outputPdfPath) 
{ 
    using (var sourceDocumentStream1 = new FileStream(sourcePdfPath1, FileMode.Open)) 
    { 
     using (var sourceDocumentStream2 = new FileStream(sourcePdfPath2, FileMode.Open)) 
     { 
      using (var destinationDocumentStream = new FileStream(outputPdfPath, FileMode.Create)) 
      { 
       var pdfConcat = new PdfConcatenate(destinationDocumentStream); 
       var pdfReader = new PdfReader(sourceDocumentStream1); 

       var pages = new List<int>(); 
       for (int i = 0; i < pdfReader.NumberOfPages; i++) 
       { 
        pages.Add(i); 
       } 

       pdfReader.SelectPages(pages); 
       pdfConcat.AddPages(pdfReader); 

       pdfReader = new PdfReader(sourceDocumentStream2); 

       pages = new List<int>(); 
       for (int i = 0; i < pdfReader.NumberOfPages; i++) 
       { 
        pages.Add(i); 
       } 

       pdfReader.SelectPages(pages); 
       pdfConcat.AddPages(pdfReader); 

       pdfReader.Close(); 
       pdfConcat.Close(); 
      } 
     } 
    } 
} 
+0

Этот код работает только для исправления небольшой ошибки для (int i = 0; i

1

Если бы выравнивать количество страниц с кратным 4:

private static void AppendToDocument(string sourcePdfPath) 
{ 
    var tempFileLocation = Path.GetTempFileName(); 
    var bytes = File.ReadAllBytes(sourcePdfPath); 

    using (var reader = new PdfReader(bytes)) 
    { 
     var numberofPages = reader.NumberOfPages; 
     var modPages = (numberofPages % 4); 
     var pages = modPages == 0 ? 0 : 4 - modPages; 

     if (pages == 0) 
      return; 

     using (var fileStream = new FileStream(tempFileLocation, FileMode.Create, FileAccess.Write)) 
     { 
      using (var stamper = new PdfStamper(reader, fileStream)) 
      { 
       var rectangle = reader.GetPageSize(1); 
       for (var i = 1; i <= pages; i++) 
        stamper.InsertPage(numberofPages + i, rectangle); 
      } 
     } 
    } 

    File.Delete(sourcePdfPath); 
    File.Move(tempFileLocation, sourcePdfPath); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^