2013-04-11 5 views
0

Я пытаюсь добавить изображения в существующий PDF, используя следующее.Добавить изображение на страницы PDF с помощью iTextSharp

public static byte[] Append(byte[] inputPdf, params Image[] images) 
{ 
    var ms = new MemoryStream(); 
    ms.Write(inputPdf, 0, inputPdf.Length); 
    ms.Seek(0, SeekOrigin.Begin); 

    using (Document pdf = new Document(iTextSharp.text.PageSize.A4, 10, 10, 10, 10)) 
    using (PdfWriter writer = PdfWriter.GetInstance(pdf, ms)) 
    { 
     pdf.Open(); 
     foreach (var image in images) 
     { 

      var result = pdf.NewPage(); 

      ImageFormat format = image.PixelFormat == PixelFormat.Format1bppIndexed 
       || image.PixelFormat == PixelFormat.Format4bppIndexed 
       || image.PixelFormat == PixelFormat.Format8bppIndexed 
       ? ImageFormat.Tiff 
       : ImageFormat.Jpeg; 
      var pdfImage = iTextSharp.text.Image.GetInstance(image, format); 
      pdfImage.Alignment = Element.ALIGN_CENTER; 
      pdfImage.ScaleToFit(pdf.PageSize.Width, pdf.PageSize.Height); 
      pdf.Add(pdfImage); 
     } 
     pdf.Close(); 
    } 
    ms.Flush(); 
    return ms.GetBuffer(); 
} 

Значение result не используется, я ее отладки. Значение всегда истинно, поэтому страница добавления работает.

В результате PDF-файл того же размера, что и оригинал, но не читается. При открытии я получаю недопустимые ошибки корневого объекта.

Любые предложения?

Благодаря

+0

При работе с существующим PDF вам нужно использовать PdfStamper, см. [Как вставить изображение с iTextSharp в существующий PDF?] (http://stackoverflow.com/questions/583629/how-can-i-insert-an-image-with-itextsharp-in- an-existing-pdf) –

ответ

1

Метод 1 (без PdfStamper)

using (var ms = new MemoryStream()) 
{ 
     var pdf = new PdfReader(inputPdf); 
     var doc = new Document(pdf.GetPageSizeWithRotation(1)); 
     using (var writer = PdfWriter.GetInstance(doc, ms)) 
     { 
      doc.Open(); 

      for (int page = 0; page < pdf.NumberOfPages; page++) 
      { 
       doc.SetPageSize(pdf.GetPageSizeWithRotation(page + 1)); 
       doc.NewPage(); 
       var pg = writer.GetImportedPage(pdf, page + 1); 
       int rotation = pdf.GetPageRotation(page + 1); 
       if (rotation == 90 || rotation == 270) 
        writer.DirectContent.AddTemplate(
         pg, 0, -1f, 1f, 0, 0, pdf.GetPageSizeWithRotation(page).Height); 
       else 
        writer.DirectContent.AddTemplate(pg, 1f, 0, 0, 1f, 0, 0); 
      } 
      foreach (var image in images) 
      { 
       doc.NewPage(); 

       ImageFormat format = image.PixelFormat == PixelFormat.Format1bppIndexed 
            || image.PixelFormat == PixelFormat.Format4bppIndexed 
            || image.PixelFormat == PixelFormat.Format8bppIndexed 
             ? ImageFormat.Tiff 
             : ImageFormat.Jpeg; 
       var pdfImage = iTextSharp.text.Image.GetInstance(image, format); 
       pdfImage.Alignment = Element.ALIGN_CENTER; 
       pdfImage.ScaleToFit(doc.PageSize.Width - 10, doc.PageSize.Height - 10); 
       doc.Add(pdfImage); 
      } 
      doc.Close(); 
      writer.Close(); 
     } 
     ms.Flush(); 
     return ms.GetBuffer(); 
} 

Метод 2 (с использованием PdfStamper)

var pdfReader = new PdfReader(inputPdf); 
using (var ms = new MemoryStream()) 
{ 
     using (var stamp = new PdfStamper(pdfReader, ms)) 
     { 
      foreach (var image in images) 
      { 
       var size = pdfReader.GetPageSize(1); 
       var page = pdfReader.NumberOfPages + 1; 
       stamp.InsertPage(page, pdfReader.GetPageSize(1)); 
       ImageFormat format = image.PixelFormat == PixelFormat.Format1bppIndexed 
            || image.PixelFormat == PixelFormat.Format4bppIndexed 
            || image.PixelFormat == PixelFormat.Format8bppIndexed 
             ? ImageFormat.Tiff 
             : ImageFormat.Jpeg; 
       var pdfImage = iTextSharp.text.Image.GetInstance(image, format); 
       pdfImage.Alignment = Element.ALIGN_CENTER; 
       pdfImage.SetAbsolutePosition(0, size.Height - pdfImage.Height); 
       pdfImage.ScaleToFit(size.Width, size.Height); 
       stamp.GetOverContent(page).AddImage(pdfImage); 
      } 
     } 
     ms.Flush(); 
     return ms.GetBuffer(); 
} 
0

Вы делаете ошибочное предположение, что вы можете клеить байты двух PDF документов вместе.

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

%PDF-1.6 
%âãÏÓ 
1 0 obj << 
... PDF syntax 
%%EOF 

С другой, который выглядит следующим образом:

%PDF-1.6 
%âãÏÓ 
1 0 obj << 
... PDF syntax 
%%EOF 

в результате чего файл, который выглядит следующим образом:

%PDF-1.6 
%âãÏÓ 
1 0 obj << 
... PDF syntax 
%%EOF 
%PDF-1.6 
%âãÏÓ 
1 0 obj << 
... PDF syntax 
%%EOF 

Вы действительно не должны ожидать, что это сработает! Пожалуйста, начните с чтения chapter 6 моей книги и прочитайте о названии PdfStamper. Затем перейдите на этот вопрос: How can I insert an image with iTextSharp in an existing PDF?

+0

Я пытаюсь добавить новые страницы в PDF, а не печать существующих страниц в формате pdf. – Jim

+0

Я знаю, но вам все еще нужен PdfStamper и его метод insertPage() (прочитайте раздел 6.3.4 бесплатной главы). Вы, конечно же, не хотите объединять байты одного файла с байтами другого файла. –

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