2017-01-05 7 views
0

Следующий код используется для объединения нескольких файлов в формате PDF в один файлITextSharp слиты размер Pdf увеличился

public byte[] MergePdfFiles(IEnumerable<byte[]> files) 
{ 
    using (var stream = new MemoryStream()) 
    { 
     var pdfDoc = new iTextSharp.text.Document(); 
     var pdf = new PdfCopy(pdfDoc, stream); 
     pdf.SetMergeFields(); 

     pdfDoc.Open(); 

     foreach (var file in files) 
     { 
      try 
      { 
       pdf.AddDocument(new PdfReader(file)); 
      } 
      catch (InvalidPdfException ex) 
      { 
       _loggingServiceClient.Log(LogLevel.Error, ex); 
       throw; 
      } 
     } 

     pdfDoc.Close(); 

     return stream.GetBuffer(); 
    } 
} 

код работает отлично, НО генерируемый размер файла почти в два раза превышает общий размер всех присоединяемых файлов. Я пытаюсь добавить некоторые инструкции сжатия, такие как pdf.CompressionLevel = PdfStream.BEST_COMPRESSION; и pdf.SetFullCompression(); без каких-либо успехов.

Обратите внимание, что выполнение простого saveAs в acrobat reader из сгенерированного файла приводит к новому файлу с приличным размером (объединенный размер каждого объединенного файла).

Я также пробовал другие способы слияния файла, например, используя метод addPage, который в конечном итоге тот же.

ответ

0

Пожалуйста, дайте это попробовать:

public byte[] MergePdfFiles(IEnumerable<byte[]> files) 
{ 
    using (var stream = new MemoryStream()) 
    { 
     var pdfDoc = new iTextSharp.text.Document(); 
     var pdf = new PdfSmartCopy(pdfDoc, stream); 
     pdf.SetMergeFields(); 

     pdfDoc.Open(); 

     foreach (var file in files) 
     { 
      try 
      { 
       pdf.AddDocument(new PdfReader(file)); 
      } 
      catch (InvalidPdfException ex) 
      { 
       _loggingServiceClient.Log(LogLevel.Error, ex); 
       throw; 
      } 
     } 

     pdfDoc.Close(); 

     return stream.GetBuffer(); 
    } 
} 

В случае, если вы не сразу увидеть разницу с вашим собственным кодом: Я изменил PdfCopy на PdfSmartCopy. Если это не помогает (наряду с использованием полного сжатия), очень мало можно сделать. Основная причина, вероятно, в том, что iText не может объединить подмножества шрифтов разных файлов в один новый шрифт (который является одним из трюков, используемых Acrobat для уменьшения размера файла).