2013-09-18 5 views
0

Как сжать нарезанные pdf-документы в C# .. ??Сжатие разделенных PDF-файлов

У меня есть документ в формате pdf. Я нарезаю этот документ. если исходный формат pdf-документа размером 10 мб после размера среза увеличивается до 15 мб. вот почему мне приходится сжимать нарезанный документ. это любой способ сжать .. ?? пожалуйста, помогите мне ..

public int ExtractPages(string sourcePdfPath, string DestinationFolder) 
     { 
      int p = 0, initialcount = 0; 
      try 
      { 
       iTextSharp.text.Document document; 
       iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(new iTextSharp.text.pdf.RandomAccessFileOrArray(sourcePdfPath), new ASCIIEncoding().GetBytes("")); 

      if (!Directory.Exists(DestinationFolder)) 
      { 
       Directory.CreateDirectory(DestinationFolder); 
      } 
      else 
      { 
       DirectoryInfo di = new DirectoryInfo(DestinationFolder); 
       initialcount = di.GetFiles("*.pdf", SearchOption.AllDirectories).Length; 
      } 

      for (p = 1; p <= reader.NumberOfPages; p++) 
      { 
       using (MemoryStream memoryStream = new MemoryStream()) 
       { 
        document = new iTextSharp.text.Document(); 
        iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, memoryStream); 
        writer.SetPdfVersion(iTextSharp.text.pdf.PdfWriter.PDF_VERSION_1_2); 
        writer.CompressionLevel = iTextSharp.text.pdf.PdfStream.BEST_COMPRESSION; 
        writer.SetFullCompression(); 
        document.SetPageSize(reader.GetPageSize(p)); 
        document.NewPage(); 
        document.Open(); 
        document.AddDocListener(writer); 
        iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent; 
        iTextSharp.text.pdf.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); 
        } 
        document.Close(); 
        document.Dispose(); 
        File.WriteAllBytes(DestinationFolder + "/" + p + ".pdf", memoryStream.ToArray()); 
       } 
      } 
      reader.Close(); 
      reader.Dispose(); 
     } 
     catch 
     { 
     } 
     finally 
     { 
      GC.Collect(); 
     } 



     if (initialcount > (p - 1)) 
     { 
      for (int k = (p - 1) + 1; k <= initialcount; k++) 
      { 
       try 
       { 
        File.Delete(DestinationFolder + "/" + k + ".pdf"); 
       } 
       catch 
       { 
       } 
      } 
     } 

     return p - 1; 
    } 
+0

* вот почему я должен сжать нарезанный документ * - Нет, поэтому вам следует выбросить свой код и использовать iText (Sharp), поскольку он предназначен для использования. То есть используйте 'Pdf [Smart] Copy' или даже' PdfStamper', применяемый к 'PdfReader', для которого вы вызвали метод' selectPages'. – mkl

+0

дать решение .. ?? –

+0

Я не знаю, как использовать itextsharp –

ответ

0

Прежде всего, вы не должны использовать PdfWriter с GetImportedPage и его непосредственного содержания с AddTemplate для задачи, как, что под рукой. Вместо этого посмотрите на Webified iTextSharp ExamplesiText in Action — 2nd Edition.

Там вы найдете образец Burst.cs с центральным шифром

PdfReader reader = new PdfReader(pdf); 
// loop over all the pages in the original PDF 
int n = reader.NumberOfPages;  
for (int i = 0; i < n; i++) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     // We'll create as many new PDFs as there are pages 
     using (Document document = new Document()) 
     { 
      using (PdfCopy copy = new PdfCopy(document, ms)) 
      { 
       document.Open(); 
       copy.AddPage(copy.GetImportedPage(reader, i + 1)); 
      } 
     } 
     // store ms.ToArray() somewhere 
    } 
} 

(я удалил некоторые ZIP-файл упаковка этих webified образцы используют.)

Как вы видите, не нужно больше, чтобы иметь дело с вращение страницы или что-то еще.

Теперь, все сказанное, сумма размеров отдельных файлов, скорее всего, будет больше размера исходного файла. В конце концов, в исходных файлах ресурсы могут быть разделены. E, g, шрифт, используемый на всех страницах, требуется только один раз, когда в разделенных документах шрифт должен быть встроен в каждый отдельный документ со страницей, на которой используется этот шрифт.

PS: Если важно сохранить метаинформацию, вы можете вместо этого использовать PdfReader.selectPages и PdfStamper. Для этого у меня есть только Java код:

for (int i = 1; i <= TEST_FILE_PAGES; i++) 
{ 
    FileOutputStream fos = new FileOutputStream(String.format("%03d.pdf", i)); 
    PdfReader reader = new PdfReader(TEST_FILE); 
    reader.selectPages(Collections.singletonList(i)); 
    PdfStamper stamper = new PdfStamper(reader, fos); 
    stamper.close(); 
    fos.close(); 
} 

Это сохраняет PDF метаинформацию и, следовательно, может быть более кстати в зависимости от ваших требований. Это намного медленнее, хотя, поскольку для каждой страницы экспортируется содержимое PdfReader, и поэтому необходимо перечитать для экспорта следующей страницы.