2013-09-23 54 views
1

如何切片在C#中的pdf文檔..這裏是我的切片代碼,但在切片總大小後切片10 MB的pdf文檔是20 MB如何減少切片時的切片文件?請給出一個切片和壓縮的好方法切片PDF文檔

public int ExtractPages(string sourcePdfPath) 
    { 
     int p = 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(sourcePdfPath.ToLower().Replace(".pdf", ""))) 
      { 
       Directory.CreateDirectory(sourcePdfPath.ToLower().Replace(".pdf", "")); 
      } 
      else 
      { 
       Directory.Delete(sourcePdfPath.ToLower().Replace(".pdf", ""), true); 
       Directory.CreateDirectory(sourcePdfPath.ToLower().Replace(".pdf", "")); 
      } 

      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(sourcePdfPath.ToLower().Replace(".pdf", "") + "/" + p + ".pdf", memoryStream.ToArray()); 
       } 
      } 
      reader.Close(); 
      reader.Dispose(); 
     } 
     catch 
     { 
     } 
     finally 
     { 
      GC.Collect(); 
     } 
     return p - 1; 
+0

如果我正確讀取了您的代碼,那麼您將50頁的PDF分成50個具有相同內容的單頁PDF,對吧?你爲什麼期望這個減小尺寸?除了內容之外,每個PDF文件都有一些開銷,只是在您的情況下,開銷與數據一樣多。 (如果單個頁面上的內容足夠簡單,這可能是可能的。) – millimoose

+0

是的..在切片後,我必須保存原始文件和服務器中的切片文件,然後如果我在切片後切片50 MB文件,會佔用太多空間將是110 MB這就是爲什麼我必須壓縮切片的pdf文檔 –

+0

你可以把它們放到'.zip'檔案中嗎?這可能會擺脫冗餘開銷。另外,如果空間是你的優先選擇,爲什麼要分割文件呢?只需按需提取單頁。 (空間是一個優先事項?200%的爆炸看起來很可怕,但存儲是相當便宜。) – millimoose

回答

0

PDF以資源的概念運作。文檔中的任何耗費大量內存的對象通常被認爲是可以在文檔中共享的資源。可共享資源的類型是字體,圖像,頁面模板(表單 - 不是AcroForms),顏色空間,圖形狀態對象,模式和過程集。如果我在第1,2,3和4頁使用籃球過度擴張的字體,則只需要在該文件中嵌入一個過度擴張的籃球。

當您將文檔分成4個不同的頁面時,iText將完成您要求的操作:將字體嵌入到每個文件中。

由於字體通常很大,所以這是導致文件看起來很容易膨脹的最可能原因。

如果您希望您的文檔在任何地方正確渲染,這是正確的。

這並不是說沒有選擇。例如,如果iText足夠聰明,它可以爲每個頁面生成一個字體子集 - 換句話說,分析您的字體使用情況,並且只嵌入實際使用的字體部分。

您可能也可以完全刪除字體嵌入。只要您將度量標準和字體描述符放在後面,Acrobat就會很難爲您生成等效字體,如果目標系統上可以使用正確的字體,但如果文檔使用深奧字體,那麼祝您好運那 - 你的最終用戶會看到一個看起來完全錯誤的文檔。